配置主机间互相免密钥登录

1. 使用场景

自动化运维管理统一管理都离不开linux的免密钥登录。此操作在实际运营中很重要。

2. 认证逻辑

假设有两台主机 A,B;现使 A登录B时免密。

  1. 在A 上生成自己的密钥对,包含公钥和私钥。
  2. 将A 的公钥拷贝给B 并保存为authorized_keys文件。
  3. A 发送链接请求给 B, 内容包括用户名,ip地址。
  4. B 收到请求,并在自己的authorized_keys中查找,若找到相应的用户名和IP,B将生成一个随机`字符串,并用收到的公钥对字符串加密,并把字符串返回给A。
  5. A 收到 B 发来的加密信息,并用私钥进行解密,再将解密后的字符串发送给B。
  6. B收到A的字符串,并于自己的字符串对比,若完全匹配,则允许此ip的此用户免密登录。

3. 生成密钥对

  • CentOS 平台 公钥保存路径:/root/.ssh/authorized_keys, 需要自行创建文件夹。
  • Ubuntu Server 平台 公钥保存路径于Centos一致,但无需创建。

利用ssh协议可以达到免密登录的效果。

  • 生成密钥
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa

ssh-keygen ssh密钥生成器; -t 指定加密算法; -P '' 指定密钥对,为空表示默认; -f:私钥存放位置

生成密钥对后,返回的结果中包含了密钥的存放位置:

  • 私钥路径:在 ‘-f’后所指定的路径中, 一般都是 root用户家目录下 .ssh/id_rsa中,完整路径为:/root/.ssh/id_rsa;
  • 公钥路径:在root用户家目录下 .ssh/id_rsa.pub中,完整路径为:/root/.ssh/id_rsa.pub;

输出结果:

4. 传送公钥给目标主机

  • 指令:
ssh-copy-id -i /root/.ssh/id_rsa.pub root@<target machine hostname or ip address>

根据步骤输入目标主机密码后若得到:

Number of key(s) added: 1

表示当前主机公钥已发送给目标主机,我们可以在目标主机的/root/.ssh/authorized_keys目录下查看到。

由于达成登录目标主机免密钥的关键是将自己的公钥文件传送给对方,因此通过scp等文件传输指令或者管理员直接用U盘拷贝过去也一样起作用。

5. 登录目标主机

  • 指令:
ssh root@<target machine hostname or ip address>
eg:
ssh root@CentOS7.testbench
ssh root@192.168.140.100

登陆成功:

问题: 在从CentOS 将公钥传送给 ubutnu server时出现拒绝登录root用户的情况。 解决方案: 此时可以将公钥文件传送给ubantu server的普通用户,再通过登录 ubuntu server的root用户将公钥文件移动到指定位置并重命名为authorzed_keys即可。

通过指令 exit 推出登录

6. 主机验证

在第一次用ssh链接主机时,会出现需要输入yes的手动确认环节如下图: 此行信息由本地SSH客户端发出,上方还有关于目标主机的一些身份信息,这个过程被称为主机验证。 此操作会中断一些自动化运维管理的脚本,所以为了解决这个问题,我们需要关闭这个环节。

6.1 ssh 主机验证原理

OpenSSH为了确认用户确实链接到自己想要链接的主机上,它通过通知用户主机相关信息并询问用户是否连接的方式来完成这个确认工作。 当用户输入‘yes’后,ssh客户端将目标主机的主机名与公钥将会被记录(保存在本地当前登录用户的家目录.ssh/known_hosts文件中)。下次再链接到此目标主机SSH客户端就会认出它并跳过警告环节进入身份认证的环节(输入密码或验证密钥对)。

6.2 关闭主机认证

  • 本次关闭:ssh -v -o GSSAPIAuthentication=no <username>@<hostname>
  • 永久关闭:需要更改ssh配置文件
    • ssh配置文件: /etc/ssh/ssh_config 这是OpenSSH的全局配置文件
    • 添加项目:StrictHostKeyChecking no, UserKnownHostsFile /dev/null 效果如下图: 保存此配置文件即可。

注:

当ssh使用 hostname 访问目标主机时,必须在当前主机的hosts文件中添加 域名到ip的对应关系。


本文章使用limfx的vscode插件快速发布