什么是 SSH
SSH(即安全外壳协议)是一种远程管理协议,允许用户通过 Internet 访问、控制和修改其远程服务器。SSH 服务是作为未加密 Telnet 的安全替代品而创建的,并使用加密技术来确保与远程服务器之间的所有通信都以加密方式进行。它提供了一种对远程用户进行身份验证、将输入从客户端传输到主机以及将输出中继回客户端的机制。
Linux 或 macOS 用户可以直接从终端窗口通过 SSH 连接到远程服务器。Windows 用户可以利用 Putty、XShell 等 SSH 客户端连接到远程服务器。如下图,显示就是典型的 SSH 提示符。
SSH 如何工作
如果使用的是 Linux 或 Mac,那么使用 SSH 非常简单。如果使用的是 Windows,则需要使用 SSH 客户端来打开 SSH 连接,如上图我使用的 Tabby SSH 客户端连接工具。
打开终端,按照以下步骤操作:
SSH 命令由 3 个不同的部分组成:
代码语言:javascript复制ssh {user}@{host}
SSH 命令指示你的系统要打开加密的安全 Shell 连接。{user}
代表要访问的账户。例如,我们可能想要访问 root
用户,这基本上是系统管理员的同义词,拥有修改系统上任何内容的完全权限。{host}
指的是咱们要访问的计算机。这可以是远程计算机的 IP 地址(例如 192.168.0.103)或域名(例如 www.abc.test)。
输入上面的命令,记得{user}
和{host}
替换成你自己的,系统将提示你输入所请求账户的密码。当输完密码后,屏幕上不会显示任何内容,但你的密码实际上正在传输。输入完毕后,再次按 Enter 键。如果你的密码正确,将可以看到一个连接上远程终端的窗口。
了解不同的加密技术
SSH 的显著优势是使用加密来确保主机和客户端之间信息的安全传输。主机指的是要访问的远程服务器,而客户端指的是你用来访问远程服务器的计算机。SSH 使用了三种不同的加密技术:
- 对称加密(Symmetrical encryption)
- 非对称加密(Asymmetrical encryption)
- 哈希(Hashing)
对称加密(Symmetrical encryption)
对称加密是一种加密形式,其中客服端和主机均使用密钥对消息进行加密和解密。实际上,拥有密钥的任何人都可以解密正在传输的信息。
对称加密通常称为共享密钥或共享秘密加密。通常只使用一个密钥,有时使用一对密钥,其中一个密钥可以根据可以使用另一个密钥轻松计算。
对称密钥用于加密 SSH 会话期间的整个通信。客户端和服务器都使用约定的方法派生密钥,并且所得密钥永远不会泄露给任何第三方。
创建对称密钥的过程是通过密钥交换算法执行的。该算法特别安全的原因是密钥永远不会在客服端和主机之间传输。
相反,两台计算机共享公共数据,然后对其进行操作以独立计算密钥。即使另一台计算机捕获了公共共享数据,它也无法计算出密钥,因为密钥交换算法是未知的。
但必须注意的是,密钥令牌特定于每个 SSH 会话,并且是在客服端身份验证之前生成的。生成密钥后,两台计算机之间移动的所有数据都必须使用私钥加密。这包括用户在控制台中输入的密码,因此凭据始终受到网络数据包嗅探器的保护。
有多种对称加密密码,包括但不限于 AES(Advanced Encryption Standart,高级加密标准)、CAST128、Blowfish 等。在建立安全连接之前,客户端和主机会根据优先顺序发布支持的密码列表,决定使用哪种密码。在客户端支持的密码中,出现在主机列表中的最优先密码将被用作双向密码。
例如,如果两台 Ubuntu 14.04 LTS 机器通过 SSH 通信,它们将使用 aes128-ctr
作为默认密码。
非对称加密(Asymmetrical encryption)
与对称加密不同,非对称加密使用两个单独的密钥进行加密和解密。这两个密钥称为公钥和私钥。这两个密钥一起形成公钥-私钥对。
任何个人都可以使用公钥对信息进行加密,只有拥有其特定私人私钥的收件人才能解密,反之亦然。这些密钥由大量看似随机的数字和符号组合而成,但公钥和私钥都是通过复杂的数学算法配对而成的。
例如,为了验证发件人的身份,会使用发件人自己的私钥对信息进行加密。因此,只有使用特定发件人的公钥才能解密信息。请注意,加密和解密机制都是自动进行的,无需手动操作。
与一般的看法不同,非对称加密并不用于加密整个 SSH 会话。相反,它是在对称加密的密钥交换算法中使用的。在启动安全连接之前,双方会生成临时的公钥-私钥对,并共享各自的私钥,以生成共享秘钥。
一旦建立了安全的对称通信,服务器就会使用客户端的公钥生成挑战书,并将其发送给客户端进行身份验证。如果客户端能成功解密信息,就意味着它持有连接所需的私钥--SSH 会话随即开始。
哈希(Hashing)
单向哈希是安全 Shell 连接中使用的另一种加密方式。单向哈希函数与上述两种加密形式的不同之处在于,它们永远不会被解密。单向哈希函数为每个输入生成一个固定长度的唯一值,该值不会显示可以被利用的信息。这使得它们实际上不可能被逆转。
从给定输入生成加密哈希很容易,但从哈希生成输入却不可能。这意味着,如果客户端持有正确的输入,就可以生成加密哈希值,并通过比较其值来验证自己是否拥有正确的输入。
SSH 使用哈希值来验证信息的真实性。这是通过 HMAC 或基于哈希的消息验证码来实现的。这可确保接收到的命令未被以任何方式篡改。
在选择对称加密算法的同时,还要选择合适的信息验证算法。其工作方式与选择密码的方式类似,详见对称加密部分的解释。
传输的每条信息都必须包含一个 MAC,它是通过对称密钥、数据包序列号和信息内容计算得出的。它作为通信数据包的结尾部分,在对称加密数据之外发送。
SSH 如何与这些加密技术配合使用
SSH 的工作方式是利用客户端-服务器模式,对两个远程系统进行身份验证,并对它们之间传输的数据进行加密。
默认情况下,SSH 在 TCP[1] 端口 22 上运行(尽管可以根据需要更改 SSH 端口[2])。主机(服务器)在端口 22(或任何其他 SSH 分配的端口)上侦听传入连接。它通过对客户端进行身份验证并在验证成功时打开正确的 shell 环境来组织安全连接。
客户端必须通过启动与服务器的 TCP 握手来开始 SSH 连接,确保安全的对称连接,验证服务器显示的身份是否与之前的记录(通常记录在 RSA 密钥存储文件中)一致,并提供验证连接所需的用户凭证。
建立连接分为两个阶段:首先,两个系统必须就加密标准达成一致,以保护未来的通信;其次,用户必须进行身份验证。如果证书匹配,用户就可以获得 SSH 访问权限。
会话加密协商
当客户端尝试通过 TCP 与服务器连接时,服务器会显示其支持的加密协议和相应版本。如果客户端在协议和版本上有相似的匹配配对,就会达成一致,并以接受的协议开始连接。服务器还使用非对称公钥,客户端可以用它来验证主机的真实性。
一旦建立,双方就会使用所谓的 Diffie-Hellman 密钥交换算法[3]来创建对称密钥。通过这种算法,客户端和服务器都能得到一个共享的加密密钥,该密钥将用于加密整个通信会话。
以下是该算法在非常基础的层面上的工作原理:
- 客户机和服务器会就一个非常大的质数达成一致,当然这个质数没有任何公因子。这个质数值也被称为种子值。
- 接下来,双方商定一个共同的加密机制,通过以特定算法方式操作种子值来生成另一组值。这些机制也称为加密生成器,对种子值进行大量运算。AES (高级加密标准)就是这种生成器的一个例子。
- 双方各自生成另一个质数。这个质数被用作交互的秘密私钥。
- 新生成的私钥与共享号码和加密算法(如 AES)一起用于计算公钥,并将公钥分发给另一台计算机。
- 然后,各方使用他们的个人私钥、另一台机器的共享公钥和原始质数来创建最终的共享密钥。该密钥由两台计算机独立计算,但会在双方创建相同的加密密钥。
- 既然双方都有共享密钥,就可以对整个 SSH 会话进行对称加密。同一密钥可用于加密和解密信息(阅读:对称加密部分)。
现在安全对称加密会话已经建立,必须对用户进行身份验证。
验证用户身份
用户获得 SSH 访问服务器权限之前的最后一个阶段是验证他/她的凭据。为此,大多数 SSH 用户使用密码。用户需要输入用户名和密码。这些凭证会安全地通过对称加密隧道,因此不会被第三方获取。
虽然密码已加密,但仍不建议在安全连接中使用密码。这是因为许多机器人可以简单地暴力破解简易密码或默认密码,从而获得对你账户的 shell 访问权限。建议使用 SSH 密钥对[4]。
这些是一组非对称密钥,用于验证用户身份,无需输入任何密码。
至此,通过验证用户身份,我们就可以顺利登陆远程服务器,愉快地玩耍了。
参考资料
[1]
TCP: https://www.hostinger.com/tutorials/tcp-protocol
[2]
更改 SSH 端口: https://www.hostinger.com/tutorials/how-to-change-ssh-port-vps
[3]
Diffie-Hellman 密钥交换算法: https://en.wikipedia.org/wiki/Diffie–Hellman_key_exchange
[4]
SSH 密钥对: https://www.hostinger.com/tutorials/ssh/how-to-set-up-ssh-keys