如何在各个主机之间免密码登录

这篇记录源自于我在 Twitter 上这样的一个问题
现在有一个集群,每个机器都有其余机器的公钥,这样可以实现免密码登陆,但是一台机器被入侵其余机器不就悲剧了么,有啥办法可以防范的?

不考虑安全性,最简单的办法是在其中的一台主机上生成一套密钥以及一个 authorized_keys 文件,然后分发到其余的主机上就可以了,但是这样显然是不合理的。 @tifan 给出了一个不错的方案,简单的说就是一个 -A,也就是启动 ssh 的认证转发。

local ---> server-1 ---> server-2 --> server-3

local 上启动 ssh-agent:
$ exec ssh-agent /bin/bash
添加密钥,并查看:
$ ssh-add  .ssh/id_rsa_jw
Identity added: .ssh/id_rsa_jw (.ssh/id_rsa_jw)
$ ssh-add -l
2048 33:b8:33:33:1w:8w:67:81:aw:wq:ca:a8:3a:13:28:c0 .ssh/id_rsa_jw (RSA)
登录 server-1:
$ ssh -A [email protected]

现在就可以免密码登录 server-2 了:
$ ssh [email protected]

如果想要继续登录 server-3,则需要在登录 server-2 时加上 -A:
$ ssh -A [email protected]

注意:在执行 ssh-agent 时,记得加上 exec,不然会出现下面的错误:
Could not open a connection to your authentication agent

上面的 -A 参数就是 ~/.ssh/config 或者 /etc/ssh/ssh_config 中的 ForwardAgent,开启就不必每次都要手动输入 -A 了:
ForwardAgent yes

安全永远是相对的,本套方案同样,@czbug 同学这里记录了一篇 ssh-agent 的安全隐患。要解决此问题,还得靠人,在 man ssh 里面说的很清楚:

"Agent forwarding should be enabled with caution.  Users with the ability to bypass file permissions on the remote host (for the agent's  UNIX-domain  socket)  can  access  the  local  agent through  the forwarded connection.  An attacker cannot obtain key material from the agent, however they can perform operations on the keys that enable them to authenticate using the identities loaded into the agent."

以后完事后记得注销。