使用 A 上的私钥通过 B SSH 连接到 C

使用 A 上的私钥通过 B SSH 连接到 C

以下是我的情况:

  • 主机 C 无法从 A 访问。
  • 主机 B 可从 A 访问。
  • 可以从 B 访问主机 C。
  • B 和 C 都有~/.ssh/id_rsa.pub(来自 A)authorized_keys
  • B 没有私钥(~/.ssh/id_rsa),因为这会存在安全风险(密钥属于个人)。
  • 由于 B 没有私钥,因此无法通过 B 登录到 C

我如何使用主机 A 中的密钥登录主机 C?这可能吗?恐怕不可能。

(类似但不同于这个问题

编辑

我需要的是一种方法来动态地(stdin 或类似方式)向 B 中的 ssh 跳跃提供私钥,而无需它接触 B 中的文件系统。这可能吗?

答案1

如果您正在使用最新版本的 OpenSSH,您只需输入:

ssh -J B C

如果您使用的是稍旧一些的版本而不受支持,-J则可以使用稍微更复杂的语法:

ssh -o ProxyCommand='ssh -W %h:%p B' C

如果每次从 A 到 C 进行 ssh 时都需要这个,那么在文件中添加如下条目会很有用.ssh/config(在较新的版本中):

Host C
   ProxyJump B

或者像这样(稍微旧一点的版本):

Host C
   ProxyCommand ssh -W %h:%p B

使用上述任何一种方式,您只需键入即可ssh C打开连接。当您ssh通过众多用于ssh传输的工具之一间接使用时,这尤其有用。并非所有这些工具都提供了将命令行标志传递给ssh命令的直接方法。

答案2

这相当简单。只需使用代理转发(ssh 上的 -A 选项)。

样本:

#On machine A use
ssh -A user@<machine_B>
#Then on machine B use
ssh -A user@<machine_C>

无需到处复制私钥。-A 仅将任何 SSH 代理请求转发到链中的第一个机器,因此只要您不在中间机器上切换用户,就可以使用机器 A 上的私钥。

如果您在机器 B 上更改用户(例如使用 su foo 更改为用户 foo),则代理转发不再起作用,因为下一个连接是以用户 foo 使用它自己的密钥完成的。

答案3

我在寻找同样的东西时偶然发现了这个问题。这里的解决方案如下:

ssh -o ProxyCommand="ssh -i /path/proxy.pem -W %h:%p user@proxy_host" -i /path/target.pem user@target_host

不过,我不能居功,因为这个解决方案来自另一个问题,但我已经验证过这种方法是有效的。

相关内容