介绍
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工作中的加密层可帮助您更好地了解登录到远程服务器时发生的情况。希望你现在对各种组件和算法之间的关系有更好的了解,并且理解所有这些组件如何组合在一起。