ssh登录的认证方式

ssh登录的认证方式,第1张

SH登录里面Keyboard Interactive认证方式

在对 SSH 有了一个初步的认识之后,我们来看看 SSH 协议是如何做到数据的安全通信。首先来看下 SSH 协议的主要架构:

图 2. SSH 协议的构成

传输层协议: 通常运行在 TCP/IP 的上层,是许多安全网络服务的基础,提供了数据加密、压缩、服务大歼器认证以及保证数据的完整性。比如,公共密钥算法、对称加密算法、消息验证算法等。

用户认证协议:运行在 SSH 协议的传输层之上,用来检测客户端的验证方式是否合法。

连接协议:运行在用户认证层之上,提供了交互登录会话、远程命令的执行、转发 TCP/IP 连接等功能,给数据通讯提供一个安全的,可靠的加密传输信道。

SSH 的应用

在实际的工作中,很多目标机器往往是我们无法直接操作的,这些机器可能是一个槐仿余公司机房的服务器,也可能是一个远在大洋彼岸的客户环境。这时候我们必须要远程登录到目标机器,执行我们需要的操作,这样不仅降低了运营成本,也提高了执行效率。我们常见的远程登录协议有 SSH、Telnet 等。如上文所提到,Telnet 使用的是明文传输,这样对别有用心的“中间人”来说就有了可乘之机,相对 Telnet 协议,SSH 协议的安全性就高了很多。这样的特性,也使得 SSH 协议迅速被推广,很多的大型项目中都或多或少的使用到了这个协议。下面本文主要讨论 SSH 协议中用户认证协议层,并且下文中统一将远程机器称为服务器(Server),本地机器称为客户端 (Client)。

请点击输入图片描述(最多18字)

SSH 是(Secure SHell protocol) 的简写,安全外壳协议(SSH)是一种在不安全网络上提供安全远程登录及其它安全网络服务的协议。

OpenSSH 是SSH (Secure SHell)协议的免费开源实现。SSH协议族可以用来进行远程控制,或在计算机之间传送文件。而实现此功能的传统方式,如telnet(终端仿真协议)、 rcp ftp、 rlogin、rsh都是极为不安全的,并且会使用明文传送密码。OpenSSH提供了服务端后台程序和客户端工具,用来加密远程控件和文件传输过程的中的数据,并由此来代替原来的类似服务。

在过去我们使用的rsh和telnet,因为包括登录时的ID和密码数据没有加密就传到网络上,存在安全上的问题。即使在内部网上,也有在因特网上的窃取和篡改等危险性。SSH将包括密码在内的所有数据都已进行了加密处理,可以进行更安全的远程操作。在SSH中,由于协议标准的不同而存在SSH1和SSH2两个不同的版本。SSH2是为了回避SSH1所使用的加密算法的许可证问题而开发的(现在这一许可证问题已经不存在了)。TLES 8中作为安装SSH协议的应用程序采用了开放源码的OpenSSH。OpenSSH与SSH1和SSH2的任何一个协议都能对应,但默认使用SSH2。

SSH 主要有三部分组成:

同时SSH协议框架中还为许多高层的网络安全应用协议提供扩展的支持。它们之间的层次关系可以用如下图来表示:

对于SSH这样以提供安全通讯为目标的协议,其中必不可少的就是一套完备的密钥机制。由于SSH协议是面向互联网网络中主机之间的互访与信息交换,所以主机密钥成为基本的密钥机制。也就是说,SSH协议要求每一个使用本协议的主机都必须至少有一个自己的主机密钥对,服务方通过对客户方主机密钥的认证之后,才能允许其连接请求。一个主机可以使用多个密钥,针对不同的密钥算法而拥有不同的密钥,但是至少有一种是必备的,即通过 DSS算法产生的密钥。关于DSS算法,请参考 FIPS-186 文档.SSH协议关于主机密钥认证的管理方案有两种,如下图所示:

