SSH(Secure Shell)是一种通用的基于软件的网络安全性协议。通过 SSH 客户端和服务器来进行加密的网络通信。通常在用于安全远程登录、文件传输、执行远程命令、访问控制、端口转发等操作。
SSH 有以下特性
- 强加密来保证数据的私密性
- 通信的完整性
- 认证发送和接受者的身份
- 授权账号的访问控制
- 转发或隧道对其他基于 TCP/IP 的会话进行加密
SSH 主要分为三个协议
- SSH 传输协议(SSH-TRANS)
- SSH 认证协议(SSH-AUTH)
- SSH 连接协议(SSH-CONN)
传输协议
算法协商
主机密钥、消息认证、Hash 函数、服务器密钥交换、数据压缩这些过程所使用的算法均可以进行协商,并在默认支持一种方法的基础上定义了几种推荐方法和可选方法。
会话密钥交换
可以协商使用的密钥交换方法,该方法生成一段共享密文,用于生成会话密钥的过程。
默认定义了 diffie-hellman-group1-sha1
这种方法。
完整性
使用强加密的消息认证算法(MAC,Message Authentication Code)来保证完整性。MAC 算法和普通 Hash 算法不同的地方在于,其 Hash 函数和双方都知道的一个密钥来控制。
服务器认证
分为以下几个步骤
-
客户端向服务器的 TCP 端口(约定是 22)发送连接请求
-
客户端和服务器交换自己支持的 SSH 协议的版本号
-
客户端和服务器切换到基于报文的协议
-
服务器向客户端发送
- 主机密钥(证明服务器主机身份,客户端第一次收到可选择信任与否,信任的话存入已知名主机数据库中)
- 服务器密钥(帮助建立安全的连接,临时生成的,周期性更新,不保存在本地)
- 检测字节(防止某些 IP 伪装攻击)
- 支持的加密、压缩和认证方法
之后将所有信息一起应用消息认证生成的值进行表示此会话
-
客户端和服务端进行会话密钥交换
-
发送一个用会话密钥加密的确认消息给客户端,完成服务器认证
压缩
使用 gzip 工具的 deflate
算法堆会话数据进行压缩,又名 zlib
算法。
认证协议
SSH 服务端可以在交换过程的任意时机都通知客户端可用的认证方法,主要支持以下三种。
公钥认证
客户端持有私钥,服务端持有公钥。常用的非对称加密算法(RSA、DSA、OpenPGP)
分为以下步骤
- 客户端向服务端发送一个请求,请求使用一个特定的密钥进行公钥认证
- 服务器读取目标文件中的认证文件,搜索一个可以匹配该密钥的项,有则下一步
- 服务器检验该密钥的限制
- 服务器产生随机数,使用公钥对其加密发送给客户端
- 客户端用私钥解密并和会话标识符合并并使用MD5,结果返回给服务端
- 服务器检验该 MD5 是否符合,符合则认证成功
基于主机的认证
SSH 服务端通过一些主机的标识符来执行基于主机的认证。
分为以下步骤
- 查找客户端主机密钥:客户端将主机名和公钥提供给服务端,服务端维护了一个已知主机和公钥的列表,查找列表中判断是否为可信主机
- 在通过的控制文件时进行认证时匹配客户端主机:服务器上为可信主机认证提供访问控制的文件
密码认证
用户输入一个密码给 SSH 客户端,客户端通过加密的连接发送给服务器,服务器检查密码是否可接受。
连接协议
远程程序执行
最简单的应用,建立 SSH 连接后,对远程 Shell 执行命令
TCP 端口转发和 X 转发
TCP 端口转发
在应用程序客户端所使用的 TCP 端口截获连接,通过SSH连接传输请求,传输到应用程序服务器主机上的 SSH 服务端,再返回给应用程序服务器。
- 本地转发:应用程序客户端发起,设置一个端口,监听该端口的外出流量并进行 SSH 连接转发
- 远程转发:应用程序服务器发起,设置一个端口,监听该端口的进入流量并进行 SSH 连接转发
应用程序客户端位于 SSH 客户端所在的主机时,使用本地连接,反之用远程连接。
X 转发
X:X Window系统,是 Unix 机器上应用最广泛的图形显示系统。拥有客户端和服务端,X 客户端是窗口化的应用程序,X 服务器是后台运行的显示引擎,负责处理处理客户端请求,用 X 协议进行网络通信。
将 X 协议的连接导入 SSH 连接来保证其安全性和增强认证被称为 X 转发。
认证代理转发
代理
SSH 代理是一个管理私钥缓存区,并对 SSH 客户端发出的认证请求作出响应的程序。
- 在内存中存储私钥
- 回答 SSH 客户端提出和密钥有关的问题
代理转发
若两主机之间无法直接建立 SSH 连接,需要通过中间主机。
那么在中间主机中运行 SSH 代理,并拆分成主机 A 到中间主机的 SSH 连接和中间主机到主机 B 的 SSH 连接。
通过中间主机的代理进行转发 SSH 连接。