SSH学习

Posted likaiming

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSH学习相关的知识,希望对你有一定的参考价值。

简介

SSH或Secure Shell是一种远程管理协议,允许用户通过Internet控制和修改远程服务器。该服务是作为未加密Telnet的安全替代品创建的,它使用加密技术确保与远程服务器之间的所有通信都以加密的方式进行。它提供了一种机制,用于验证远程用户,将输入从客户机传输到主机,并将输出转发回客户机。

一个使用SSH远程连接的典型例子如下:

技术分享图片

本SSH教程将介绍SSH如何工作的基础知识,以及协议用于提供安全的远程访问方法的底层技术。它将覆盖不同的层和使用的加密类型,以及每个层的用途。

SSH如何工作

SSH命令由3个不同的部分组成:

ssh {user}@{host}

SSH密钥命令指示系统希望打开加密的安全Shell连接。{user}表示要访问的帐户。例如,您可能希望访问根用户,它基本上是系统管理员修改系统上任何内容的完全权限的同义词。{host}表示要访问的计算机。这可以是IP地址(例如244.235.23.19)或域名(例如www.xyzdomain.com)。

当您点击回车时,系统会提示您输入所请求帐户的密码。当你输入密码时,屏幕上什么也不会显示,但实际上你的密码正在被传输。输入完成后,再次按回车。如果您的密码正确,您将看到一个远程终端窗口。

如果您想了解更多SSH命令,请在这里找到它们

了解不同的加密技术

SSH相对于其前辈的显著优势是使用加密来确保主机和客户机之间的信息安全传输。主机是指您试图访问的远程服务器,而客户端是您用来访问主机的计算机。SSH使用了三种不同的加密技术:

  • 对称加密
  • 不对称加密
  • 散列

对称加密

对称加密是一种加密形式,客户机和主机都使用密钥对消息进行加密和解密。实际上,任何拥有密钥的人都可以解密传输的消息。

技术分享图片

对称加密通常称为共享密钥加密或共享秘密加密。通常只使用一个键,或者有时使用一对键,其中一个键可以使用另一个键轻松计算。

对称密钥用于在SSH会话期间加密整个通信。客户端和服务器都使用约定的方法派生密钥,并且生成的密钥从不向任何第三方公开。创建对称密钥的过程是通过密钥交换算法实现的,这个算法之所以特别安全,是因为这个密钥从来没有在客户机和主机之间传输过。相反,两台计算机共享公共数据片段,然后对其进行操作,独立计算密钥。即使另一台机器捕获公开共享的数据,它也无法计算密钥,因为密钥交换算法尚不清楚

但是,必须注意,秘密令牌是特定于每个SSH会话的,并且是在客户机身份验证之前生成的。一旦密钥生成,在两台机器之间移动的所有数据包都必须由私钥加密。这包括用户输入到控制台的密码,因此凭证总是受到保护,不受网络数据包嗅探器的攻击。

存在各种对称加密密码,包括但不限于AES(高级加密标准)、CAST128、Blowfish等。在建立安全连接之前,客户机和主机通过发布支持的密码列表(按优先级排序)来决定使用哪个密码。来自客户机的最喜欢的密码支持出现在主机列表中的密码被用作双向密码。

例如,如果两台Ubuntu 14.04 LTS机器通过SSH相互通信,它们将使用aes128-ctr作为默认密码。

非对称加密

与对称加密不同,非对称加密使用两个独立的密钥进行加密和解密。这两个密钥称为公钥和私钥。这两个键一起形成一个公私密钥对。

技术分享图片

顾名思义,公钥是公开分发的,并与所有各方共享。虽然它在功能上与私钥密切相关,但私钥不能从公钥进行数学计算。这两个密钥之间的关系非常复杂:由一台机器的公钥加密的消息只能由同一台机器的私钥解密。这种单向关系意味着公钥不能解密它自己的消息,也不能解密由私钥加密的任何内容。

私钥必须保持私有,即要保护连接,任何第三方都不能知道它。整个连接的优点在于,私有密匙从未被公开,因为它是唯一能够解密使用自己的公钥加密的消息的组件。因此,任何有能力解密公开签名消息的一方都必须拥有相应的私钥。

与一般的理解不同,非对称加密并不用于加密整个SSH会话。它只在对称加密的密钥交换算法中使用。在启动安全连接之前,双方生成临时公私密钥对,并共享各自的私钥以生成共享密钥。

一旦建立了安全的对称通信,服务器就使用客户机公钥来生成和挑战它,并将其传输给客户机进行身份验证。如果客户机能够成功解密消息,则意味着它持有连接所需的私钥。然后开始SSH会话。

hash

单向散列是用于安全Shell连接的另一种加密形式。单向哈希函数与上述两种加密形式的不同之处在于,它们永远不会被解密。它们为每个输入生成一个固定长度的惟一值,该值不显示可以利用的明确趋势。这使得它们几乎不可能逆转。