每一个主机都必须有自己的主机密钥,密钥可以有多对,每一对主机密钥对包括公开密钥和私有密钥。在实际应用过程中怎样使用这些密钥,并依赖它们来实现安全特性呢?如上图所示,SSH协议框架中提出了两种方案。

在第一种方案中,主机将自己的公用密钥分发给相关的客户机,客户机在访问主机时则使用该主机的公开密钥来加密数据,主机则使用自己的私有密钥来解密数据,从而实现主机密钥认证,确定客户机的可靠身份。在图2(a)中可以看到,用户从主机A上发起操作,去访问,主机B和主机C,此时,A成为客户机,它必须事先配置主机B和主机C的公开密钥,在访问的时候根据主机名来查找相应的公开密钥。对于被访问主机(也就是服务器端)来说则只要保证安全地存储自己的私有密钥就可以了。 

在第二种方案中,存在一个密钥认证中心,所有系统中提供服务的主机都将自己的公开密钥提交给认证中心,而任何作为客户机的主机则只要保存一份认证中心的公开密钥就可以了。在这种模式下,客户机在访问服务器主机之前,还必须向密钥认证中心请求认证,认证之后才能够正确地连接到目的主机上。

很显然,第一种方式比较容易实现,但是客户机关于密钥的维护却是个麻烦事,因为每次变更都必须在客户机上有所体现;第二种方式比较完美地解决管理维护问题,然而这样的模式对认证中心的要求很高,在互联网络上要实现这样的集中认证,单单是权威机构的确定就是个大麻烦,有谁能够什么都能说了算呢?但是从长远的发展来看,在企业应用和商业应用领域,采用中心认证的方案是必要的。

另外,SSH协议框架中还允许对主机密钥的一个折中处理,那就是首次访问免认证。首次访问免认证是指,在某客户机第一次访问主机时,主机不检查主机密钥,而向该客户都发放一个公开密钥的拷贝,这样在以后的访问中则必须使用该密钥,否则会被认为非法而拒绝其访问。

在整个通讯过程中,为实现 SSH的安全连接,服务器端与客户端要经历如下五个阶段:

* 版本号协商阶段,SSH目前包括 SSH1和SSH2两个版本, 双方通过版本协商确定使用的版本

* 密钥和算法协商阶段,SSH支持多种加密算法, 双方根据本端和对端支持的算法,协商出最终使用的算法

* 认证阶段,SSH客户端向服务器端发起认证请求, 服务器端对客户端进行认证

* 会话请求阶段, 认证通过后,客户端向服务器端发送会话请求

* 交互会话阶段 ,会话请求通过后,服务器端和客户端进行信息的交互

Q1: SSH的版本和区别。

SSH2避免了RSA的专利问题,并修补了CRC的缺陷。SSH2用数字签名算法(DSA)和Diffie-Hellman(DH)算法代替RSA来完成对称密钥的交换,用HMAC来代替CRC。同时SSH2增加了AES和Twofish等对称加密算法。

A1: SSH(Secure SHell)到目前为止有两个不兼容的版本——SSH1和SSH2。SSH1又分为1.3和1.5两个版本。SSH1采用DES、3DES、 Blowfish和RC4等对称加密算法保护数据安全传输,而对称加密算法的密钥是通过非对称加密算法(RSA)来完成交换的。SSH1使用循环冗余校验码(CRC)来保证数据的完整性,但是后来发现这种方法有缺陷。

更多内容请参考The SSHv1 Protocol &The SSHv2 Protocol

Q2: 什么是HMAC?

A2: HMAC(Hash Message Authentication Code) ,散列消息鉴别码,基于密钥的Hash算法的认证协议。消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。使用一个密钥生成一个固定大小的小数据块,即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。

Q3: 什么是X11 forwarding?

