了解SSH加密和连接过程

来自菜鸟教程
跳转至:导航、​搜索

介绍

SSH 或安全外壳,是一种安全协议,也是安全管理远程服务器的最常用方法。 使用多种加密技术,SSH 提供了一种机制,用于在两方之间建立加密安全连接,对每一方进行身份验证,以及来回传递命令和输出。

在本指南中,我们将研究 SSH 使用的底层加密技术以及它用于建立安全连接的方法。 此信息可用于了解加密的各个层以及形成连接和验证双方所需的不同步骤。

了解对称加密、非对称加密和散列

为了确保信息传输的安全,SSH 在交易的不同点采用了多种不同类型的数据操作技术。 这些包括对称加密、非对称加密和散列的形式。

对称加密

加密和解密数据的组件之间的关系决定了加密方案是对称的还是不对称的。

对称加密是一种加密类型,其中一个密钥可用于加密发送给对方的消息,也可以解密从另一个参与者收到的消息。 这意味着任何持有密钥的人都可以加密和解密发给其他持有密钥的人的消息。

这种类型的加密方案通常称为“共享秘密”加密或“密钥”加密。 通常只有一个密钥用于所有操作或一对密钥,其中关系是可发现的,并且派生相反的密钥是微不足道的。

对称密钥 被 SSH 用来加密整个连接。 与一些用户的假设相反,可以创建的公钥/私钥不对称密钥对仅用于身份验证,而不是加密连接。 对称加密甚至可以保护密码身份验证免受窥探。

客户端和服务器都为建立这个密钥做出了贡献,而由此产生的秘密永远不会被外界知道。 密钥是通过称为 密钥交换算法 的过程创建的。 这种交换导致服务器和客户端都通过共享某些公共数据并使用某些秘密数据操作它们来独立地到达相同的密钥。 稍后将更详细地解释该过程。

此过程创建的对称加密密钥是基于会话的,构成服务器和客户端之间发送的数据的实际加密。 一旦确定了这一点,其余数据必须使用此共享密钥进行加密。 这是在验证客户端之前完成的。

SSH 可以配置为使用各种不同的对称密码系统,包括高级加密标准 (AES)、Blowfish、3DES、CAST128 和 Arcfour。 服务器和客户端都可以决定他们支持的密码列表,按偏好排序。 服务器上可用的客户端列表中的第一个选项用作双向密码算法。

在 Ubuntu 20.04 上,客户端和服务器都默认如下:

  • chacha20-poly1305@openssh.com
  • aes128-ctr
  • aes192-ctr
  • aes256-ctr
  • aes128-gcm@openssh.com
  • aes256-gcm@openssh.com

这意味着如果两台 Ubuntu 20.04 机器相互连接(不通过配置选项覆盖默认密码),它们将始终默认使用 chacha20-poly1305@openssh.com 密码来加密它们的连接。

非对称加密

非对称加密与对称加密不同,因为要在一个方向上发送数据,需要两个关联的密钥。 这些密钥中的一个称为私钥,而另一个称为公钥。

公钥可以与任何一方自由共享。 它与其配对密钥相关联,但私钥 不能 从公钥派生。 公钥和私钥之间的数学关系允许公钥加密只能由私钥解密的消息。 这是一种单向能力,这意味着公钥无法解密它写入的消息,也无法解密私钥可能发送的任何内容。

私钥 应完全保密,绝不应与另一方共享。 这是公钥范式工作的关键要求。 私钥是唯一能够解密使用相关公钥加密的消息的组件。 凭借这一事实,任何能够解密这些消息的实体都已证明他们控制着私钥。

SSH 在几个不同的地方使用非对称加密。 在用于设置对称加密(用于加密会话)的初始密钥交换过程中,使用了非对称加密。 在这个阶段,双方产生临时密钥对并交换公钥,以产生将用于对称加密的共享秘密。

对 SSH 的非对称加密的更深入讨论来自基于 SSH 密钥的身份验证。 SSH 密钥对可用于向服务器验证客户端。 客户端创建一个密钥对,然后将公钥上传到它希望访问的任何远程服务器。 这被放置在远程服务器上用户帐户主目录的 ~/.ssh 目录中名为 authorized_keys 的文件中。

在建立对称加密以保护服务器和客户端之间的通信后,客户端必须进行身份验证才能被允许访问。 服务器可以使用此文件中的公钥加密发送给客户端的质询消息。 如果客户端可以证明它能够解密此消息,则表明它拥有相关的私钥。 然后服务器可以为客户端设置环境。

散列

SSH 利用的另一种数据操作形式是加密哈希。 加密散列函数是创建简洁“签名”或一组信息摘要的方法。 它们的主要区别属性是它们永远不会被逆转,它们几乎不可能受到可预测的影响,而且它们实际上是独一无二的。

使用相同的散列函数和消息应该产生相同的散列; 修改数据的任何部分都应该产生完全不同的哈希值。 用户应该 能够从给定的散列生成原始消息,但他们 应该 能够判断给定的消息是否产生给定的散列。

鉴于这些属性,散列主要用于数据完整性目的和验证通信的真实性。 SSH 中的主要用途是与 HMAC 或基于散列的消息身份验证代码一起使用。 这些用于确保收到的消息文本完整且未修改。

作为前面概述的对称加密协商的一部分,选择了 消息验证码 (MAC) 算法 。 该算法是通过处理客户端可接受的 MAC 选项列表来选择的。 将使用此列表中服务器支持的第一个。

