什么是SSH他是如何工作的#

为什么需要 SSH?#

SSH 代表什么?SSH 代表 Secure Shell,也称为 Secure Socket Shell。传统的互联网通信使用明文传输数据,内容一旦被截获就会完全暴露,存在很多安全隐患。SSH 协议通过对网络数据进行加密和验证,建立 SSH 客户端和 SSH 服务器之间的安全隧道,在不安全的网络环境中为网络服务提供了安全的传输通道。

在 SSH 协议出现之前,Telnet 广泛应用于远程登录场景,为远程管理网络设备提供了极大便利,而 FTP 作为常用的文件传输协议,兼具操作简单和传输效率高的优点,但它们都存在相同的问题,即明文传输数据带来的安全隐患。SSH 采用加密传输数据、提升认证强度等手段,克服了 Telnet 和 FTP 应用中的安全性问题,实现了安全的远程登录和文件传输业务。

SSH常用场景
SSH常用场景

SSH 是如何工作的?#

SSH 由服务器和客户端组成,为建立安全的 SSH 通道,双方需要先建立 TCP 连接,然后协商使用的版本号和各类算法,并生成相同的会话密钥用于后续的对称加密。在完成用户认证后,双方即可建立会话进行数据交互。SSH 的工作流程包括如下几个阶段。

SSH工作流程
SSH工作流程

连接建立#

SSH 依赖端口进行通信。在未建立 SSH 连接时,SSH 服务器会在指定端口侦听连接请求,SSH 客户端向 SSH 服务器该指定端口发起连接请求后,双方建立一个 TCP 连接,后续会通过该端口通信。

版本协商#

SSH 协议目前存在 SSH1.X(SSH2.0 之前的版本)和 SSH2.0 版本。SSH2.0 协议相比 SSH1.X 协议来说,在结构上做了扩展,可以支持更多的认证方法和密钥交换方法,同时提高了服务能力。SSH 服务器和客户端通过协商确定最终使用的 SSH 版本号,过程如下:

  1. SSH 服务器通过建立好的连接向 SSH 客户端发送支持的 SSH 版本信息。

  2. SSH 客户端收到版本信息后,根据自身支持的 SSH 版本决定使用的版本号,并将决定使用的版本号发送给 SSH 服务器。

  3. SSH 服务器判断自己是否支持客户端决定使用的版本号,从而确定版本协商是否成功。

算法协商#

SSH 工作过程中需要使用多种类型的算法,包括用于产生会话密钥的密钥交换算法、用于数据信息加密的对称加密算法、用于进行数字签名和认证的公钥算法和用于数据完整性保护的 HMAC 算法。SSH 服务器和客户端对每种类型中具体算法的支持情况不同,因此双方需要协商确定每种类型中最终使用的算法,过程如下:

  1. SSH 服务器和客户端分别向对方发送自己支持的算法。

  2. SSH 服务器和客户端依次协商每种类型中具体使用的算法。在每类算法的协商过程中,SSH 服务器和客户端都会匹配出双方均支持的算法作为最终使用的算法。每类算法均匹配成功后,算法协商完成。如果某类算法全部匹配失败,则该类型的算法协商失败,这会导致 SSH 服务器和客户端之间算法协商失败并断开连接。

密钥交换#

SSH 服务器和客户端通过密钥交换算法,动态生成共享的会话密钥和会话 ID,建立加密通道。会话密钥主要用于后续数据传输的加密,会话 ID 用于在认证过程中标识该 SSH 连接。在该阶段也会完成客户端对服务器的身份认证,服务器先使用服务器私钥对消息进行签名,客户端再使用服务器公钥验证签名,从而完成客户端对服务器的身份认证。

由于 SSH 服务器和客户端需要持有相同的会话密钥用于后续的对称加密,为保证密钥交换的安全性,SSH 使用一种安全的方式生成会话密钥,由 SSH 服务器和客户端共同生成会话密钥,利用数学理论巧妙地实现不直接传递密钥的密钥交换,无需通过不安全通道传送该密钥,具体过程如下图所示。

