介绍
SSH,或安全外壳协议,是一种安全协议,也是远程服务器安全管理的最常见方式。使用多种加密技术,SSH提供了一种在两个参与方之间建立加密安全连接、相互认证并传递命令和输出的机制。
在本指南中,我们将探讨SSH所采用的基础加密技术以及建立安全连接所使用的方法。这些信息有助于理解加密的各个层次以及形成连接和认证双方所需的不同步骤。
理解对称加密、非对称加密和哈希
为了保护信息传输的安全,SSH在交易的各个环节采用了多种不同类型的数据处理技术。这些包括对称加密、非对称加密和哈希。
对称加密
加密和解密数据的组件关系决定了加密方案是对称的还是非对称的。
对称加密是一种加密类型,其中一个密钥可用于加密消息发送给对方,并解密接收到的来自其他参与者的消息。这意味着持有密钥的任何人都可以加密和解密发送给持有密钥的其他人的消息。
这种加密方案通常被称为“共享密钥”加密或“秘密密钥”加密。通常只有一个密钥用于所有操作,或者一对密钥,其中关系是可发现的,而且很容易推导出相反的密钥。
对称密钥被SSH用于加密整个连接。与一些用户的假设相反,可以创建的公钥/私钥非对称密钥对仅用于身份验证,而不是加密连接。对称加密甚至允许密码身份验证受到窥探的保护。
客户端和服务器都有助于建立此密钥,结果的秘密对外部方面是未知的。密钥是通过一种称为密钥交换算法的过程创建的。这种交换导致服务器和客户端通过共享某些公共数据并使用某些秘密数据对其进行操作而独立地得出相同的密钥。稍后会更详细地解释这个过程。
通过这个过程创建的对称加密密钥是基于会话的,构成了服务器和客户端之间发送的数据的实际加密。一旦这个过程建立,剩下的数据必须使用这个共享密钥进行加密。这是在对客户端进行身份验证之前完成的。
SSH可以配置为使用各种不同的对称密码系统,包括高级加密标准(AES)、Blowfish、3DES、CAST128和Arcfour。服务器和客户端都可以决定一个按优先顺序排列的支持密码的列表。客户端列表中的第一个选项如果在服务器上可用,则在双方都用作密码算法。
在Ubuntu 20.04上,默认情况下客户端和服务器都如下所示:
[email protected]
aes128-ctr
aes192-ctr
aes256-ctr
[email protected]
[email protected]
这意味着如果两台Ubuntu 20.04机器彼此连接(未通过配置选项覆盖默认密码),它们将始终默认使用[email protected]
密码来加密它们的连接。
非对称加密
非对称加密与对称加密不同,因为要在单个方向上传输数据,需要两个相关的密钥。其中一个密钥称为私钥,而另一个称为公钥。
公钥可以自由与任何一方分享。它与其配对的密钥相关联,但无法从公钥推导出私钥。公钥与私钥之间的数学关系允许公钥加密只能由私钥解密的消息。这是一种单向能力,意味着公钥无法解密它写入的消息,也无法解密私钥可能发送的任何内容。
私钥应完全保密,绝不能与其他方分享。这是公钥范式工作的关键要求。私钥是唯一能够解密使用相关公钥加密的消息的组件。由于这个事实,任何能够解密这些消息的实体都表明他们控制着私钥。
SSH 在几个不同的地方使用了非对称加密。在用于建立对称加密(用于加密会话)的初始密钥交换过程中,会使用非对称加密。在这个阶段,双方生成临时密钥对并交换公钥,以生成用于对称加密的共享密钥。
关于 SSH 中更广为人知的非对称加密使用来自于基于 SSH 密钥的身份验证。SSH 密钥对可用于验证客户端到服务器的身份。客户端创建一个密钥对,然后将公钥上传到希望访问的任何远程服务器。这将被放置在用户帐户的家目录中的 ~/.ssh
目录下的一个名为 authorized_keys
的文件中。
在建立用于保护服务器和客户端之间通信的对称加密之后,客户端必须进行身份验证才能获得访问权限。服务器可以使用此文件中的公钥对挑战消息进行加密并发送给客户端。如果客户端能够证明它能够解密这条消息,那么它已经证明了拥有相关的私钥。然后服务器可以为客户端设置环境。
哈希
SSH利用的另一种数据操作形式是加密哈希。加密哈希函数是创建一组信息的简洁“签名”或摘要的方法。它们的主要特点是它们永远不应被反转,它们几乎不可能被可预测地影响,并且它们在实践中是唯一的。
使用相同的哈希函数和消息应该产生相同的哈希;修改数据的任何部分应该产生完全不同的哈希。用户不应该能够从给定的哈希生成原始消息,但他们应该能够确定给定的消息是否生成了给定的哈希。
鉴于这些属性,哈希主要用于数据完整性目的和验证通信的真实性。SSH中的主要用途是使用HMAC,即基于哈希的消息认证码。这些用于确保接收到的消息文本完整且未经修改。
作为之前概述的对称加密协商的一部分,将选择消息认证码(MAC)算法。通过遍历客户端可接受的MAC选项列表来选择算法。服务器支持的列表中的第一个将被使用。
在协商加密之后发送的每条消息都必须包含一个MAC,以便对方可以验证数据包的完整性。MAC是根据对称共享密钥、消息的数据包序列号和实际消息内容计算的。
MAC本身作为数据包的最后部分,在对称加密区域之外发送。研究人员通常建议先加密数据,然后计算MAC。
理解SSH的工作原理
您可能已经对SSH的工作原理有基本的了解。SSH协议采用客户端-服务器模型来验证两个参与方并在它们之间加密数据。
服务器组件在指定端口上监听连接。它负责协商安全连接、验证连接方的身份,并在凭证被接受时生成正确的环境。
客户端负责开始与服务器的初始传输控制协议(TCP)握手、协商安全连接、验证服务器身份是否与先前记录的信息匹配,并提供凭证进行身份验证。
SSH会话分为两个独立的阶段。第一个阶段是达成协议并建立加密以保护未来的通信。第二个阶段是对用户进行身份验证并发现是否应授予对服务器的访问权限。
会话加密协商
当客户端建立TCP连接时,服务器会回应支持的协议版本。如果客户端能够匹配其中一个可接受的协议版本,连接将继续。服务器还提供其公共主机密钥,客户端可以使用它来检查是否为预期的主机。
此时,双方使用一种称为迪菲-赫尔曼算法的版本来协商会话密钥。该算法(及其变体)使每一方能够将自己的私有数据与另一系统的公共数据相结合,得到相同的秘密会话密钥。
会话密钥将用于加密整个会话。用于该过程的公钥和私钥对与用于对客户端进行身份验证的SSH密钥完全不同。
经典迪菲-赫尔曼过程的基础包括:
- 双方同意一个大素数,将作为种子值。
- 双方同意一个加密生成器(通常为AES),将用于以预定义方式操作值。
- 每个一方独立地提出另一个素数,对另一方保密。这个数作为此次交互的私钥使用(不同于用于身份验证的私有SSH密钥)。
- 生成的私钥、加密生成器和共享质数用于生成一个公钥,该公钥是从私钥派生的,但可以与另一方共享。
- 然后,双方交换它们生成的公钥。
- 接收实体使用自己的私钥、对方的公钥和原始的共享质数来计算一个共享秘密密钥。虽然这是由每个参与方独立计算的,但使用相反的私钥和公钥,它将导致相同的共享秘密密钥。
- 然后,共享秘密用于加密所有随后的通信。
此过程允许每个参与方平等地参与生成共享秘密,这样就不会让一方控制秘密。它还实现了在不通过不安全渠道发送信息的情况下生成相同的共享秘密的任务。用于连接其余部分的共享秘密加密称为二进制数据包协议。
生成的秘密是对称密钥,意味着用于加密消息的同一密钥可以在另一侧用于解密。其目的是将所有进一步的通信包装在一个加密隧道中,外部无法解密。
建立会话加密之后,用户身份验证阶段开始。
验证用户对服务器的访问权限
下一步涉及对用户进行身份验证并确定访问权限。根据服务器接受的内容,可以使用几种身份验证方法。
一般方法是密码验证,即服务器提示客户端输入他们尝试登录的帐户密码。密码通过协商加密发送,因此对外部方面而言是安全的。
尽管密码将被加密,但由于密码复杂性的限制,通常不建议使用此方法。与其他身份验证方法相比,自动脚本可以轻松破解普通长度的密码。
最流行和推荐的替代方法是使用SSH密钥对。SSH密钥对是非对称密钥,意味着两个关联的密钥具有不同的功能。
公钥用于加密只能使用私钥解密的数据。公钥可以自由共享,因为虽然它可以为私钥加密,但没有方法从公钥派生私钥。
使用SSH密钥对进行身份验证发生在前一节所述的建立对称加密之后。该过程如下进行:
- 客户端首先向服务器发送一个想要用于身份验证的密钥对的ID。
- 服务器检查客户端尝试登录的账户的
authorized_keys
文件,查找该密钥ID。 - 如果在文件中找到具有匹配ID的公钥,服务器将生成一个随机数,并使用公钥对该数字进行加密。
- 服务器将这个加密消息发送给客户端。
- 如果客户端实际上拥有相关的私钥,它将能够使用该密钥解密消息,揭示原始数字。
- 客户端将解密后的数字与用于加密通信的共享会话密钥相结合,并计算此值的MD5哈希。 MD5是一种使用哈希函数生成128位哈希值的消息摘要算法。
- 然后客户端将这个MD5哈希作为对加密数字消息的回答发送回服务器。
- 服务器使用相同的共享会话密钥和发送给客户端的原始数字来计算自己的MD5值。 它将自己的计算与客户端发送回来的计算进行比较。 如果这两个值匹配,就证明客户端拥有私钥,客户端已经通过了身份验证。
总的来说,密钥的不对称性允许服务器使用公钥加密消息发送给客户端。然后客户端可以通过正确解密消息来证明自己持有私钥。在这个模型中,所使用的两种加密方式(对称共享密钥和不对称公钥/私钥)能够分别利用它们特定的优势。
结论
了解SSH连接协商步骤以及加密层可以帮助你更好地理解当你登录到远程服务器时发生了什么。现在你可以认识到各种组件和算法之间的关系,并理解所有这些部分是如何结合在一起的。要了解更多关于SSH的信息,请查阅以下指南:
- 如何在Linux服务器上配置SSH基于密钥的身份验证
- 如何使用SSH连接到远程服务器
- 如何设置SSH密钥适用于各种操作系统
- SSH基础知识:使用SSH服务器、客户端和密钥进行工作