ssh登录原理解析

1.什么是ssh?

简单说,SSH是一种网络协议,用于计算机之间的加密登录。如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。

一、ssh 口令登录

  • 1.ssh 口令登录原理图:
    [外链图片转存失败(img-KnSPWHrd-1564037884182)(quiver-image-url/BA848D53EDC8CFF9A1A26F0B99B5618B.jpg)]
原理解析:

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

  • 用户使用ssh user@host命令对远程主机发起登陆请求;
  • 远程主机将自己的公钥返回给请求主机;
  • 请求主机使用公钥对用户输入的密码进行加密;
  • 请求主机将加密后的密码发送给远程主机;
  • 远程主机使用私钥对密码进行解密;
  • 最后,远程主机判断解密后的密码是否与用户密码一致,一致同意登陆,否则反之。

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

known_hosts文件的作用

既然存在这种问题,SSH就想了一个办法来绕开这个问题,也就是.sknown_hosts文件的作用。

  • 我们在使用SSH登陆远程主机的时候,有时会看到这样的提示:
    • ssh root@49.234.102.232
      [外链图片转存失败(img-fBrCdHAo-1564037884184)(quiver-image-url/F7546CB46B452339813D9DDF3B1354CD.jpg)]
    • ‘yes’ 提示输入密码
      [外链图片转存失败(img-odbRSzn8-1564037884185)(quiver-image-url/70552EA6960A9FD4BDCA306789A61F2D.jpg)]
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绵密登录原理图
    [外链图片转存失败(img-MrAeZnFY-1564037884186)(quiver-image-url/7CF8123318AAB2C2CBB214515E6CF8BB.jpg =585x640)]

###原理解析:

上图就是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命令对远程主机发起登陆;
  • 远程主机对用户返回一个随机串;
  • 用户所在主机使用私钥对这个随机串进行加密,并将加密的随机串返回至远程主机;
  • 远程主机使用分发过来的公钥对加密随机串进行解密;
  • 如果解密成功,就证明用户的登陆信息是正确的,则允许登陆;否则反之。

[外链图片转存失败(img-KTuLkODB-1564037884187)(quiver-image-url/883D8335DEF0B6F035C11322229DB87F.jpg)]
[外链图片转存失败(img-TPMANcKg-1564037884187)(quiver-image-url/6FA0CA337EB28587FDB601749DDCFF3F.jpg)]

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值