SSH登录原理

任务

在对ssh暴力破解有了感性认识后,下面对ssh的相关理论进行学习总结

背景

The SSH protocol (also referred to as Secure Shell) is a method for secure remote login from one computer to another. It provides several alternative options for strong authentication, and it protects the communications security and integrity with strong encryption. It is a secure alternative to the non-protected login protocols (such as telnet, rlogin) and insecure file transfer methods (such as FTP).

【1】

ssh是一种远程登录服务器的安全协议,它提供了多种严格的认证方式,是无保护登陆协议如telnet与不安全的文件传输方式如FTP的安全替代。

虽然SSH最初是由芬兰的一家公司开发的,但是因为受版权和加密算法的限制,现在很多人都转而使用OpenSSH。OpenSSH是SSH的替代软件,而且是免费的,可以预计将来会有越来越多的人使用它而不是SSH。【2】

而本人使用的阿里云服务器中正是内置了OpenSSH软件,并主要通过这一途径进行远程登录。同时,在云计算数据中心需求上升以及企业数字化转型加速的当下,云服务器市场规模不断扩大。云服务跻身千亿级产业,未来市场增速保持在30%以上。【3】

在本人使用云服务器的过程中,曾接收到被SSH暴力破解的警告。而目前针对网络设备的主要安全威胁有【4】

  • 非法用户登录网络设备进行配置,进行破坏性操作;
  • 非法用户窃取网络设备上的资源;
  • 非法用户篡改网络设备上的文件,尤其是配置文件:
  • 利用协议栈的漏洞对设备进行攻击
  • 拒绝服务攻击(DOS)

其中前四种攻击都是与非法用户登录相关的,最后一种DOS攻击也是因为某些网络设备被黑客非法登录,并被利用为进行DOS攻击的工具。由此看来, 对于网络设备而言,最主要的安全性威胁来自于非法用户的登录,故本文的研究主要集中基于OpenSSH通过SSH协议远程登录云服务器的安全控制。

SSH协议

协议服从客户端-服务器模型,由客户端向服务器发起连接请求,由于服务器的SSH端口处于监听状态,在接收到请求后便向客户端返回公钥,并在验证后开放通信,客户即可登录服务器所在操作系统。

SSH登录的5个阶段

  1. 版本号协商阶段
    • 客户端比较后传给服务端
  2. 密钥和算法协商阶段
    • 生成会话ID与会话密钥(session keys),可以避免身份认证密钥被获取后破解历史数据的可能
  3. 认证阶段
    • 最常用两种方式
      • 口令(用户名与密码)
      • 证书
    • 将公钥加密传输数据都加上上面过程生成的会话密钥
  4. 会话请求阶段
  5. 会话交互阶段

SSH密钥

www.ssh.com 文章目录中截取如下,能够对密钥的命名和用途总览:

  • SSH keys are authentication credentials
    • Authorized keys define who can access each system
    • Identity keys identify users and provide access
  • Device authentication keys
    • Host keys authenticate servers
    • Known host keys

OpenSSH的连接过程

在这里插入图片描述

通过具体的实例分析免密登录经历了哪些阶段

客户端发送认证密钥

ssh-copy-id -i ~/.ssh/id_rsa.pub -p 22 root@60.xxx.xxx.xxx

将本地生成的公钥传递至服务器,22对应开放的SSH端口,一旦公钥被服务器验证接收,客户端便可通过认证访问客户端。

cat .ssh/authorized_keys

认证完成后,可以查看authorized_keys文件中,已经添加了ssh-rsa加密的公钥。

验证服务器身份

在发生公钥之前,需要对服务器验证身份,因为SSH虽然传输过程中很安全,但是在首次建立链接时并没有办法知道发来的公钥是否真的来自自己请求的服务器,如果有人在客户端请求服务器后拦截了请求,并返回自己的公钥冒充服务器,这时候如果链接建立,那么所有的数据就都能被攻击者用自己的私钥解密了。这也就是所谓的中间人攻击【5】

ecdsa_key

这里验证主机采用的是验证服务器发来的指纹是否相符,以下两个例子

