利用SSH基于key认证

What(能实现什么)

  • 免密登录,实现远程批量操作服务器,方便脚本编写,使得我们在执行远程操作命令时就好像在本地执行命令简单(如scp,ssh)
  • 更加安全方便,我们不用去记繁琐的用户密码,也不担心密码泄露。(我们可以把sshd服务配置成只允许基于KEY验证登录)
  • 防止暴力猜口令的威胁。

Why(原理是什么)

SSH首次连接第一步

    客户端A去访问服务端B时并不知道B的公钥是什么,A无法确认现在正在连接的IP是不是B。这时B把本机的公钥通过单向加密算法md5和sha256,提取出B公钥的指纹发送到A这边来。这时系统会提示你要手工确认此公钥的准确性。

[root@centos 7 ~]#ssh 192.168.8.6
[root@centos 7 .ssh]#ssh 192.168.8.6
The authenticity of host '192.168.8.6 (192.168.8.6)' can't be established.
RSA key fingerprint is bd:fc:55:81:f0:4e:14:01:ab:ef:a9:58:42:c7:69:08.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.8.6' (RSA) to the list of known hosts.
root@192.168.8.6's password: 
Last login: Sat Sep 21 08:35:26 2019 from 192.168.8.1

    当A输入yes时,会自动下载B的公钥放到~/.ssh的文件夹当中。这时会文件夹会生成一个known hosts文本,用来存放于已连接过的主机的公钥,再输入密码可登录进去,系统的初始公钥和私钥放到/etc/ssh目录。
    注意:此步骤可以A的SSH客户端配置文件中禁用,修改/etc/ssh/ssh_config---->此项改为 StrictHostKeyChecking no(首次登录不检查提示);

SSH首次连接第二步

    SSH连接第二步就是上述操作输入yes后的内部通信过程,这时A的公钥B手上还没有,那怎样实现公钥交换?
在这里插入图片描述

  • A向B发送连接请求时,B会返回一个公钥和会话ID(系统自动生成的字符串)给到A,这时A得到了B的公钥和B的会话ID;
  • A用会话ID和A的公钥做异或运算得到一个RES;
  • A再用B的公钥加密RES,把加密后的结果发送给服务端B;
  • B用私钥解开,再用RES和会话ID做异或运算,这时得到了A的公钥了;
  • 至此双方都得到了对方的公钥;
SSH首次连接密码登录

    SSH连接第三步之密码登录
在这里插入图片描述

  • 当A输入密码123456后,用服务端B的公钥加密传输给服务端B;
  • 服务端B收送A的登录的加密请求后,解密并验证用户和密码。最后把验证结果和A的公钥加密回传给A;
  • A再用A的私钥解密,得到验证结果,完成密码交换,进而登录成功或失败;
SSH登录成功后加密通讯的过程

在这里插入图片描述
    从上图可以看到,客户端和服务端上必须存在一对密钥对,而且用A的公钥加密只能用A的私钥才可以解密,这就是非对称加密的特性。
    ssh加密通讯的流程大致是这样:客户端和服务端通信的前提是双方手上都已有对方的公钥,此步已跳过首次连接过程。首先客户端与服务端通信,客户端会把通信数据用服务端的公钥进行加密,加密的报文只能用服务端的私钥解密。加密的报文传送至服务端,服务端用私钥来解密,反之亦然。这样实现了安全通信的过程。

基于Key认证存在的风险

    上述的首次密钥交换的过程中会存在叫“中间人攻击”的风险;
在这里插入图片描述
中间人攻击:黑客会潜伏在客户端与服务器中间来收发双放的密钥信息,发生中间人攻击的根本原因就是对方是否可信。在解决这个问题就要用到CA证书。

SSH连接第三步之公钥登录

    基于密钥的登录方式,免密登录;

在这里插入图片描述

  • 首先在客户端生成一对密钥( ssh-keygen);
  • 并将客户端的公钥ssh-copy-id 拷贝到服务端;
  • 当客户端再次发送一个连接请求,包括ip、用户名;
  • 服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP和用户,就会随机生成一个字符串,例如:13579;
  • 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端;
  • 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端;
  • 服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录

    这里简单说下家目录下.ssh文件夹下各个文件代表的意思

[root@centos 7 .ssh]#ls
authorized_keys  id_rsa  id_rsa.pub  known_hosts

authorized_keys :存放经过授权过的主机公钥;
known_hosts:存放已连接过的主机公钥;
id_rsa:私钥
id_rsa.pub:公钥
解释一下:

  • authorized_keys与known_hosts存放的内容基于一致;
  • A第一次连接B,A的known_hosts为空,A屏幕此时会发生warning信息,提醒是否连接,确定连接才会让你输入密码连接,然后便会把B的公钥添加到A的known_hosts中,下次只需要直接输入B密码连接即可。而authorized_keys文件是实现真正无密码连接,即为授权文件;当把B的公钥添加到authorized_keys文件中后,下次连接直接输入B IP即可,不需要再次输入密码

How(怎样做)

  • 在客户端A生成连接的密钥对;
[root@centos 7 .ssh]#ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): #输入一个文件名来存入key;
Enter passphrase (empty for no passphrase): #输入一个密钥保存口令,默认为空;
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
a9:da:f0:68:14:a9:a1:af:97:9e:5e:0f:b9:fa:c8:17 root@centos 7.localdomain
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|     .           |
|  . o    .       |
| . o .  S        |
|. . E. .         |
| . o=..          |
| .++oX           |
|.=B== +          |
+-----------------+
[root@centos 7 .ssh]#ll
total 8
-rw-------. 1 root root 1679 Nov  9 11:06 id_rsa
-rw-r--r--. 1 root root  407 Nov  9 11:06 id_rsa.pub

说明:在A用ssh-keygen命令来生成用户密钥对,-t 选项表示以那种加密算法来生产密钥,默认是RSA。密钥默认放在当前用户的家目录下.ssh/目录下,分别叫id_rsa 和id_rsa.pub。可以-f选项来指定密钥的存放位置。除此之外它还让我们输入密码,这里的密码表示加密私钥的密码,所以系统默认会提示我们,如果按回车就表示生成的私钥不加密,可以用 -P(大写)选项来指定加密后私钥的密码。

  • 把客户端A生成的密钥发送到服务器B中,默认会放到.ssh/authorized_keys中,当然了可以用U盘但这里用ssh-copy-id更为方便;
[root@centos 7 .ssh]#ssh-copy-id 192.168.8.6
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.8.6's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '192.168.8.6'"
and check to make sure that only the key(s) you wanted were added.

说明:-i 选项可以指定公钥文件的存放位置,默认是从当前用户的家目录下的.ssh/公钥文件名称。 上述实验服务端的sshd服务是默认工作在22端口,如果没有工作在默认端口需要用-p(小写)选项来指定端口。例如:

[root@centos6 .ssh]# ssh-copy-id "-p 6020 root@192.168.8.7"

至此客户端A可以免密登录服务器了

实现多台主机相互免密登录

生产环境中有A.B.C.D多台主机如果要相互免密登录,那只需要把A主机对其余三台主机做免密登录配置,再把A主机的.ssh文件夹拷贝至B.C.D三台主机。拷贝完成后多台主机就可以实现免密登录了。

[root@centos 7 ~]#scp -rp ~/.ssh  192.168.8.6:/root/.ssh

本文结束!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值