现在有两台 Linux 服务器,A(用户名a) 和 B(用户名b),现在我们想从 A 服务器通过 SSH 访问服务器 B 而无需输入密码。

首先,A 和 B 上都需安装有 SSH,用以下命令安装

sudo yum install openssh

同时修改两台服务器上的文件 /etc/ssh/sshd_config,将下面这三行取消注释:

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

更改配置文件后重启 SSH 服务

service sshd restart

在服务器 A 上用 RSA 算法生成公钥和私钥,并且将 A 的公钥拷贝到 B 中,设置文件和文件夹适当的权限即可,具体过程如下。

[a@A ~]$ ssh-keygen -t rsa -P ''
Generating public/private rsa key pair.
Enter file in which to save the key (/home/a/.ssh/id_rsa):      
    #此处不用输入,直接回车即可
Created directory '/home/a/.ssh'.
Your identification has been saved in /home/a/.ssh/id_rsa.
Your public key has been saved in /home/a/.ssh/id_rsa.pub.

如果 b@B 的 ~ 文件夹下无 .ssh 文件夹则建一个,否则跳过此步。

[a@A ~]$ ssh b@B mkdir -p .ssh
b@B's password:

将 A 的公钥拷入 B 中。

[a@A ~]$ cat .ssh/id_rsa.pub | ssh b@B 'cat >> .ssh/authorized_keys'
b@B's password:

设置文件夹和文件权限。

[b@B ~]$ chmod 700 ~/.ssh
[b@B ~]$ chmod 600 ~/.ssh/authorized_keys

P.S. 服务器  B 需要有本地回环接口,也即是正确配置了 /etc/sysconfig/network-scripts/ifcfg-lo 文件,可以参考这里

最后讲一下这种访问的原理。

RSA 密码体制是一种非对称密码体制,也就是说它的密码有两个,一个公开的称为公钥,另一个不公开的称为私钥,它假设人们一般无法根据公钥推算出私钥(这个由数学计算上的难度来保证)。假设 B 想通过网络发条消息 x 给 A,并且不想让让别人知道这个消息的内容,这时,B 应该在本地上用 A 的公开的公钥加密消息 x 得到 y,然后通过网络将加密后的消息 y 发送给 A,然后 A 在本地用自己的私钥将消息 y 解密得到原消息 x。假设有个第三者 C,它截获了在网络上传输的消息 y,并且 C 也轻易地知道了 A 的公钥(因为这个公钥是相对公开的),但是 C 仍然无法知道这条消息的原文是什么,因为 C 并没有 A 的私钥无法解密消息。

现在回到最开始的两台服务器 A 与 B 的情形,我们想让 A 可以无需输入密码就可以登陆到 B 上。其实我们要做的就是让服务器 B 接受到登陆请求时确认发起请求的是服务器 A 即可,所以大致流程如下:

  • 服务器 B 接受到一个自称是服务器 A 的登陆请求;
  • B 在本地生成一个随机数 r,并且用 A 的公钥进行加密,得到 rc
  • B 将 rc 传回给请求登陆的服务器,并要求该服务器解密;

之后分为两种情况

  1. 若 B 收到请求登陆服务器传回的数值,并且等于 r,则认可该服务器的身份是 A,并允许其登陆;
  2. 若 B 在一定时间内都未收到回复,或者收到的数值不正确,都视为无法确认请求服务器的身份,并拒绝其登陆。

参考文章:SSH login without password

Leave a Reply

Your email address will not be published.

Post Navigation