协商加密后发送的每条消息都必须包含一个 MAC,以便对方可以验证数据包的完整性。 MAC 是根据对称共享密钥、消息的数据包序列号和实际消息内容计算得出的。

MAC 本身作为数据包的最后部分发送到对称加密区域之外。 研究人员一般推荐这种先加密数据再计算MAC的方法。

了解 SSH 的工作原理

您可能已经对 SSH 的工作原理有了基本的了解。 SSH 协议采用客户端-服务器模型对两方进行身份验证并加密他们之间的数据。

服务器组件在指定端口上侦听连接。 它负责协商安全连接、验证连接方以及在凭据被接受时生成正确的环境。

客户端负责开始与服务器的初始传输控制协议 (TCP) 握手,协商安全连接,验证服务器的身份是否与先前记录的信息匹配,并提供凭据以进行身份验证。

SSH 会话在两个不同的阶段建立。 首先是同意并建立加密以保护未来的通信。 第二阶段是对用户进行身份验证并发现是否应授予对服务器的访问权限。

协商会话加密

当客户端建立 TCP 连接时,服务器会使用它支持的协议版本进行响应。 如果客户端可以匹配可接受的协议版本之一,则连接继续。 服务器还提供其公共主机密钥,客户端可以使用它来检查这是否是预期的主机。

此时,双方使用称为 Diffie-Hellman 算法 的版本协商会话密钥。 该算法(及其变体)使每一方都可以将他们自己的私有数据与来自其他系统的公共数据相结合,以获得相同的秘密会话密钥。

会话密钥将用于加密整个会话。 用于此部分过程的公钥和私钥对与用于向服务器验证客户端的 SSH 密钥完全分开。

经典 Diffie-Hellman 程序的基础是:

  • 双方就一个大质数达成一致,这将作为种子值。
  • 双方就加密生成器(通常是 AES)达成一致,该生成器将用于以预定义的方式操作值。
  • 独立地,每一方提出另一个对对方保密的素数。 此数字用作此交互的私钥(不同于用于身份验证的 SSH 私钥)。
  • 生成的私钥、加密生成器和共享素数用于生成从私钥派生的公钥,但可以与对方共享。
  • 然后两个参与者交换他们生成的公钥。
  • 接收实体使用自己的私钥、对方的公钥和原始共享素数来计算共享密钥。 尽管这是由每一方独立计算的,使用相反的私钥和公钥,它将导致 相同 共享密钥。
  • 然后使用共享密钥对随后的所有通信进行加密。

这一过程允许每一方平等地参与生成共享秘密,不允许一方控制秘密。 它还完成了生成相同共享秘密的任务,而不必通过不安全的渠道发送该信息。 用于其余连接的共享秘密加密称为二进制数据包协议

生成的密钥是对称密钥,这意味着用于加密消息的相同密钥可用于在另一端对其进行解密。 这样做的目的是将所有进一步的通信包装在一个无法被外人破译的加密隧道中。

会话加密建立后,用户认证阶段开始。

验证用户对服务器的访问权限

下一步涉及对用户进行身份验证并决定访问权限。 根据服务器接受的内容,有几种方法可用于身份验证。

一般的方法是密码验证,即服务器提示客户端输入他们尝试登录的帐户的密码。 密码是通过协商加密发送的,因此对外界来说是安全的。

即使密码会被加密,但由于密码复杂性的限制,一般不推荐使用这种方法。 与其他身份验证方法相比,自动化脚本可以很容易地破解正常长度的密码。

最受欢迎和推荐的替代方案是使用 SSH 密钥对 。 SSH 密钥对是非对称密钥,这意味着两个关联的密钥具有不同的功能。

公钥用于加密只能用私钥解密的数据。 公钥可以自由共享,因为虽然它可以为私钥加密,但没有任何方法可以从公钥中导出私钥。

使用 SSH 密钥对的身份验证在建立对称加密后开始,如上一节所述。 该过程如下:

  • 客户端首先向服务器发送它想要验证的密钥对的 ID。
  • 服务器检查客户端尝试登录的帐户的 authorized_keys 文件以获取密钥 ID。
  • 如果在文件中找到具有匹配 ID 的公钥,服务器会生成一个随机数并使用该公钥加密该数字。
  • 服务器向客户端发送此加密消息。
  • 如果客户端确实拥有相关的私钥,它将能够使用该密钥解密消息,从而显示原始数字。
  • 客户端将解密后的数字与用于加密通信的共享会话密钥相结合,并计算此值的 MD5 哈希 。 MD5 是一种消息摘要算法,它使用散列函数生成 128 位散列值。
  • 然后,客户端将此 MD5 散列发送回服务器,作为对加密数字消息的答复。
  • 服务器使用相同的共享会话密钥和它发送给客户端的原始数字来自行计算 MD5 值。 它将自己的计算与客户端发回的计算进行比较。 如果这两个值匹配,则证明客户端拥有私钥并且客户端已通过身份验证。

总之,密钥的不对称性允许服务器使用公钥加密发送给客户端的消息。 然后,客户端可以通过正确解密消息来证明它持有私钥。 使用的两种类型的加密(对称共享密钥和非对称公钥/私钥)都能够在此模型中利用它们的特定优势。

结论

了解 SSH 中的连接协商步骤和加密层可以帮助您更好地了解登录到远程服务器时发生的情况。 现在您可以识别各种组件和算法之间的关系,并了解所有这些部分是如何组合在一起的。 要了解有关 SSH 的更多信息,请查看以下指南: