图解SSH原理及两种登录方法

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介:

SSH(Secure Shell)是一套协议标准,可以用来实现两台机器之间的安全登录以及安全的数据传送,其保证数据安全的原理是非对称加密

传统的对称加密使用的是一套秘钥,数据的加密以及解密用的都是这一套秘钥,可想而知所有的客户端以及服务端都需要保存这套秘钥,泄露的风险很高,而一旦秘钥便泄露便保证不了数据安全。

非对称加密解决的就是这个问题,它包含两套秘钥 - 公钥以及 私钥,其中公钥用来加密,私钥用来解密,并且通过公钥计算不出私钥,因此私钥谨慎保存在服务端,而公钥可以随便传递,即使泄露也无风险。

保证SSH安全性的方法,简单来说就是客户端和服务端各自生成一套私钥和公钥,并且互相交换公钥,这样每一条发出的数据都可以用对方的公钥来加密,对方收到后再用自己的私钥来解密。

1239f2058477235cea2e71ad476488c7a62f8b34

链接创建

由上一张图可以看出来,两台机器除了各自的一套公、私钥之外,还保存了对方的公钥,因此必然存在一个交换各自公钥的步骤。实际上并不是简单的各自发送公钥,而是存在一些专门的算法。这一步在首次链接时、数据传送之前发生。

b7e88336f155db513a67475388708d7850325046

  1. 客户端发起链接请求

  2. 服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)

  3. 客户端生成密钥对

  4. 客户端用自己的公钥异或会话ID,计算出一个值,并用服务端的公钥加密

  5. 客户端发送加密后的值到服务端,服务端用私钥解密

  6. 服务端用解密后的值异或会话ID,计算出客户端的公钥(这一步服务端得到客户端公钥)

  7. 至此,双方各自持有三个秘钥,分别为自己的一对公、私钥,以及对方的公钥,之后的所有通讯都会被加密

这里有一个有趣的地方,两台机器第一次使用SSH链接时,当服务端返回自己的公钥(第2步)的时候,客户端会有一条信息提示,大意是无法验证对方是否可信,并给出对方公钥的MD5编码值,问是否确定要建立链接。

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

1f00bcbb2267ebc67ed78eec94c7e7214210e049

利用密码登录

SSH还常用来远程登录到别的机器,有两种常用的方法,第一种便是账号密码登录。

4f7b7daf6527941398bdcf5d7f7a4b13351e2e3b

  1. 服务端收到登录请求后,首先互换秘钥,详细步骤如上一节所述。

  2. 客户端用服务端的公钥加密账号密码并发送

  3. 服务端用自己的秘钥解密后得到账号密码,然后进行验证

  4. 服务端用客户端的公钥加密验证结果并返回

  5. 服务端用自己的秘钥解密后得到验证结果


利用公钥登录

有些时候并不是开发者手动去连接服务器,而是客户端的程序需要连接到服务器,这时候用密码登录就比较不方便,一是需要处理输入密码的问题,二是需要想办法安全的储存密码到程序里,这种情况下便可以利用公钥来进行无密码登录。

952489122de8fcbf973d76f0f3aeb2d0fd22f90c

  1. 客户端用户必须手动地将自己的公钥添加到服务器一个名叫authorized_keys的文件里,顾名思义,这个文件保存了所有可以远程登录的机器的公钥。

  2. 客户端发起登录请求,并且发送一个自己公钥的指纹(具有唯一性,但不是公钥)

  3. 服务端根据指纹检测此公钥是否保存在authorized_keys中

  4. 若存在,服务端便生成一段随机字符串,然后利用客户端公钥加密并返回

  5. 客户端收到后用自己的私钥解密,再利用服务端公钥加密后发回

  6. 服务端收到后用自己的私钥解密,如果为同一字符串,则验证通过

利用公钥登录的关键是必须手动将客户端的公钥添加到服务端,比如GitHub便有这一步骤,添加了之后便可无密码登录。

b9825d3858c0374d40380aa90a4eb232b1620cfc

