RHCSA&RHCE(RHCE7)学习深入--SSH

 

SSH

SSH是一种安全的低层传输协议。它提供了强大的加密、加密主机身份验证和完整性保护。

此协议级别中的身份验证是基于主机的;此协议不执行用户身份验证。可以在此协议的基础上设计更高级别的用户身份验证协议。

该协议设计简单灵活,允许参数协商,并尽量减少交互次数。密钥交换算法、公钥算法、对称加密算法、消息认证算法和哈希算法都进行了协商。在大多数环境中,完成密钥交换、服务器身份验证、服务请求和服务请求的接收通知只需要2次交互。最坏的情况是3次交互。

 

OPENSSH

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

OpenSSH支持SSH协议的版本 1.3、1.5、和 2。自从OpenSSH的版本2.9以来,默认的协议是版本2,该协议默认使用RSA密钥。

 

对称加密算法

需要对加密和解密使用相同密钥的加密算法。由于其速度快,对称性加密通常在消息发送方需要加密大量数据时使用。对称性加密也称为密钥加密。

所谓对称,就是采用这种加密方法的双方使用同样的密钥进行加密和解密。密钥是控制加密及解密过程的指令。算法是一组规则,规定如何进行加密和解密。

因此,加密的安全性不仅取决于加密算法本身,密钥管理的安全性更是重要。因为加密和解密都使用同一个密钥,如何把密钥安全地传递到解密者手上就成了必须要解决的问题。

对称加密算法的特点是算法公开、计算量小、加密速度快、加密效率高。

基于“对称密钥”的加密算法主要有DES、TripleDES、AES等。

DES运算速度快、资源消耗较少,但是随着计算机计算能力的增强,DES已经能够在短时间内暴力破解,安全性较低,已不再推荐使用。

由于DES已经能够在短时间内被破解,为了增加DES的强度,将DES重复3次的用来替代DES的分组密码3DES被开发出来,也称为TDEA(Triple Data Encryption Algorithm)。

但是,3DES处理速度不高,除了在一些重视向下兼容性的环境中,很少有新的用途,也逐渐被AES所取代。

AES加解密机制较复杂,综合运用了逐字节替换、平移行、混合列、与轮密钥进行XOR等,其优点在运算速度快、资源消耗少,且安全性高。

然而,当我们使用对称密码进行通信时,仍然存在的一个问题是,我们如何将密钥安全地发送给接收者,为了解决这个问题,非对称加密应运而生。

非对称加密算法

与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(public key)和私有密钥(private key)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

非对称加密与对称加密相比,其安全性更好:对称加密的通信双方使用相同的密钥,如果一方的密钥遭泄露,那么整个通信就会被破解。而非对称加密使用一对密钥,一个用来加密,一个用来解密,而且公钥是公开的,密钥是自己保存的,不需要像对称加密那样在通信之前要先同步密钥。

非对称加密的缺点是加密和解密花费时间长、速度慢,只适合对少量数据进行加密。

在非对称加密中使用的主要算法有:RSA、DSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等。

 

Diffie-Hellman算法

Diffie-Hellman算法是第一个公开密钥算法,早在 1976 年就发现了。其安全性源于在有限域上计算离散对数,比计算指数更为困难。该算法可以使两个用户之间安全地交换一个密钥,但不能用于加密或解密信息。

以下步骤用于交换密钥:C是客户机,S是服务器, p是大的安全素数,g是GF(P)的一个子群的根,q是子群的序号,V_S是S的识别字符串,V_C是C的识别字符串,K_S是S的public host key,I_C是C的KEXINIT消息,I_S是在本部分开始之前交换的S的KEXINIT消息。

1.C生成一个随机数x (1 < x < q)并计算e = g^x mod p,C发送e给S。

2. S生成一个随机数y (0 < y < q)并计算f = g^y mod p,S接收e,并计算K = e^y mod p,H = hash(V_C || V_S || I_C || I_S || K_S || e || f || K) (这些元素按其类型进行编码),并在H上使用它的private host key签名s,S发送(K_S || f || s)给C,签名操作可能需要二个。

3. C验证K_S确实是S的host key(例如,使用证书或本地数据库)。还允许C不经核实而接受钥匙;但是,这样做将造成协议不安全不能防范主动攻击(但可能是合乎需要的,在许多环境中短期的实际原因)。C计算K = f^x mod p,H = hash(V_C || V_S || I_C || I_S || K_S || e || f || K) 并在H上验证签名s。

因为:K= e^y mod p=(g^x mod p)^y mod p=(g^x)^y mod p=(g^y)^x mod p

=(g^y mod p)^x mod p=f^x mod p

K即为生成的共享密钥。

不在[1,p-1]范围内的“e”或“f”的值不得由任何一方发送或接受。如果违反此条件,则密钥交换失败。

 

diffie-hellman-group1-sha1

“Diffie-Hellman-group1-SHA 1”方法指定Diffie-Hellman密钥交换使用SHA-1为散列和Oakley Group 2[RFC 2409](1024位MODP组)。

 

diffie-hellman-group14-sha1

“Diffie-Hellman-group14-SHA 1”方法指定Diffie-Hellman密钥交换使用SHA-1为散列和Oakley Group 14[RFC 3526](2048位MODP组)。

 

SSH组成

SSH 主要有三部分组成:

传输层协议 [SSH-TRANS] 提供了服务器认证,保密性及完整性。此外它有时还提供压缩功能。 SSH-TRANS 通常运行在 TCP/IP连接上,也可能用于其它可靠数据流上。 SSH-TRANS 提供了强力的加密技术、密码主机认证及完整性保护。该协议中的认证基于主机,并且该协议不执行用户认证。更高层的用户认证协议可以设计为在此协议之上。

