免密登录原理
生成密钥对:用户使用ssh-keygen工具在本地计算机上生成一对公钥和私钥。私钥通常存储在用户的~/.ssh目录下(在本地计算机)需妥善保管,而公钥可以通过ssh-copy-id或手动将其复制到远程主机上,是公开使用的,在将来的登录过程中,公钥用于对会话进行加密,并验证是否与存储在远程主机上的公钥匹配。
id_rsa是私钥,而id_rsa.pub是公钥
发送公钥:用户将公钥复制到需要访问的远程主机上。在将来的登录过程中,用户将使用私钥对登录请求进行加密,并发送给远程主机
验证公钥:远程主机在收到用户的登录请求后,会使用预先存储的公钥对请求进行解密,并验证其是否与已存储的公钥匹配。如果匹配成功,远程主机会允许用户登录。
加密会话:如果公钥验证成功,远程主机将使用用户的公钥对会话进行加密,并将加密后的数据发送给用户。用户使用私钥对加密数据进行解密,并继续执行登录过程。
每台主机authorized_keys(可以自己创建一个)
文件里面包含的主机(ssh密钥),该主机都能无密码登录,所以只要每台主机的authorized_keys
文件里面都放入其他主机(需要无密码登录的主机)的ssh密钥就行了。比如想在slave2 上免密登录slave3,只需要将slave2的公钥添加到 slave3的authorized_keys就可以了
实现方法
hosts 文件映射
每个节点生成 ssh 密钥
这里先假设在matser节点上
ssh-keygen -t rsa
执行上述命令后会看到有生成文件夹.ssh,这个文件夹下面有id_rsa和id_rsa.pub两个文件,我们可以创建一个文件夹authorized_keys,用于存放公钥
cp id_rsa.pub authorized_keys
将authorized_keys文件拷到下一个节点,并将该节点的ssh密钥id_rsa.pub加入该文件中(这里将authorized_keys拷贝到slave1节点上)
scp -r authorized_keys root@slave1:/root/.ssh/
,然后将slave1的公钥也追加到authorized_keys(这里需要登录slave1 节点,并且以及执行生成密钥命令,也就是上述的ssh-keygen -t rsa
)
cat id_rsa.pub >> authorized_keys
到这一步slave1的authorized_keys中有 master的公钥文件,就可以在master上免密登录slave1了。按上述规律实现其他节点之间的免密登录即可。
发送公钥命令
比如,我想在slave2上免密登录slave3,只需将slave2的公钥添加到slave3的authorized_keys文件中
ssh-copy-id -i ~/.ssh/id_rsa.pub [root]@[slave3]
若要访问 slave1节点,我们就把slave1节点对应的公钥指纹放到当前节点的known_hosts文件中
ssh-keyscan slave1 >>~/.ssh/known_hosts