A3: sh的X11 forwarding特性可以使X client和X server安全地通讯。使用X11 forwarding后,从X client到X Server方向的数据先被送至ssh server,ssh server利用和ssh client的安全通道转发给ssh client,再由ssh client转发给X server,从X server到X client的数据流同理。这里ssh server和ssh client充当了X client和X server间数据的转发器,由于ssh server和X client、ssh client和X server一般在同一台机器上,它们之间是一种安全的进程间通讯,而ssh server和ssh client间的通讯也是安全的,所以X client和X server间的通讯就是安全的。

Q4: 什么是TTY?

A4: 终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。tty是 Teletype的缩写。Teletype是最早出现的一种终端设备,很象电传打字机,是由Teletype公司生产的。设备名放在特殊文件目录/dev/下。

Q5: 简单描述下SSH运行的过程?

SSH(Secure Shell)是常用的安全的远程控制协议,由于之前常用Telnet协议并不安全,目前SSH已经取代它成为远程控制协议中的主流。

OpenSSH是应用SSH协议的开源远程控制软件,除了默认的用户名+密码认证验证方式以外,OpenSSH还可以使用基于秘钥对(key pair)或者基于主机身份(Host-based)的验证方式。

关于如何基于秘钥对进行SSH身份验证网上有非常多的资料,而关于如何基于主机身份进行SSH身份验证的资料则比较混乱,本文就以作者最近的实践为例加以说明。

这次实验共有2台Linux,客户端主机名是mycentos,IP地址是192.168.1.25;服务器端主机名是woocentos7,IP地址是192.168.1.6。

服务器端和客户端都要修改SSH配置文件以支持主机身份验证,服务器端需要修改/etc/ssh/sshd_config文件,将HostbasedAuthentication项改为yes,IgnoreRhosts项改为no;客户端需要修改/etc/ssh/ssh_config文件,将HostbasedAuthentication项改为yes,EnableSSHKeysign项改为yes。服务器端修改配置文件以后,需要重启sshd服务使修改后的配置生效,命令是systemctl restart sshd。

服务器端还需要在/etc/hosts.equiv配置文件中增加客户端的主机名,在root用户的~/.shosts文件中增加客户端的主机名与对应的用户名(root,两项之间用空格隔开),在/etc/ssh/ssh_known_hosts文件中增加客户端的主机公钥信息,格式如下:

mycentos,192.168.1.25 ecdsa-sha2-nistp256 AAAAE2VjZ……KO8WzOJo=

其中“mycentos,192.168.1.25”是客户端的主机名和IP地址(这样不论是通过主机名还是IP地址都可以找到对应的公钥信息),“ecdsa-sha2-nistp256”是公钥类型,“AAAAE2VjZ……KO8WzOJo=”是具体的公钥内容。可以通过执行ssh-keyscan -t ecdsa 192.168.1.25 >>/etc/ssh/ssh_known_hosts命令完成操作。

做完以上的操作,理论上客户端就可以通过验证主机身份的方式用ssh登录服务器端了,不过仍需注意几点:

1、服务器端最好关闭SELinux,如setenforce 0以免影响正常登录,关闭SELinux后如果客户端仍然无法登录,可以重启服务器端sshd服务。注意:不关闭SELinux应该也是可以实现主机认证的功能的,但是因为时间关系,作者并没有再尝试。

2、服务器端和客户端的/etc/hosts文件中应该有对端的主机IP地址解析,以免提示解析错误。

3、服务器端和客户端的用户配置要保持一致。

4、客户端登录时不用添加用户名,使用其他用户登录(非当前Shell用户)时依然会提示输入密码,也就失去了主机认证的意义。

5、客户端登录时可执行ssh -v server_name|server_IP或者ssh -vvvvv server_name|server_IP命令,能够显示登录过程中的详细协商过程和传递参数,对于出现异常时排错非常有用。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/529617.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-06-23
下一篇2023-06-23

发表评论

登录后才能评论

评论列表(0条)

    保存