背景:系统部署时采用了分布式微服务,但未采用容器化部署,巡检的时候,需要登录堡垒机从一台跳转到另外几台分别巡检,ssh跳转的时候,需要输入密码导致效率太低,使用ssh的公私密钥对来减少登录时间(虽然没解决根本问题)。
环境要求:主机A、主机B,两台主机ssh的22端口互通
操作:
在主机A上,使用root用户执行ssh-keygen -t rsa,默认秘钥无密码,在根目录下.ssh文件夹下生成公钥文件id_rsa.pub、密钥文件id_rsa;
继续执行ssh-copy-id root@主机B地址,在主机B根目录下的 .ssh目录下的authorized_keys文件中添加主机A的授权信息
在主机A上,执行ssh root@主机B地址,可以看到直接登录到主机B上。
说明:可以在主机B上配置限ip登录,只允许主机A登录到主机B,提高安全性。
思考:
1.在第二步中执行ssh-copy-id test@主机B地址,则在主机B的test用户目录下的 .ssh目录下的authorized_keys文件中添加相同的主机A的授权信息,本质上是将主机中的公钥拷贝到主机B的root或者test用户下的.ssh目录下,改名为authorized_keys,因此将主机A公钥拷贝到任何其他可以网通的主机对应目录下都可以免密登录。原理大概是,主机A登录B的时候,B会向A发送随机数(不知道此过程是否用A的公钥加密了),A收到随机数后用私钥加密发送回给B,B用A的公钥解密后与发送的随机数对比即可验证身份。
将主机A的root用户生成的私钥拷贝到A的test用户下,使用chown改变所有者后,发现使用主机A的test用户可以免密登录主机B的root和test用户,公钥中虽然带了root@主机Ahost信息,但是不影响主机A的test用户免密登录主机B,明白原理就很清楚为什么可以了。
扩展:
sshpass可以从参数、文件、环境变量中读入密码,然后远程登录在主机上,执行命令并将结果返回。且sshpass安装简单。
使用sshpass可以在一台服务器上,远程登录到系统其他服务器上,执行巡检脚本,并将结果汇总,只需要阅读汇总结果就可以完成巡检。
但问题在于,使用sshpass时,密码存储在服务器中,不太安全。
结合ssh的免密登录就可以完美解决这个问题。