SSH(Secure Shell)是一种通用的基于软件的网络安全性协议。通过 SSH 客户端和服务器来进行加密的网络通信。通常在用于安全远程登录、文件传输、执行远程命令、访问控制、端口转发等操作。

SSH 有以下特性

SSH 主要分为三个协议

传输协议

算法协商

主机密钥、消息认证、Hash 函数、服务器密钥交换、数据压缩这些过程所使用的算法均可以进行协商,并在默认支持一种方法的基础上定义了几种推荐方法和可选方法。

会话密钥交换

可以协商使用的密钥交换方法,该方法生成一段共享密文,用于生成会话密钥的过程。

默认定义了 diffie-hellman-group1-sha1 这种方法。

完整性

使用强加密的消息认证算法(MAC,Message Authentication Code)来保证完整性。MAC 算法和普通 Hash 算法不同的地方在于,其 Hash 函数和双方都知道的一个密钥来控制。

服务器认证

分为以下几个步骤

  1. 客户端向服务器的 TCP 端口(约定是 22)发送连接请求

  2. 客户端和服务器交换自己支持的 SSH 协议的版本号

  3. 客户端和服务器切换到基于报文的协议

  4. 服务器向客户端发送

    • 主机密钥(证明服务器主机身份,客户端第一次收到可选择信任与否,信任的话存入已知名主机数据库中)
    • 服务器密钥(帮助建立安全的连接,临时生成的,周期性更新,不保存在本地)
    • 检测字节(防止某些 IP 伪装攻击)
    • 支持的加密、压缩和认证方法

    之后将所有信息一起应用消息认证生成的值进行表示此会话

  5. 客户端和服务端进行会话密钥交换

  6. 发送一个用会话密钥加密的确认消息给客户端,完成服务器认证

压缩

使用 gzip 工具的 deflate 算法堆会话数据进行压缩,又名 zlib 算法。

认证协议

SSH 服务端可以在交换过程的任意时机都通知客户端可用的认证方法,主要支持以下三种。

公钥认证

客户端持有私钥,服务端持有公钥。常用的非对称加密算法(RSA、DSA、OpenPGP)

分为以下步骤

  1. 客户端向服务端发送一个请求,请求使用一个特定的密钥进行公钥认证
  2. 服务器读取目标文件中的认证文件,搜索一个可以匹配该密钥的项,有则下一步
  3. 服务器检验该密钥的限制
  4. 服务器产生随机数,使用公钥对其加密发送给客户端
  5. 客户端用私钥解密并和会话标识符合并并使用MD5,结果返回给服务端
  6. 服务器检验该 MD5 是否符合,符合则认证成功

基于主机的认证

SSH 服务端通过一些主机的标识符来执行基于主机的认证。

分为以下步骤

  1. 查找客户端主机密钥:客户端将主机名和公钥提供给服务端,服务端维护了一个已知主机和公钥的列表,查找列表中判断是否为可信主机
  2. 在通过的控制文件时进行认证时匹配客户端主机:服务器上为可信主机认证提供访问控制的文件

密码认证

用户输入一个密码给 SSH 客户端,客户端通过加密的连接发送给服务器,服务器检查密码是否可接受。

连接协议

远程程序执行

最简单的应用,建立 SSH 连接后,对远程 Shell 执行命令

TCP 端口转发和 X 转发

TCP 端口转发

在应用程序客户端所使用的 TCP 端口截获连接,通过SSH连接传输请求,传输到应用程序服务器主机上的 SSH 服务端,再返回给应用程序服务器。

应用程序客户端位于 SSH 客户端所在的主机时,使用本地连接,反之用远程连接。

X 转发

X:X Window系统,是 Unix 机器上应用最广泛的图形显示系统。拥有客户端和服务端,X 客户端是窗口化的应用程序,X 服务器是后台运行的显示引擎,负责处理处理客户端请求,用 X 协议进行网络通信。

将 X 协议的连接导入 SSH 连接来保证其安全性和增强认证被称为 X 转发。

认证代理转发

代理

SSH 代理是一个管理私钥缓存区,并对 SSH 客户端发出的认证请求作出响应的程序。

代理转发

若两主机之间无法直接建立 SSH 连接,需要通过中间主机。

那么在中间主机中运行 SSH 代理,并拆分成主机 A 到中间主机的 SSH 连接和中间主机到主机 B 的 SSH 连接。

通过中间主机的代理进行转发 SSH 连接。