「SSH」- 概念、术语

协议结构

在SSH 协议框架中,最主要的部分是三个协议:
1)传输层协议:提供 版本协商、加密算法协商、密钥交换、服务端认证、信息完整性支持;
2)用户认证协议:为服务器提供客户端的身份鉴别;
3)连接协议:将加密的信息隧道复用为多个逻辑通道,提供给高层的应用协议(STelnet、SFTP)使用;各种高层应用协议可以相对地独立于SSH基本体系之外,并依靠这个基本框架,通过连接协议使用SSH的安全机制。

SSH 传输层协议

SSH 传输层协议,是个安全传输协议。SSH 传输层通常建立在TCP/IP连接上,但也可以在任何其他可靠的数据流上建立。
SSH 传输层协议协商所有的密钥交换算法、公钥算法、对称加密算法、消息认证算法等。

算法类别 | 算法功能 | 算法名称
1)密钥交换算法 | 用于产生会话密钥 | diffie-hellman-group14-sha1, diffie-hellman-group1-sha1…
2)公钥算法 | 用于进行数字签名和用户认证 | ssh-rsa,ssh-dss …
3)对称加密算法 | 用于会话的加密 | aes128-ctr,3des-cbc …
4)消息认证算法 | 用于数据完整性认证 | hmac-sha1,hmac-md5 …

完美前向保密

完美前向保密(Perfect Forward Secrecy,PFS),是安全通讯协议中的一种属性,PFS由Christoph G. Günther在1990年提出,其最初用于定义会话密钥交换协议的一种安全性,指的是用来产生会话密钥的长期密钥(long-term key,通常为私钥或者相关认证材料)的泄露,不会导致过去的会话密钥(session key)泄漏。前向保密能够保护历史通讯和会话不受密码或密钥在未来暴露的威胁,即使攻击者进行主动干预也是如此。

SSH传输层协议采用的Diffie-Hellman密钥交换算法可以提供完美的前向保密性(PFS)。

更多参考 RFC4251 9.3.7 Forward Secrecy 小节,https://www.ietf.org/rfc/rfc4251.txt

SSH 用户认证协议

SSH用户认证协议为服务器提供客户端的用户鉴别。它运行在传输层协议上。

SSH用户认证协议提供两种认证方法:
1)口令认证:客户端通过用户名和密码登录到服务器,完成用户认证。
2)公钥认证:服务器通过公钥解密客户端的数字签名,完成用户认证。

公钥是用来解密信息的,确保让别人知道这条信息是真的,是有自己本人发布的,是完整正确的。接收者由此可知这条信息确实来自于拥有私钥的某人,这被称作数字签名,公钥的形式就是数字证书。

当此协议启动时,它从SSH传输层协议接收会话ID。会话ID唯一标识一个会话,并且参与签名以证明私钥的所有权。

SSH 连接协议

在SSH传输层和SSH用户认证协议之上,运行SSH连接协议。

SSH连接协议将加密的会话连接多路复用成若干个逻辑通道,所有通道都复用一个会话连接。

它提供交互式登录会话,远程执行命令,TCP/IP连接转发和X11连接转发等功能:
1)TCP/IP连接转发能够将其他TCP端口的网络数据通过SSH通道来转发,并保证了安全性。
2)Telnet、SMTP、IMAP 和其他一些基于TCP/IP的不安全协议都可以通过SSH转发变得安全,避免用户名、密码、隐私信息的明文传输。此外,如果防火墙限制了一些网络端口的使用,但是允许SSH的连接,可以通过SSH TCP/IP连接转发进行通讯。
3)X11中的X是X协议,11是X协议的第11个版本。Linux的图形化界面,底层都是基于X协议。当需要与linux服务器上的图形化应用程序进行远程交互时,一种加强通讯安全的方法就是使用SSH通过X11隧道转发,将图形界面投射到客户端本地。
4)会话是程序的远程执行。程序可以是shell、应用程序、系统命令或一些内置的子系统。多个会话通道可以同时处于活动状态。交互式登录会话可以是invoker_shell()方法,远程执行命令可以是exec_command()方法,后文会详细介绍。

加密算法

在 SSH 中,用到的算法主要有几类:
1)用于数据完整性保护的MAC算法,如hmac-md5、hmac-md5-96等;
2)用于数据信息加密的算法,如3des-cbc、aes128-cbc、des-cbc等;
3)用于产生会话密钥的密钥交换算法,如diffle-hellman-group-exchange-sha1等;
4)用于进行数字签名和认证的主机公钥算法,如RSA、DSA等;

Host Key

OpenSSH把用户访问过每个计算机的公钥都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告, 避免用户受到中间人攻击等。通常客户端第一次连接SSH服务器均需要输入Yes或No进行确认。