要了解认证转发工作的原理,让我们首先看一下一个假设情况,其中用户 drobbins 有一个称为 lappy 的可信的便携式电脑、一个称为 trustbox 的可信服务器和另外两个他必须访问的不可信系统,分别称为 notrust1 和 notrust2 。当前,他在所有这四台机器上都使用 ssh-agent 以及 keychain ,如下所示:
图 1. 运行在可信和不可信机器上的 ssh-agent
这种方法所带来的问题是如果有人获取 notrust1 或 notrust2 的 root 访问权,那么这个人当然可以从现在易受攻击的 ssh-agent 进程中抽取密钥。为了解决这个问题, drobbins 停止运行不可信主机 notrust1 和 notrust2 上的 ssh-agent 和 keychain 。事实上,为了更为小心, drobbins 决定只在 lappy 上使用 ssh-agent 和 keychain 。这样限制了他解密的私钥的泄露,同时防止他的私钥被偷窃:
图 2. ssh-agent 只运行在 lappy 上;一个更安全的配置
当然,这种方法带来的问题是 drobbins 现在只能从 lappy 建立无密码的连接。让我们看一下如何启用认证转发并解决这个问题。
假设所有机器都运行 OpenSSH 的最近版本,通过使用认证转发,我们能解决这个问题。认证转发允许远程 ssh 进程联系您正在本地可信机器上运行的 ssh-agent ― 而不要求在您正运行 ssh 的同一台机器上运行 ssh-agent 的一个版本。这通常允许您在单个机器上运行 ssh-agent (和 keychain ),并且这意味着源于这台机器的所有 ssh 连接(直接或间接)都将使用本地 ssh-agent 。
为了启用认证转发,我们在 lappy 和 trustbox 的 /etc/ssh/ssh_config 中添加了下面行。请注意:这是 ssh 的配置文件( ssh_config),而不是 ssh 守护进程 sshd 的配置文件( sshd_config):
清单 1. 将这行添加到 /etc/ssh/ssh_config 中
ForwardAgent Yes
现在,为了利用认证转发, drobbins 可以从 lappy 连接到 trustbox ,然后在不提供任何连接的密码的情况下,从 trustbox 连接到 notrust1 。这两个 ssh 进程都“进入”运行在 lappy 上的 ssh-agent :
清单 2. 进入 lappy
$ ssh drobbins@trustbox Last login: Wed Sep 26 13:42:08 2001 from lappy Welcome to trustbox! $ ssh drobbins@notrust1 Last login: Tue Sep 25 12:03:40 2001 from trustbox Welcome to notrust1! $
如果您尝试使用类似的配置,并发现代理程序转发不起作用,请尝试使用 ssh -A 替代原来单纯的 ssh 来明确启用认证转发。这里是当我们使用上面提到的认证转发而登录到 trustbox 和 notrust1 时,实现此操作的内部运行图:
图 3. 正在运作的代理程序转发
正如您看到的,当 ssh 连接到 trustbox 时,它维持与运行在 lappy 上的 ssh-agent 的连接。当产生从 trustbox 到 notrust1 的 ssh 连接时,这个新的 ssh 进程维持与以前 ssh 的认证连接,这样有效地延伸了链。这个认证链是否能延伸到 notrust1 以外的其它主机取决于 notrust1 的 /etc/ssh/ssh_config 是如何配置的。 只要启用了代理程序转发,通过使用在可信 lappy 上运行的 ssh-agent ,这个链上的所有部分都能认证。