详解SSH原理

栏目: 服务器 · 发布时间: 5年前

内容简介:在实际日常运维工作中,肯定是离不开SSH的,每天都在不停的使用SSH登陆这个主机,或者那个主机去处理各种问题。每天用的也很舒服,但是对于SSH后面的原理却不甚了解,最近在看Ansible时,发现自己对SSH还有很多的迷惑点,对于我来说,一般不常用的迷惑点,我也就糊弄糊弄就过去了,毕竟对每个知识点进行放大,那都是一本学不完的天书,有些内容我们了解就好了,但是对于SSH,本想着也糊弄糊弄就过去吧,但是后来发现这样行不通,这里面好多的知识点直接影响着我日后的运维工作。于是乎,觉的有必要整理这样的一篇文章来把SSH

前言

在实际日常运维工作中,肯定是离不开SSH的,每天都在不停的使用SSH登陆这个主机,或者那个主机去处理各种问题。每天用的也很舒服,但是对于SSH后面的原理却不甚了解,最近在看Ansible时,发现自己对SSH还有很多的迷惑点,对于我来说,一般不常用的迷惑点,我也就糊弄糊弄就过去了,毕竟对每个知识点进行放大,那都是一本学不完的天书,有些内容我们了解就好了,但是对于SSH,本想着也糊弄糊弄就过去吧,但是后来发现这样行不通,这里面好多的知识点直接影响着我日后的运维工作。于是乎,觉的有必要整理这样的一篇文章来把SSH的原理好好的学习一下,也好让后续自己的运维工作更得心应手,又或在教小弟时也能有点资本。

SSH是什么?

简单一点来说,SSH就是一种网络协议,用于在网络主机之间进行加密的一种协议。结合我们的日常工作来说,如果我从一台服务器使用SSH协议登陆另一台服务器,我们就认为这样的登陆是安全的,即使我们的登陆信息在中间被人截获了,我们的密码也不会被泄露。

为什么要搞这么个协议呢?其实,很久很久以前,互联网通信都是明文的,一旦在中间环节被某些中间商截获了,我们的通信内容就暴漏无疑。所以呢,芬兰就有这么一位叫做Tatu Ylonen的人设计了SSH协议,将信息加密,这样就像上面说的,即使我们的登陆信息在中间被人截获了,我们的密码也不会被泄露。目前SSH协议已经在全世界广泛被使用,且已经在成为各个 Linux 发行版的标配。

原理解析

至于SSH的一些简单用法,我这里就不细说了,先通过一副时序图看看SSH的密码登陆原理。

详解SSH原理

从上图中,可以看到我们使用SSH进行登陆时,主要分为以下几步:

ssh user@host

这个过程乍一看没有任何问题,但是在实际工作中,却是存在风险漏洞的。由于SSH不像https协议那样,SSH协议的公钥是没有证书中心(CA)公证的,也就是说,都是自己签发的。这就导致如果有人截获了登陆请求,然后冒充远程主机,将伪造的公钥发给用户,那么用户很难辨别真伪,用户再通过伪造的公钥加密密码,再发送给冒充主机,此时冒充的主机就可以获取用户的登陆密码了,那么SSH的安全机制就荡然无存了,这也就是我们常说的中间人攻击。

既然存在这种问题,SSH就想了一个办法来绕开这个问题,也就是我接下来要总结的known_hosts文件的作用。

known_hosts文件的作用

我们在使用SSH登陆远程主机的时候,有时会看到这样的提示:

The authenticity of host '192.168.1.4 (192.168.1.4)' can't be established.
ECDSA key fingerprint is SHA256:YMLLk0vyfeoY4rbRTnkMSxY11arS2S4qgVgvnwWpBFw.
ECDSA key fingerprint is MD5:82:75:be:8e:e7:26:ea:18:73:aa:fc:10:44:c8:4f:c3.
Are you sure you want to continue connecting (yes/no)?