github.com

在初次与个人的GitHub账户建立SSH连接时,需要进行验证,会产生下列提示之一。【6】

> The authenticity of host 'github.com (IP ADDRESS)' can't be established.
> RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
> Are you sure you want to continue connecting (yes/no)?
> The authenticity of host 'github.com (IP ADDRESS)' can't be established.
> RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
> Are you sure you want to continue connecting (yes/no)?

这个指纹能保证你要发送公钥的服务器是正确的,可以如此验证【7】

ssh-keyscan  github.com > githubkey.txt

将github.com扫描得到的公钥重定向输出到githubkey.txt文件中

ssh-keygen -lf githubkey.txt

再生成该公钥文件的指纹

在这里插入图片描述

验证官方提供的公钥指纹与自己的窗口中的一致,则可以信任,进行下一步操作。

私有云服务器

而在个人云服务器中测试验证时,由于已将默认端口关闭,使用ssh-keyscan命令并未得到结果。而这个公钥文件的路径位于云服务器的ssh目录下

ls /etc/ssh

在这里插入图片描述

可见这里的ssh_host_ecdsa_key.pub应当是符合要求的公钥,尝试生成其指纹结果如下:

在这里插入图片描述

这里,与我们在客户端上看到的指纹SHA256:+zxxx并不相同!原来,不同版本的OpenSSH生成的指纹默认方式不同,旧版本默认以MD5格式输出,新版本则采用了SHA256加密方式。

在这里插入图片描述在这里插入图片描述

分别对比客户端与服务器上OpennSSH的版本,前者为8.1,而后者为6.6.1。

而通过如下命令在旧版本的OpenSSH以SHA256加密方式打印出文件指纹【8】

awk '{print $2}' /etc/ssh/ssh_host_ecdsa_key.pub | base64 -d | sha256sum -b | sed 's/ .*$//' | xxd -r -p | base64

在这里插入图片描述

可见,此时生成的指纹正和最初客户端中显示的完全一样。如此确认可以减小中间人攻击的可能,下面便可进行之后的服务器登录验证。

登录服务器

在验证服务器返回指纹的正确性后,OpenSSH提示输入服务器登录用户的密码,通过验证后,客户端的公钥就被添加至服务器。此时提示,可通过下列指令登录服务器

ssh -p '22' 'root@60.xxx.xxx.xxx'

在这里插入图片描述

而在这个过程中实际发生了下面的协议【9】

  1. 认证完成后,客户端向服务端发起登录请求,并传递公钥到服务端
  2. 服务端检索authorized_key文件,确认该公钥是否存在
  3. 如果存在该公钥,则生成随机数R,并用公钥来进行加密,生成公钥加密字符串pubKey(R)
  4. 将公钥加密字符串传递给客户端
  5. 客户端使用私钥解密公钥加密字符串,得到R
  6. 服务端和客户端通信时会产生一个会话ID(sessionKey),用MD5对R和SessionKey进行加密,生成摘要(即MD5加密字符串)
  7. 客户端将生成的MD5加密字符串传给服务端
  8. 服务端同样生成MD5(R,SessionKey)加密字符串
  9. 如果客户端传来的加密字符串等于服务端自身生成的加密字符串,则认证成功
  10. 此时不用输入密码,即完成建连,可以开始远程执行shell命令了
preview

参考资料

  1. SSH Protocol
  2. 网络安全协议SSH的研究与实现[学位论文] 甘长华2007- 天津大学:信号与信息处理
  3. 2019-2025年中国云服务行业市场全景调研及发展趋势研究报告
  4. 陈英.基于网络构件的安全调用信任模型的研究[D].浙江:浙江大学,2005.
  5. 图解SSH原理及两种登录方法
  6. Testing your SSH connection
  7. Check the fingerprint for the ECDSA key sent by the remote host [closed]
  8. ECDSA key fingerprint – looks like it is base64 encoded, but too few characters
  9. linux上ssh免密登录原理及实现

Leave a comment

Your email address will not be published. Required fields are marked *