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

简介:

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
本文来自云栖社区合作伙伴“ 前端大学”,了解相关信息可以关注“ 前端大学

相关文章
|
7月前
|
Java 数据库连接 网络安全
SSH框架的核心原理与工作流程解析
以上描述了SSH框架中各个部分的职责和大致的工作流程,详细运作时还涉及更多的组件和配置细节,每个部分都有相应的最佳实践和性能调优策略,但这些都建立在理解其核心原理基础之上。
552 11
|
7月前
|
网络安全 开发工具 git
配置本地环境以管理Git多账户SSH连接的方法
通过以上步駟设置后, 您可以轻松管理多個 Git 账户并且根据不同项目需求切换 SSH 密匙进行版本控制操作。
753 20
|
10月前
|
应用服务中间件 网络安全 数据安全/隐私保护
网关服务器配置指南:实现自动DHCP地址分配、HTTP服务和SSH无密码登录。
哇哈哈,道具都准备好了,咱们的魔术秀就要开始了。现在,你的网关服务器已经魔法满满,自动分配IP,提供网页服务,SSH登录如入无人之境。而整个世界,只会知道效果,不会知道是你在幕后操控一切。这就是真正的数字世界魔法师,随手拈来,手到擒来。
480 14
|
安全 Linux 网络安全
在Linux(CentOS和AWS)上安装更新的git2的方法并配置github-ssh
经过以上这些步骤,你现在就能在GitHub上顺利往返,如同海洋中的航海者自由驰骋。欢迎你加入码农的世界,享受这编程的乐趣吧!
500 10
|
安全 网络安全 数据安全/隐私保护
Debian 12系统中允许Root远程SSH登录解决方法!
在 Debian 12 系统中开启 SSH 远程 Root 登录需修改 SSH 配置文件 (`sshd_config`),将 `PermitRootLogin` 设置为 `yes` 并确保密码认证启用。完成后重启 SSH 服务并验证连接。若防火墙启用,需放行端口 22。注意,直接开放 Root 登录可能带来安全风险,建议使用普通用户登录后切换至 Root。
1876 1
|
监控 Ubuntu 安全
debian或Ubuntu中开启ssh允许root远程ssh登录的方法
在Debian或Ubuntu系统中启用root用户的SSH远程登录需要编辑SSH配置文件、设置root密码并重启SSH服务。虽然这可以在某些情况下提供便利,但必须注意安全性,通过使用强密码、限制IP访问、使用SSH密钥认证等方法来保护服务器的安全。
6943 5
|
安全 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) 锁定或禁用用户账号以阻止所有类型的登录。每种方法都提供了详细的步骤指导。
2517 1
|
JavaScript 应用服务中间件 Linux
【应用服务 App Service】解决无法从Azure门户SSH登录问题
【应用服务 App Service】解决无法从Azure门户SSH登录问题
336 0
|
机器学习/深度学习 存储 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中的文件
382 4
|
Shell 网络安全 数据安全/隐私保护