是否可以使用代理转发排除所有密钥的转发(除非特别说明的密钥)?或者,是否有任何方法可以指定每个会话中尝试密钥的顺序?
使用ssh-agent
需要管理不同的套接字:https://superuser.com/questions/357602/use-a-specified-key-from-ssh-agent/401737#comment396923_358604
是否有更容易配置的替代代理?
例如:
Client A --> ssh/agent-forwarding --> Server B --> Server C
|
------> Server D
我想在代理转发中只允许一个密钥,即允许:A -> B -> C
,而不是A -> B -> D
。或者至少指定尝试密钥的顺序。
(根据@jeff-ferland 的回答,进行了编辑,以便更加清晰。)
答案1
我不知道有任何代理允许选择性转发密钥(如您所图所示)。一旦密钥被转发到主机,它就像本地存储的一样,可用于从那里对任何主机进行身份验证。
从另一个层面来看你的问题,对于你可能尝试做的事情我有两个想法:
- 防止某人在没有实际到达某个位置的情况下对某些主机进行身份验证。
如果这是您的目标,您无法通过控制身份验证密钥来实现。您必须通过架构和主机限制来控制访问,这样任何可以远程访问的主机都无法访问“安全”的主机。
- “保护”某些密钥,使它们不被泄露。
如果这是您的目标,那么这是对如何保护密钥的误解。密钥本身永远不会被转发。访问 ssh 代理以根据密钥进行身份验证的能力被转发。但是,只有在转发到位时,并且只有当您将代理转发到的机器由不可信的管理员(自愿或通过妥协)运行时,才能利用该转发。因此,在您的图表中,除非您成功从机器 B -> D 登录和从 A -> B -> D 导出转发,您不会面临暴露凭据的风险。如果您信任 B,则可以安全地从 A -> B 转发。
我建议你读一下一个非常详细的解释转发如何通过图表进行如果您仍然不清楚这个概念。
答案2
像所请求的功能应该属于 ssh 客户端。
ssh-agent 很难确定它何时通过转发进行通信以及何时与本地 ssh 客户端进行通信。让服务器应用限制将是一个安全漏洞。这使得 ssh 客户端成为此类功能唯一可以合理存在的地方。
快速浏览 openssh 源代码后,我发现了 clientloop.c 中的 client_request_agent 函数。从那里看到的内容来看,我得到的印象是 ssh 客户端只是转发原始字节流,而不尝试了解正在使用哪些密钥。这意味着需要付出巨大努力才能将此功能添加到客户端。
另一个相关功能是可以选择使用两个不同的代理,这可以减少工作量。一个代理可用于与服务器进行身份验证,而另一个代理可用于转发到服务器。
这两个都是很有用的功能,我也会用到,但遗憾的是它们似乎还不存在于 openssh 中(目前)。
答案3
如果此问题仅在使用需要不同密钥的各种私有存储库进行应用程序部署时出现:
您可以完全跳过代理转发。将文件复制到包含各种密钥的机器上,然后将克隆的存储库 rsync 到部署发生的服务器上。
Client A
|
* private keys
* `git clone ...` private repos
* /tmp/repos
|
| ------------> rsync/scp -----------> Server B
您可以使用别名、shell 脚本等来自动化该过程。Capistrano 甚至内置了此功能。这被称为复制策略:http://rubydoc.info/github/capistrano/capistrano/master/Capistrano/Deploy/Strategy/Copy