SSH协议小结

来源:互联网 发布:无限网络万能钥匙 编辑:程序博客网 时间:2024/06/06 01:58

SSH协议是什么

SSH是Secure Shell的简写,它是一种在应用层和传输层之上的安全协议,基于client-server模式,常用于管理远程服务器。通过一系列的加解密技术SSH可以保证Client到Server双方连接是安全可靠的,并提供了相互验证及命令和内容的传输的手段。
接下来会分享一下SSH是如何提供这种安全的通信和验证的方式的。不过在此之前会先介绍下SSH协议用到的一些加解密方法。

所需加解密方法

为了能提供两节点间安全的连接以达到信息安全传输的目的。SSH在整个会话运用了一系列的信息处理手段。其中包括Symmetric Encryption、Asymmetric Encryption、Hashes。

Symmetrical Encryption

Symmetrical Encryption是一类加密方法-对称加密。在这类加密方法中,加密和解密都使用同一个Key来完成。这也就意味着,只要拥有对应的Key,就可以解密所有使用此Key加密的信息 。在这类加密方法中,各方通常只使用一个Key,不过也有机灵点的会使用多个Key,但是这多个Key之间是有衍生关系的,通过其中一个Key可以推算得知其它的Key。而Key之间的这种关系,其实相当于让用户在Symmetrical Encryption的基础上,加了一层自定义的加密方法。
会话期间所有传输的信息进行加密,SSH都是使用对称加密方法来支持的。而并不是通常大家所以为的使用ssh-keygen生成的公私钥来加密的,ssh-keygen生成的公私钥只是用来各方进行身份验证的。也就是说,即使使用的是通过password的方式登录server,两者之间的会话也是加密了的。
由此可见,在SSH的信息传输中,其使用的Key是多么重要。为了通信的Key不被通信的双方以外的人得知,双方都采取了一系列的措施。这个Key的生成是采用了一种key exchange algorithm的方法。这种方法可以使得通信双方在共享部分数据的情况下,再结合部分自己本身的数据,在通信双方生成一样的Key(对称加密)。随后会提到。一旦上述过程中的Key生成完毕以后,SSH的整个会话期间都将使用此Key来对其通信内容进行加密。
SSH提供了对不同对称加密方法的支持,其中包括AES、Blowfish、3DES、CAST128及Arcfour。通信各方对最终使用哪一种加密方式都可以提供自己的意见。client端去请求server的时候会按自己的偏好提供一个其所支持的加密方法的列表,server会遍历该列表,并使用第一个自己也支持的加密方法作为整个会话的加密方法。

Asymmetrical Encryption

Asymmetrical Encryption也是一类加密方法-非对称加密,相比于Symmetircal Encryption,Asymmetrical Encryption方法需要使用两个Key,即所谓的private key和public key。
public key 是用来分享的,任何机构或人都可以持有此key。但是private key则只能由己方持有(对应到SSH中就是当前所在的机器)。public key 和private key在信息上并没有任何关联(不能从public key推知private key,反之亦然)。但是他们可以一起用来加解密,准确点说,使用public key加密的信息,能且只能使用private key来进行解密。这种关系是单向的,即不能使用私钥来加密,使用公钥解密。因此,使用私钥是唯一可以解密其对应的公钥加密信息的方法。换句话说,如果一个节点拥有解密公钥加密信息的能力,那么我们可以认定他是有对应私钥的。因此,我们一定要保管好自己的私钥,不能让第二个人知道。
非对称加密方式在SSH会话的各个阶段都有在使用。首先是在SSH生成其信息加密方法的Key的时候。在这个过程中,通信双方将产生临时的public/private key对,并交换相互的public key来产生其信息加密时使用的对称加密算法的Key。
另一个更加明显的地方是在SSH协议双发相互身份验证的时候。SSH的客户端会生成public/private key对,并将public key上传到其想要登陆的机器上(server)。当通信双方协商好通信所使用的Key后,双方就要进行身份验证了。在接到client登陆的消息后,server端会使用对应客户端的public key加密一个字符串(一般是随机生成的),然后发送给客户端,而客户端会使用自己的private key对其进行解密。如果server端发现client确实解密出了自己的字符串,则认为其身份合法。

Hashing

SSH协议使用的另外一种数据处理方法就是信息散列。信息散列是指给一组信息生成其信息摘要的过程。此过程具有以下特性:a、不可逆,即不能通过摘要推知其对应的信息;b、对信息进行变更后,其对应的信息摘要是不可预知的;c、不同信息对应的信息摘要是唯一的。
信息散列的以上特性使得其非常适合用于保证信息传输中的信息真实性和完整性。在SSH中,应用Hash的技术叫做HMAC(hash-based message authentication codes),它就是用来保证SSH会话中,用于保证信息的完整和真实性的。究竟使用哪种Hash方法是在上面所述的生成对称加密秘钥的同时完成的。同样的,SSH client会将自己所支持的MAC协议列表按照偏好排序发送给server。server会选出自己所支持的第一协议。
通信双方在传输过程中所使用的MAC协议达成一致后,双方所发送的信息必须带有对应信息的MAC算法产生的值,用于对方验证消息的真实和完整性。此MAC值是由对称秘钥、本条消息在消息序列中的编号、以及消息本身内容所产生的。MAC值是独立于加密后的信息,独立传输的。通常的建议是对信息先进行加密,然后对加密的信息生成其对应的MAC值。