用户认证协议 [SSH-USERAUTH] 用于向服务器提供客户端用户鉴别功能。它运行在传输层协议 SSH-TRANS 上面。当 SSH-USERAUTH 开始后,它从低层协议那里接收会话标识符(从第一次密钥交换中的交换哈希H)。会话标识符唯一标识此会话并且适用于标记以证明私钥的所有权。SSH-USERAUTH 也需要知道低层协议是否提供保密性保护。

连接协议 [SSH-CONNECT] 将多个加密隧道分成逻辑通道。它运行在用户认证协议上。它提供了交互式登录话路、远程命令执行、转发 TCP/IP 连接和转发 X11 连接。

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

SSH的工作过程

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

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

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

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

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

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

 

*版本号协商阶段

   1. 服务器打开端口 22,等待客户端连接。

   2. 客户端向服务器端发起 TCP初始连接请求,TCP连接建立后,服务器向客户端发送第一个报文,包括版本标志字符串。

   3. 客户端收到报文后,解析该数据包,如果服务器端的协议版本号比自己的低,且客户端能支持服务器端的低版本,就使用服务器端的低版本协议号,否则使用自己的协议版本号。

   4. 客户端回应服务器一个报文,包含了客户端决定使用的协议版本号。服务器比较客户端发来的版本号,决定是否能同客户端一起工作。

   5. 如果协商成功,则进入密钥和算法协商阶段,否则服务器端断开 TCP连接。

 

Note: 版本号协商阶段报文都是采用明文方式传输的。

 

*密钥和算法协商阶段

   1. 服务器端和客户端分别发送算法协商报文给对端,报文中包含自己支持的公钥算法列表、加密算法列表、MAC(Message Authentication Code,消息验证码)算法列表、压缩算法列表等;

   2. 服务器端和客户端根据对端和本端支持的算法列表得出最终使用的算法。

   3. 服务器端和客户端利用 DH交换(Diffie-Hellman Exchange)算法、主机密钥对等参数,生成会话密钥和会话ID。

通过以上步骤,服务器端和客户端就取得了相同的会话密钥和会话ID。

    对于后续传输的数据,两端都会使用会话密钥进行加密和解密,保证了数据传送的安全

    在认证阶段,两端会使用会话 ID用于认证过程。

 

Note:在协商阶段之前,服务器端已经生成 RSA或 DSA密钥对,他们主要用于参与会话密钥的生成。

 

*认证阶段

   1. 客户端向服务器端发送认证请求,认证请求中包含用户名、认证方法、与该认证方法相关的内容(如:password认证时,内容为密码)。

   2. 服务器端对客户端进行认证,如果认证失败,则向客户端发送认证失败消息,其中包含可以再次认证的方法列表。

   3. 客户端从认证方法列表中选取一种认证方法再次进行认证。

   4. 该过程反复进行,直到认证成功或者认证次数达到上限,服务器关闭连接为止。

 

SSH提供两种认证方式:

   1. password认证:客户端向服务器发出 password认证请求,将用户名和密码加密后发送给服务器;服务器将该信息解密后得到用户名和密码的明文,与设备上保存的用户名和密码进行比较,并返回认证成功或失败的消息。

   2. public key认证:采用数字签名的方法来认证客户端。目前,设备上可以利用RSA和 DSA两种公共密钥算法实现数字签名。客户端发送包含用户名、公共密钥和公共密钥算法的public key认证请求给服务器端。服务器对公钥进行合法性检查,如果不合法,则直接发送失败消息;否则,服务器利用数字签名对客户端进行认证,并返回认证成功或失败的消息

 

SSH2.0还提供了password-publickey 认证和 any 认证:

   1. password-publickey 认证:指定该用户的认证方式为 password 和 publickey认证同时满足。客户端版本为 SSH1的用户只要通过其中一种认证即可登录;客户端版本为 SSH2的用户必须两种认证都通过才能登录。

   2. any认证:指定该用户的认证方式可以是 password,也可以是 publickey。

 

*会话请求阶段

   1. 服务器等待客户端的请求;

   2. 认证通过后,客户端向服务器发送会话请求;

   3. 服务器处理客户端的请求。请求被成功处理后,服务器会向客户端回应 SSH_SMSG_SUCCESS包,SSH进入交互会话阶段;否则回应 SSH_SMSG_FAILURE包,表示服务器处理请求失败或者不能识别请求。

 

*交互会话阶段

 

在这个模式下,数据被双向传送:

   1. 客户端将要执行的命令加密后传给服务器;

   2. 服务器接收到报文,解密后执行该命令,将执行的结果加密发还给客户端;

   3. 客户端将接收到的结果解密后显示到终端上.

 

通过Public Key进行客户端认证的过程:

客户端将自己的公钥存放在服务端文件authorized_keys中。

1) 客户端发起一个Public Key的认证请求,并发送RSA Key的模数作为标识符。

2)服务端检查是否存在请求帐号的公钥(Linux中存储在~/.ssh/authorized_keys文件中),以及其拥有的访问权限。如果没有则断开连接

3)服务端使用对应的公钥对一个随机的256位的字符串进行加密,并发送给客户端

4)客户端使用私钥对字符串进行解密,并将其结合session id生成一个MD5值发送给服务端。结合session id的目的是为了避免攻击者采用重放攻击(replay attack)。

5)服务端采用同样的方式生成MD5值与客户端返回的MD5值进行比较,完成对客户端的认证。

 

猜你喜欢

转载自blog.csdn.net/byrgzs/article/details/86544125