SSH 的基本架构
SSH 的基本架构
SSH 由传输层协议( The Transport Layer Protocol )、用户认证协议( The User Authentication Protocol )、连接协议( The Connection Protocol )三个协议组成,同时 SSH 中还会为高层网络安全应用协议提供扩展支持。其中,传输层协议提供服务器认证、数据压缩、数据保密性及信息完整性等支持;用户认证协议为服务器进行客户端身份认证;连接协议将加密通道复用成若干个逻辑通道。
传输层协议
传输层协议通常运行在 TCP/IP 上,也可能被用在其他数据流上,不执行用户认证。传输层协议定义了传输的加密通道,是其他两个协议的基础,提供了数据加密传输、数据完整性保护以及数据压缩功能。
用户认证协议
用户认证协议运行在传输层协议之上,会将传输层确定的会话 ID 作为本次数据传输的唯一标识。用户认证由服务器端率先向客户端发起,客户端从服务器端支持的认证算法中进行选择。用户认证协议具有时效性和失败次数限制,认证成功后会开始执行传输。
连接协议
连接协议是建立在传输层协议和用户认证协议之上,终端会话和转交连接都是隧道,通过将加密隧道复用分为多个逻辑通道,以供高层应用协议使用。连接协议提供 Shell 会话、远程命令执行、转发 TCP/IP 连接以及转发 X11 连接等功能支持。
传输层协议
传输层协议通常运行在 TCP/IP 上,也可能被用在其他数据流上,不执行用户认证。传输层协议定义了传输的加密通道,是其他两个协议的基础,提供了数据加密传输、数据完整性保护以及数据压缩功能。
用户认证协议
用户认证协议运行在传输层协议之上,会将传输层确定的会话 ID 作为本次数据传输的唯一标识。用户认证由服务器端率先向客户端发起,客户端从服务器端支持的认证算法中进行选择。用户认证协议具有时效性和失败次数限制,认证成功后会开始执行传输。
连接协议
连接协议是建立在传输层协议和用户认证协议之上,终端会话和转交连接都是隧道,通过将加密隧道复用分为多个逻辑通道,以供高层应用协议使用。连接协议提供 Shell 会话、远程命令执行、转发 TCP/IP 连接以及转发 X11 连接等功能支持。
SSH 的工作流程
SSH 的工作流程
版本号协商阶段
版本号协商阶段,由客户端向服务器发起 TCP 初始连接请求,建立连接后,服务器向客户端发送包含版本标志字符串的报文。客户端解析该报文的数据包,判断使用服务器端还是客户端的协议版本号,并将决定使用的协议版本号回应给服务器端。服务器端根据版本协议号决定是否协商成功,协商成功进入下一阶段,协商失败则 TCP 连接断开。
密钥和算法协商阶段
密钥和算法协商阶段,客户端和服务器端通过报文向对端发布算法列表,算法列表中包含了各自支持的公钥、加密、MAC 及压缩的算法。客户端和服务器端结合自身和彼此支持的算法列表得出最终使用的算法,利用 DH 交换参数,生成密钥和会话 ID。
认证阶段
认证阶段由客户端向服务器端发送认证请求,服务器端根据客户端发送的用户名、认证方法以及认证方法的相关信息进行匹配。如果认证失败,服务器端会发送失败通知和再次认证的方法列表。客户端会重复执行认证请求,直至认证成功或达次数上限。
会话请求阶段
认证阶段通过后,客户端向服务器发送会话请求。服务器根据客户端请求进行回应,如服务器回应 SSH_SMSG_SUCCESS,则 SSH 进入交互会话阶段,如回应 SSH_SMSG_FAILURE,则表示请求失败。
数据传输阶段
数据传输阶段,客户端将命令请求加密后传输给服务器,服务器基于协商阶段生成的秘钥进行解密。服务器解密后,将命令的执行结果传输给客户端,客户端对执行结果进行解密并显示在终端。在这个阶段中,数据将被双向传输。
版本号协商阶段
版本号协商阶段,由客户端向服务器发起 TCP 初始连接请求,建立连接后,服务器向客户端发送包含版本标志字符串的报文。客户端解析该报文的数据包,判断使用服务器端还是客户端的协议版本号,并将决定使用的协议版本号回应给服务器端。服务器端根据版本协议号决定是否协商成功,协商成功进入下一阶段,协商失败则 TCP 连接断开。
密钥和算法协商阶段
密钥和算法协商阶段,客户端和服务器端通过报文向对端发布算法列表,算法列表中包含了各自支持的公钥、加密、MAC 及压缩的算法。客户端和服务器端结合自身和彼此支持的算法列表得出最终使用的算法,利用 DH 交换参数,生成密钥和会话 ID。
认证阶段
认证阶段由客户端向服务器端发送认证请求,服务器端根据客户端发送的用户名、认证方法以及认证方法的相关信息进行匹配。如果认证失败,服务器端会发送失败通知和再次认证的方法列表。客户端会重复执行认证请求,直至认证成功或达次数上限。
会话请求阶段
认证阶段通过后,客户端向服务器发送会话请求。服务器根据客户端请求进行回应,如服务器回应 SSH_SMSG_SUCCESS,则 SSH 进入交互会话阶段,如回应 SSH_SMSG_FAILURE,则表示请求失败。
数据传输阶段
数据传输阶段,客户端将命令请求加密后传输给服务器,服务器基于协商阶段生成的秘钥进行解密。服务器解密后,将命令的执行结果传输给客户端,客户端对执行结果进行解密并显示在终端。在这个阶段中,数据将被双向传输。
SSH 的安全验证
SSH 的安全验证
SSH 提供密码和密钥两种级别的客户端验证方式。第一种级别是基于密码的安全验证,通过账号和密码可以登录远程主机,并且传输的所有数据都会被加密,无法防止“中间人”攻击。第二种级别是基于密钥的安全验证,将创建的一对密钥放置在需要访问的服务器上,连接 SSH 服务器时,客户端会向服务器发生安全验证请求,服务器通过对密钥进行对比验证。密钥验证成功后服务器会使用公有密钥加密“质询并给发送给客户端,可以有效避免“中间人”攻击。
SSH 无法防止的攻击
SSH 无法防止的攻击
SSH 可以有效防止因窃听而导致的信息泄露,面对名字服务和 IP 伪装、连接劫持、“中间人”攻击以及插入攻击等攻击方式也可有效防御。但无法防止以下形式的攻击:密码丢失、IP 和 TCP 攻击以及流量分析。当用户密码丢失时,SSH 无法保证安全性。SSH 具有隐私性、安全性的特性,可以将攻击限制在一定范围内,但 SSH 基于 TCP 运行的,所以无法防止来自 TCP 和 IP 缺陷的攻击。另外,攻击者可以通过监控网络数据通信的数据量、通信地址以及通信时间等信息进行拒绝服务攻击,SSH 也无法防止这种形式的攻击。