技术分享图片

从给定的输入生成密码散列很容易,但从该散列生成输入则不可能。这意味着,如果客户机持有正确的输入,则可以生成加密图形散列并比较其值,以验证是否拥有正确的输入。

SSH使用散列来验证消息的真实性。这是使用HMACs或基于散列的消息身份验证代码完成的。这确保接收到的命令不会以任何方式被篡改。

在选择对称加密算法的同时,还选择了合适的消息认证算法。这与选择密码的方式类似,如对称加密部分中所述。

传输的每个消息必须包含一个MAC,它使用对称密钥、包序列号和消息内容进行计算。它作为通信包的结束部分发送到对称加密的数据之外。

SSH如何使用这些加密技术

SSH的工作方式是利用客户机-服务器模型来允许对两个远程系统进行身份验证,并对在它们之间传递的数据进行加密。

默认情况下,SSH操作TCP端口22(如果需要可以更改)。主机(服务器)监听端口22(或任何其他SSH分配的端口)上的传入连接。它通过验证客户机并在验证成功时打开正确的shell环境来组织安全连接。

客户机必须通过启动与服务器的TCP握手来启动SSH连接,确保安全的对称连接,验证服务器显示的标识是否与以前的记录(通常记录在RSA密钥存储文件中)匹配,并提供验证连接所需的用户凭证。

建立连接有两个阶段:首先,两个系统必须就加密标准达成一致,以保护未来的通信;其次,用户必须对自己进行身份验证。如果凭证匹配,则授予用户访问权限。

会话加密谈判

当客户机试图通过TCP连接到服务器时,服务器将显示它所支持的加密协议和各自的版本。如果客户端具有类似的匹配协议对和版本,则达成协议,并使用接受的协议启动连接。服务器还使用非对称公钥,客户机可以使用该公钥来验证主机的真实性。

一旦确定了这一点,双方就会使用所谓的Diffie-Hellman密钥交换算法来创建对称密钥。该算法允许客户机和服务器都获得一个共享加密密钥,该密钥将用于加密整个通信会话。

下面是算法在非常基础的层面上的工作原理:

  • 客户机和服务器都同意一个非常大的素数,这当然没有任何共同的因子。这个素数值也称为种子值。
  • 接下来,双方同意使用一种通用加密机制,通过以特定的算法方式操作种子值生成另一组值。这些机制也称为加密生成器,对种子执行大型操作。这种生成器的一个例子是AES(高级加密标准)。
  • 两边独立生成另一个质数。这用作交互的秘密私钥。
  • 这个新生成的私钥使用共享编号和加密算法(例如AES)来计算分发到另一台计算机的公钥。
  • 然后双方使用他们的个人私钥、另一台机器的共享公钥和原始素数来创建最终的共享密钥。此密钥由两台计算机独立计算,但将在两侧创建相同的加密密钥。
  • 既然双方都有一个共享密钥,那么就可以对称地加密整个SSH会话。可以使用相同的密钥加密和解密消息(请参阅:对称加密部分)。

既然已经建立了安全的对称加密会话,就必须对用户进行身份验证。

验证用户

在授予用户访问服务器的权限之前,最后一个阶段是对其凭证进行身份验证。为此,大多数SSH用户使用密码。要求用户输入用户名,然后输入密码。这些凭证安全地通过对称加密的通道,因此不会被第三方捕获。

虽然密码是加密的,但仍然不建议在安全连接中使用密码。这是因为许多机器人可以简单地暴力破解简单的或默认的密码,并获得访问您的帐户。相反,推荐的替代方案是SSH密钥对。

这是一组非对称密钥,用于对用户进行身份验证,而不需要输入任何密码。

结论

深入了解SSH的底层工作方式可以帮助用户理解这项技术的安全方面。大多数人认为这个过程是极其复杂和不可理解的,但它比大多数人认为的要简单得多。如果您想知道计算机计算散列和验证用户需要多长时间,那么,不到一秒钟就可以完成。事实上,在Internet上传输数据所花费的时间是最多的。

希望这篇SSH教程能够帮助您了解如何将不同的技术组合在一起来创建一个健壮的系统,其中每种机制都可以发挥非常重要的作用。而且,现在您知道了为什么SSH一出现Telnet就成为了过去。

 

以上是关于SSH学习的主要内容,如果未能解决你的问题,请参考以下文章

python 机器学习有用的代码片段

学习笔记:python3,代码片段(2017)

学习 PyQt5。在我的代码片段中找不到错误 [关闭]

PHP必用代码片段

Kotlin学习之旅解决错误:kotlin.NotImplementedError: An operation is not implemented: Not yet implemented(代码片段

golang代码片段(摘抄)