SSH密钥交换
SSH密钥交换

  1. SSH 服务器生成素数 G、P、服务器私钥 b,并计算得到服务器公钥 y=(G^b)%P。

  2. SSH 服务器将素数 G、P、服务器公钥 y 发送给 SSH 客户端。

  3. SSH 客户端生成客户端私钥 a,计算得到客户端公钥 x=(G^a)%P。

  4. SSH 客户端将客户端公钥 x 发送给 SSH 服务器。

  5. SSH 服务器计算得到对称密钥 K=(x^b)%P,SSH 客户端计算得到对称密钥 K=(y^a)%P,数学定律可以保证 SSH 服务器和 SSH 客户端生成的对称密钥相同。

用户认证#

SSH 客户端向 SSH 服务器发起认证请求,SSH 服务器对 SSH 客户端进行认证。SSH 支持以下几种认证方式:

  • 密码(password)认证:客户端通过用户名和密码的方式进行认证,将加密后的用户名和密码发送给服务器,服务器解密后与本地保存的用户名和密码进行对比,并向客户端返回认证成功或失败的消息。
  • 密钥(publickey)认证:客户端通过用户名、公钥以及公钥算法等信息来与服务器进行认证。
  • password-publickey 认证:指用户需要同时满足密码认证和密钥认证才能登录。
  • all 认证:只要满足密码认证和密钥认证其中一种即可。

SSH 用户认证最基本的两种方式是密码认证和密钥认证。密码认证的基本原理是 SSH 客户端使用对称密钥对密码进行加密,SSH 服务器使用对称密钥解密后验证密码的合法性,这种认证方式比较简单,且每次登录都需要输入用户名和密码。而密钥认证可以实现安全性更高的免密登录,基本原理是 SSH 客户端使用客户端私钥对消息进行签名,服务器再使用客户端公钥验证签名,这是一种广泛使用且推荐的登录方式。

会话请求#

认证通过后,SSH 客户端向服务器发送会话请求,请求服务器提供某种类型的服务,即请求与服务器建立相应的会话。服务器根据客户端请求进行回应。

会话交互#

会话建立后,SSH 服务器端和客户端在该会话上进行数据信息的交互,双方发送的数据均使用会话密钥进行加解密。

SSH 端口号是什么?#

默认情况下,SSH 服务器使用端口号 22。当 SSH 应用于 NETCONF 时,可以指定默认端口号是 22 或者 830。SSH 使用的端口号可以被更改为设备其他可用端口,更改后当前所有的连接都会断开,SSH 服务器开始侦听新的端口。由于 SSH 默认端口号 22 为知名端口,在进行关键安全传输时,建议修改 SSH 端口号。

常用 SSH 连接工具:PuTTY 和 OpenSSH#

由于 SSH 是一套协议标准,需要依赖基于 SSH 实现的工具完成 SSH 客户端和 SSH 服务器之间的连接,PuTTY 和 OpenSSH 应运而生。

PuTTY 是 Windows 上经典的免费 SSH 连接工具,通常用于使用 SSH 协议远程登录设备,最新版本可以在 PuTTY 官网下载。

OpenSSH 是 SSH 协议的开源实现,支持在 Unix 操作系统上运行,最新版本可以在 OpenSSH 官网下载。目前 Windows10 已经包含 OpenSSH 客户端和服务器软件,可在 “设置—应用—应用与功能—可选功能” 中搜索安装。

SSH 和 SSL 的区别#

SSH 和 SSL 都是网络安全协议,通过加密和认证提升两台设备间传输数据的安全性。但 SSH 和 SSL 的生效方式和服务目标存在差异。

SSH 在两台设备间创建安全隧道,使这两台设备间可以安全地发送命令、传输数据等。例如,客户端通过 SSH 远程登录到一台服务器上,就可以安全地远程管理这台服务器,在服务器上执行想要的命令。

SSL 则是使用 SSL 证书保证两台设备间安全地传输数据,而不是像 SSH 那样可以执行命令。例如,用户通过浏览器访问某安装了 SSL 证书且启用了 HTTPS 的服务器,浏览器和服务器之间可以安全地传输数据。

SSH 就像一辆汽车,我们看不到这辆封闭的汽车里装载的是什么。而 SSL 就像一个封闭的集装箱,我们可以用不同的交通工具运输它,但看不到集装箱里装的是什么。

https://info.support.huawei.com/info-finder/encyclopedia/zh/SSH.html