1.什么是ssh?
简单说,SSH是一种网络协议,用于计算机之间的加密登录。如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。
一、ssh 口令登录
- 1.ssh 口令登录原理图:
原理解析:
从上图中,可以看到我们使用SSH进行登陆时,主要分为以下几步:
- 用户使用ssh user@host命令对远程主机发起登陆请求;
- 远程主机将自己的公钥返回给请求主机;
- 请求主机使用公钥对用户输入的密码进行加密;
- 请求主机将加密后的密码发送给远程主机;
- 远程主机使用私钥对密码进行解密;
- 最后,远程主机判断解密后的密码是否与用户密码一致,一致同意登陆,否则反之。
注意:
这一过程存在漏洞风险。由于SSH不像https协议那样,SSH协议的公钥是没有证书中心(CA)公证的,也就是说,都是自己签发的。这就导致如果有人截获了登陆请求,然后冒充远程主机,将伪造的公钥发给用户,那么用户很难辨别真伪,用户再通过伪造的公钥加密密码,再发送给冒充主机,此时冒充的主机就可以获取用户的登陆密码了,那么SSH的安全机制就荡然无存了,这也就是我们常说的中间人攻击。
known_hosts文件的作用
既然存在这种问题,SSH就想了一个办法来绕开这个问题,也就是.sknown_hosts文件的作用。
- 我们在使用SSH登陆远程主机的时候,有时会看到这样的提示:
ssh root@49.234.102.232
- ‘yes’ 提示输入密码
The authenticity of host '49.234.102.232 (49.234.102.232)' can't be established.
ECDSA key fingerprint is SHA256:IJb73Cd9Gy/mr3p8uNWD5gJScTfsN8uQPMrwweTGTXY.
Are you sure you want to continue connecting (yes/no)?
-
上面这段话的意思是,无法确认49.234.102.232主机的真实性,只知道它的公钥指纹,问你还想继续连接吗?这样我们就可以看到,SSH是将这个问题抛给了SSH使用者,让SSH使用者自己来确定是否相信远程主机。但是这样对于用户来说,就存在一个难题,用户怎么知道远程主机的公钥指纹是多少;这的确是一个问题,此时就需要远程主机必须公开自己的公钥指纹,以便用户自行核对。
-
在经过用户的风险衡量以后,用户只需要输入yes来决定接受这个远程主机的公钥。紧接着,系统会出现以下这样的一句提示,表示远程主机已经得到认可:
Warning: Permanently added '49.234.102.232' (ECDSA) to the list of 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免密登陆,实现我们的自动登陆需求呢?这就是这里要将的公钥免密登陆。
- 1.ssh绵密登录原理图
###原理解析:
上图就是ssh免密登陆原理图,从上图可以看出,SSH免密登陆的前提是使用ssh-keygen -t RSA生成公私秘钥对,然后通过ssh-copy-id -i ~/.ssh/id_rsa.pub user@host命令将公钥分发至远程主机。接下来的每次免密登陆步骤如下:
解析:
- ssh-keygen -t RSA 生成密钥对
- ssh-copy-id -i ~/.ssh/id_rsa.pub user@host 将公钥发送到远程主机,会存在.ssh/authorized_keys 文件中
- 用户使用ssh user@host命令对远程主机发起登陆;
- 远程主机对用户返回一个随机串;
- 用户所在主机使用私钥对这个随机串进行加密,并将加密的随机串返回至远程主机;
- 远程主机使用分发过来的公钥对加密随机串进行解密;
- 如果解密成功,就证明用户的登陆信息是正确的,则允许登陆;否则反之。