(根据Vindicar , Karroplan和其他habro社区成员的建议,更改了“ SSH协议操作算法”一词的标题)在定期阅读有关SSH的文章时,我注意到他们的作者有时不知道该协议如何工作。 在大多数情况下,他们仅限于考虑密钥生成主题并描述主要命令的选项。 即使是经验丰富的系统管理员,在讨论SSH问题时也会经常胡说八道,以各种方式发表意见:使用客户端的公共SSH密钥加密传输的数据并使用私钥解密,或者:在传输过程中使用RSA算法加密数据。
我将尝试使SSH协议的操作更为清晰,同时考虑RSA算法和用户授权密钥的作用...

SSH协议算法可分为三个级别,每个级别位于上一个级别之上:传输(打开安全通道),身份验证,连接。 为了图片的完整性,我还将添加一个网络连接设置级别,尽管该级别正式低于SSH。
1.建立一个TCP连接
我不会详细讨论TCP / IP堆栈的原理,因为该主题在Runet中有很好的记录。 如有必要,您可以轻松找到信息。
此时,客户端通过服务器配置文件/ etc / ssh / sshd_config中的Port选项(默认值:22)指定的TCP端口连接到服务器。
2.打开安全通道
2.1身份交换在建立TCP连接之后,客户端和服务器(以下称为当事方)交换SSH协议的版本以及确定协议兼容性和选择操作算法所需的其他支持数据。
2.2算法选择:密钥交换,加密,压缩等使用SSH时,使用了很多算法,其中一些算法用于加密,第二种算法用于密钥交换,第三种算法用于压缩传输的数据,等等。 在此步骤中,各方将彼此发送受支持算法的列表,每个列表顶部的算法具有最高优先级。 然后,将获得的列表中的算法与系统中可用的算法进行比较,并选择每个列表中匹配的第一个算法。
可以使用以下命令查看可用的客户端密钥交换算法(用于获取会话密钥)的列表:
ssh -Q kex
系统中可用的对称算法列表(用于通道加密):
ssh -Q cipher
客户端授权密钥类型的列表:
ssh -Q key-cert
通过备注onix74更新:该出版物中使用的所有命令都与Ubuntu 18.04 LTS的OpenSSH版本7.6相关。
2.3获取会话加密密钥根据算法的版本,获取会话密钥的过程可能会有所不同,但总的来说,它可以归结为以下几点:
会话密钥是在通道的整个生命周期内专门创建的,并在关闭连接时被销毁。
3.客户端身份验证
直到现在,当客户端和服务器建立了用于加密数据传输的通道时,它们才可以使用密码或密钥进行身份验证。
一般而言,密钥身份验证按以下方式进行:
- 客户端向服务器发送用户名(用户名)及其公钥。
- 服务器检查文件/home/username/.ssh/authorized_keys中是否有客户端发送的公钥。 如果找到了公钥,则服务器会生成一个随机数,并使用客户端的公钥对其进行加密,然后将结果发送给客户端。
- 客户端使用其私钥解密消息,然后将结果发送到服务器。
- 服务器检查结果是否与最初使用客户端的公钥加密的数字匹配,如果匹配,则认为身份验证成功。
4.连接级别
完成上述所有过程后,用户就有机会将命令发送到服务器或复制文件。
在此级别上,提供了:通道的乘法(通过将多个通道合并为一个通道来操作多个通道到一台服务器的能力),隧道化等。
从理论到实践
好吧,现在,我认为,读者有一个完全合乎逻辑的问题:为什么您需要了解SSH协议的所有这些细节,如果在日常工作中对密钥创建命令(ssh-keygen)有足够的了解,打开终端会话(ssh),文件传输( SCP)?
作为答案,我们可以回想一下将标准SSH端口更改为其他端口的话题,这经常成为Habr上的holivar ...
在我自己的实践中,我不会回想起一台服务器每天都不会在端口22上监听外部网络的情况。 在SSH在标准端口上为您工作的情况下(并且不受任何保护),即使仅通过密钥进行身份验证并且没有密码猜测令人恐惧,但由于来自不诚实客户端的不断说谎的请求,服务器仍然被迫做很多无用的工作:建立TCP连接,选择算法,生成会话密钥,发送身份验证请求,编写日志文件。
如果第22个端口上没有任何内容,或者该端口使用iptables(或诸如fail2ban之类的附件)进行了保护,则攻击者将在建立TCP连接的阶段放弃。
最有趣的描述看起来像一张桌子*
构型 | 骇客机会 | 洪水损失** |
---|
22端口 密码授权, 没有保护 | 高 | 高 |
22端口 关键授权, 没有保护 | 平均*** | 高 |
22端口 关键授权, 基于失败授权尝试的限制进行保护 | 低 | 中**** |
非标口 密码授权, 没有保护 | 高 | 低 |
非标口 关键授权, 没有保护 | 平均*** | 低 |
非标口 关键授权, 基于失败授权尝试的限制进行保护 | 低 | 低 |
*-参数值(高,中,低)本质上是相对的,仅用于比较指标。
**-这意味着服务器用于处理通常流向端口22的大量请求的资源消耗(处理器,磁盘,网络通道等)。
***-如果使用RSA密钥进行授权是很困难的,但是无限次的授权尝试使这成为可能。
****-授权尝试的次数是有限的,但是服务器仍然必须从大量入侵者那里进行处理。
附加材料