参考文献:

  • SSH登录认证详解(https://www.cdxy.me/?p=394)

  • Intro to SSH and SSH Keys(https://www.youtube.com/watch?v=mF6J-VQHPxA)

  • 图解SSH(https://www.jianshu.com/p/33461b619d53)

  • SSH原理与运用(http://www.ruanyifeng.com/blog/2011/12/sshremotelogin.html) 


原文发布时间为:2018-09-25
本文来自云栖社区合作伙伴“ 前端大学”,了解相关信息可以关注“ 前端大学

相关文章
|
2月前
|
JavaScript 应用服务中间件 Linux
【应用服务 App Service】解决无法从Azure门户SSH登录问题
【应用服务 App Service】解决无法从Azure门户SSH登录问题
|
2月前
|
机器学习/深度学习 存储 Linux
【机器学习 Azure Machine Learning】使用VS Code登录到Linux VM上 (Remote-SSH), 及可直接通过VS Code编辑VM中的文件
【机器学习 Azure Machine Learning】使用VS Code登录到Linux VM上 (Remote-SSH), 及可直接通过VS Code编辑VM中的文件
|
2月前
|
安全 Shell Linux
如何禁止某个用户使用ssh登录
本文介绍了五种禁止用户通过SSH登录的方法:1) 修改`/etc/ssh/sshd_config`文件中的`DenyUsers`和`DenyGroups`来阻止特定用户或用户组登录;2) 将用户的默认shell设置为`/usr/sbin/nologin`或`/bin/false`以禁用其SSH访问;3) 利用PAM(可插入认证模块)通过编辑`/etc/security/sshd.conf`来限制登录权限;4) 通过编辑`/etc/hosts.deny`文件拒绝特定用户的SSH访问;5) 锁定或禁用用户账号以阻止所有类型的登录。每种方法都提供了详细的步骤指导。
84 1
|
2月前
|
存储 安全 测试技术
【超实用却暗藏杀机】sshpass:一键免密SSH登录的神器,为何生产环境却要敬而远之?探秘背后的安全隐患与替代方案!
【8月更文挑战第16天】sshpass 是一款便捷工具,可实现自动化SSH登录,简化脚本中的远程连接流程。通过后台自动处理密码输入,便于执行远程操作,如 `sshpass -p 'yourpassword' ssh user@remotehost`。也可结合更多SSH选项使用,例如指定私钥文件。然而,因需明文传递密码,存在较大安全隐患,不适于生产环境;推荐使用公钥认证以增强安全性。
53 4
|
2月前
|
安全 Linux Shell
Linux系统之间实现免密码登录(SSH无密码登录
【8月更文挑战第21天】要在Linux系统间实现SSH免密码登录,需先在源机器生成SSH密钥对,然后将公钥复制到目标机器的`.ssh/authorized_keys`文件中。可通过`ssh-keygen`命令生成密钥,并使用`ssh-copy-id`命令传输公钥。最后测试SSH连接,确保能无密码登录。若目标机器缺少相关目录或文件,需手动创建并设置适当权限。完成这些步骤后,即可实现安全便捷的免密码登录。
56 0
|
2月前
|
Ubuntu Linux 网络安全
在Linux中,如何禁用root用户直接SSH登录?
在Linux中,如何禁用root用户直接SSH登录?
|
2月前
|
存储 安全 Linux
说到Linux安全,SSH限制IP登录绕不开这3种方法!
说到Linux安全,SSH限制IP登录绕不开这3种方法!
|
分布式计算 Hadoop 网络安全
|
安全 Shell Linux
为什么不能在SSH(Secure Shell)登录中设置ulimit值?
关闭这些选项会带来一些安全风险。但那也只是在SSH守护进程的漏洞被发现并且被利用的情况下才会出现。关闭之后就意味着sshd不会创建非特权子进程去处理进站连接。如果漏洞存在而且被利用,则有人可以控制sshd进程,而这个进程是以root身份运行的。
1774 0
|
网络安全 数据安全/隐私保护
SSH免登录设置
基础篇 执行: ssh-keygen -t rsa rocky@tiger:~$ ssh-keygen -t rsa Generating public/private rsa key pair.
688 0