介绍
SSH或安全shell是一种安全协议,是安全管理远程服务器的最常用方法。 使用多种加密技术,SSH提供了一种用于在两方之间建立加密安全连接,向每一方认证每一方,以及来回传递命令和输出的机制。
在其他的指南,我们已经讨论了如何配置基于SSH密钥的访问 , 如何使用SSH连接 ,以及一些SSH的技巧和窍门 。
在本指南中,我们将检查SSH使用的底层加密技术及其用于建立安全连接的方法。 此信息可用于理解加密的各个层以及形成连接和认证双方所需的不同步骤。
对称加密,非对称加密和散列
为了确保信息的传输,SSH在事务中的各个点采用多种不同类型的数据操纵技术。 这些包括对称加密,不对称加密和散列的形式。
对称加密
加密和解密数据的组件的关系确定加密方案是对称的还是不对称的。
对称加密是一种加密类型,其中一个密钥可以用于加密到对方的消息,并且还解密从另一参与者接收的消息。 这意味着任何持有密钥的人都可以向任何持有密钥的人加密和解密消息。
这种类型的加密方案通常被称为“共享秘密”加密或“秘密密钥”加密。 通常只有用于所有操作的单个密钥,或者一对密钥,其中关系容易被发现,并且导出相反的密钥是微不足道的。
SSH使用对称密钥来加密整个连接。 与某些用户假设的相反,可以创建的公共/私有非对称密钥对仅用于认证,而不是加密连接。 对称加密允许甚至密码认证被防止窥探。
客户端和服务器都有助于建立这个密钥,并且得到的秘密从来不为外部各方所知。 通过被称为密钥交换算法的过程创建密钥。 这种交换导致服务器和客户端通过共享某些公共数据并且利用某些秘密数据来操纵它们而独立地到达相同的密钥。 稍后将更详细地解释该过程。
由此过程创建的对称加密密钥是基于会话的,并构成在服务器和客户端之间发送的数据的实际加密。 一旦建立,其余的数据必须用这个共享秘密加密。 这是在认证客户端之前完成的。
SSH可以配置为使用各种不同的对称密码系统,包括AES,Blowfish,3DES,CAST128和Arcfour。 服务器和客户端可以决定他们支持的密码的列表,按照偏好排序。 服务器上可用的客户端列表中的第一个选项用作两个方向上的密码算法。
在Ubuntu 14.04,客户端和服务器的默认这样的: aes128-ctr
, aes192-ctr
, aes256-ctr
, arcfour256
, arcfour128
, aes128-gcm@openssh.com
, aes256-gcm@openssh.com
, chacha20-poly1305@openssh.com
, aes128-cbc
, blowfish-cbc
, cast128-cbc
, aes192-cbc
, aes256-cbc
, arcfour
。
这意味着,如果两个的Ubuntu 14.04机器都互相连接(没有通过重写配置选项的默认密码),他们总是会使用aes128-ctr
密码加密他们的连接。
不对称加密
不对称加密不同于对称加密,因为在单个方向上发送数据,需要两个相关联的密钥。 其中的一个密钥被称作私有密钥 ,而另一种是所谓的公共密钥 。
公钥可以自由地与任何一方共享。 它与它的配对的键相关联,但私钥不能从公开密钥导出。 公钥和私钥之间的数学关系允许公钥加密只能由私钥解密的消息。 这是一种单向能力,意味着公钥无法解密其写入的消息,也不能解密私钥可能发送的任何内容。
私钥应该完全保密,不应该与另一方共享。 这是公钥模式工作的关键要求。 私钥是能够解密使用相关联的公钥加密的消息的唯一组件。 由于这个事实,任何能够解密这些消息的实体已经表明它们控制私钥。
SSH在几个不同的地方使用非对称加密。 期间用于建立对称加密(用于会话加密)的初始密钥交换处理,非对称加密时使用。 在这个阶段,双方产生临时密钥对并交换公钥以产生将用于对称加密的共享秘密。
使用SSH进行非对称加密的更多讨论来自基于SSH密钥的身份验证。 SSH密钥对可用于向服务器验证客户端。 客户端创建一个密钥对,然后将公钥上传到希望访问的任何远程服务器。 这是摆在一个名为authorized_keys
的中~/.ssh
目录中的用户帐户的主目录中的远程服务器上。
在建立对称加密以保证服务器和客户端之间的通信后,客户端必须认证以允许访问。 服务器可以使用此文件中的公钥来加密到客户端的质询消息。 如果客户端可以证明它能够解密这个消息,它已经证明它拥有相关的私钥。 服务器然后可以为客户端设置环境。
散列
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散列发送回服务器作为对加密的数字消息的答案。
- 服务器使用相同的共享会话密钥和它发送到客户端的原始号码来自己计算MD5值。 它将自己的计算与客户端发回的计算进行比较。 如果这两个值匹配,则证明客户端拥有私钥并且客户端被认证。
如您所见,密钥的不对称性允许服务器使用公钥加密到客户端的消息。 客户端然后可以通过正确解密消息来证明其保存私钥。 所使用的两种类型的加密(对称共享密钥和非对称公钥 - 私钥)都能够利用其在此模型中的特定优势。
结论
了解SSH中的连接协商步骤和工作中的加密层可以帮助您更好地了解当您登录到远程服务器时发生了什么。 希望你现在有一个更好的想法各种组件和算法之间的关系,并了解如何所有这些部分组合在一起。