SSH如何工作

既然来查SSH的资料了,相信你对SSH如何工作已经有了大概的了解。SSH是基于Client-Server模型的,提供了安全的连接以方便双方安全的通信和身份校验。在Server端,SSH监听指定端口,以监控连接请求。与请求链接端简历安全连接、鉴别连接请求端的身份以及再鉴定身份成功后给其分配资源都是Server端所需要负责的工作。而Client端需要负责发起TCP请求、与Server端建立安全连接、鉴别当前Server端信息是否和以前记录的相同(server端的fingerPrint,用于防止第三方拦截)以及向Server端提供证书。
SSH的一个会话一般是通过两个步骤才能建立起来。第一步是通信双方先要就所使用的加密协议达成一致,第二步是需要相互的身份验证。Server端要查看client是否有权发起该请求。

协商加密协议

当client发起TCP连接请求以后,Server端会回应其所支持的SSH版本及其public key。SSH版本用于client选择其所使用的SSH版本,只有在Client所支持的版本中包括Server端回应的版本时,才会继续后面的步骤。而public key主要是用于客户端来鉴别Server端的真伪。
在这之后,通信双方需要生成一个session key用于此后的通信信息加密。这个key是由Diffie-Hellman算法生成的。此算法及其衍生算法可以使通信双发利用彼此交换过的数据和部分自己私有的数据,在双方同时生成一样的key(注意,不是一方生成传给另外一方,而是各自使用算法计算出相同的key)。在这一步骤中,通信双方所使用的公钥和私钥并非我们通常意义上所见的,在客户端生成的那个公钥和私钥。
其形式化步骤如下
1. 通信双方选定一个大素数作为seed。
2. 通信双方协商一种加密算法(通常是AES)
3. 除了第一步中所选定的素数,通信双方再各自生成一个素数,作为这个步骤的私钥。
4. 使用第三步的私钥,第二步的加密算法,和第一步中生成的公钥产生一个公钥。
5. 通信双方互换此步骤中所生成的公钥。
6. 在收到对方的公钥后,双方使用各自在第三步生成的私钥、对方的公钥、第一步的seed计算出一个secret key(对应本节一开始的session key),该key尽管是通信双方各自独立计算的,但是在使用相反的公钥私钥(相互交换)的情况下,算法可以保证双方计算出的key是一样的。
7. 此key将会在接下来的信息交换过程中用于信息加密。
上述产生session key的过程是有通信双方共同完成的,而并非由一方主导,而另外一方copy的。这就避免了将使用的key在不安全的连接上进行传递的危险。生成的密钥是对称秘钥(通信双方一样),也就意味着通信双方可以使用同样的密钥进行信息的加解密。而没有此密钥的第三方即使截获到消息也无法对其进行解密,从而保证了信息安全。
在加解密协商完成后,通信双方就要进行身份验证了。

身份验证

在协商完成加密所使用的Key以后,Server端就要对Client进行身份验证以决定其是否具有访问权限。SSH协议对Client的身份验证提供了几种方法。其中最简单的一种就是通过密码验证,这种模式下,Server端需要给客户端访问的账户设置一个密码,该密码通过上述的对称加密的方式发送到Server端进行验证。
尽管使用密码验证的方式,通信双方在进行信息交互的时候,也会对其进行加密。但是这种方式还是建议尽量不要使用,因为密码本身的复杂性有限,很有被第三方使用各种方法(字典)破解。
在SSH协议里,双方进行身份验证最常用的方式是通过SSH key pairs。SSH key pairs由public key和private key组成,他们对应于非对称加密算法的两个Key。这对Key其实就是我们通常意义上理解的,在Client上通过ssh-keygen方法生成的一对Key。public key可以尽管在client想登陆的机器上使用,但是private key必须由client秘密的保管。
SSH使用SSH key pairs进行身份验证的步骤主要如下:
1. Client向Server发送验证请求,其中包括了其要验证的key pair的ID。
2. Server查看Client想要登陆的用户目录下的authorized_keys文件(里面存储的是每个Client端的公钥),并判断Client请求的ID是否在其中。
3. 如果在文件中发现了Client所请求的ID,那么Server将会使用文件中的公钥对自己随机生成的字符串进行加密。
4. Server将加密后的信息发送给Client端。
5. 如果Client端是真的,那么它必定拥有对应的private key,因此它会使用私钥将加密信息进行解密,得到服务器端随机生成的字符串。
6. Client结合解密得到的字符串和之前协商好的session key,并使用Hashing算法(MD5)对其提取摘要。
7. Client将摘要信息信息作为回应发送给Server。
8. 同时,Server端也结合自己刚刚生成的字符串和之前协商好的session key,使用Hashing算法对其提取摘要。并将自己生成的摘要和Client端发送过来的摘要进行对比。如果Client端不是伪造的,那么其信息摘要应该是一样的。
上面就是SSH使用非对称加密算法对通信双方进行身份验证的过程。

原创粉丝点击