上面这段话的意思是,无法确认192.168.1.4主机的真实性,只知道它的公钥指纹,问你还想继续连接吗?这样我们就可以看到,SSH是将这个问题抛给了SSH使用者,让SSH使用者自己来确定是否相信远程主机。但是这样对于用户来说,就存在一个难题,用户怎么知道远程主机的公钥指纹是多少;这的确是一个问题,此时就需要远程主机必须公开自己的公钥指纹,以便用户自行核对。

在经过用户的风险衡量以后,用户只需要输入 yes 来决定接受这个远程主机的公钥。紧接着,系统会出现以下这样的一句提示,表示远程主机已经得到认可:

Warning: Permanently added '192.168.1.4' (ECDSA) to the list of known hosts.

接下来,用户输入远程主机密码即可完成整个登陆。那这个和我这里要总结的known_hosts文件有什么关系呢?请听我慢慢道来。

当远程主机的公钥被接受以后,它就会被保存在文件 ~/.ssh/known_hosts 之中。下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。

但是由于 known_hosts 这个机制的存在,也会引起一些问题,比如远程主机的重新装操作系统了,远程主机就会重新生成公钥,如果我们再登陆远程主机时,由于我们本地的 known_hosts 文件中记录了原来的公钥,此时就会提示指纹认证失败的错误,这个时候我们只需要删除本地的 known_hosts 文件即可。又比如,我们经常会写一些自动化的脚本,会自动的登陆到远程主机上去,但是这个 known_hosts 机制却必须要我们手动输入 yes 才能完成远程登陆,这样整个自动化登陆就无法完成了,但是我们可以通过修改 /etc/ssh/ssh_config 配置文件,跳过这个 known_hosts 的询问机制,将 # StrictHostKeyChecking ask 修改为 StrictHostKeyChecking no 即可。

公钥免密登录

在我们日常工作中,总是会挂很多的自动化脚本,比如自动的登陆到一台远程主机上进行一些操作,又比如Ansible就可以配置自动登陆到远程主机,但是上面说到的SSH,都需要密码登陆,那如何让SSH免密登陆,实现我们的自动登陆需求呢?这就是这里要将的公钥免密登陆。

详解SSH原理

上图就是SSh免密登陆原理图,从上图可以看出,SSH免密登陆的前提是使用 ssh-keygen -t RSA 生成公私秘钥对,然后通过 ssh-copy-id -i ~/.ssh/id_rsa.pub user@host 命令将公钥分发至远程主机。接下来的每次免密登陆步骤如下:

ssh user@host

通过 ssh-copy-id -i ~/.ssh/id_rsa.pub user@host 命令分发的公钥都会被保存至远程主机的 ~/.ssh/authorized_keys 文件中。

总结

虽然我们经常使用SSH,但是对于其中的一些原理性的东西却不是很懂,很多时候就是因为这些简单的原理性的不懂,就让我们的思维受限,让我们的行动受限,因为不懂,所以就怕操作,怕出错。这篇文章就对SSH中的一些原理进行了总结,对于我们经常接触的东西,比如 known_hosts 啊、SSH免密登陆啊,这些我们平常只知道用,却不知道为什么是这样子,在出现问题时,不知道为什么,只知道谷歌、百度好用;我希望通过我的这篇文章,能让各位有缘的读者明白、熟悉这些简单的原理,让大家在日后的工作中因为懂,所以更放的开。好了,如果觉的还不错,可以点击下方的“打赏”哦。

果冻想,认真玩技术的地方。

2019年5月18日,于内蒙古呼和浩特。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Foundations of PEAR

Foundations of PEAR

Good, Nathan A./ Kent, Allan / Springer-Verlag New York Inc / 2006-11 / $ 50.84

PEAR, the PHP Extension and Application Repository, is a bountiful resource for any PHP developer. Within its confines lie the tools that you need to do your job more quickly and efficiently. You need......一起来看看 《Foundations of PEAR》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具