嵌套 ssh 的安全性

信息安全 SSH 中间人
2021-08-24 14:16:33

首先,嵌套 ssh是指以下使用 ssh 的方式:

ssh usera@Bob 'ssh usera@C'

假设A想在服务器上登录C,但由于某种原因C不能直接访问A(例如C,在某个 FW 或 NAT 之后)。幸运的是,A的朋友Bob可以直接连接,CA可以连接Bob因此,为了登录CA实际上会做上述事情。

我在这里的问题是,鲍勃能够看到A和C之间的通信中明确,给予Bob是他的服务器的管理员。我的猜测是肯定的,但不太确定我对 SSH 内部的理解。

我认为 Bob 可以看到明文的原因是:有两个会话密钥:kabkac, 分别用于外部和嵌套ssh命令。kac理想情况下,Bob 是不知道的。(当 Bob 是 root 用户时是这样吗?)。无论如何,当消息到达 Bob 时,它必须用 解密kab然后用 加密kac并发送给C。所以在加密和解密之间,明文在内存中的某处。Bob 应该能够看到它,虽然不是直截了当。

有什么见解吗?

2个回答

是的,正如 deviantfan 解释的那样,如果你这样做,Bob 可以看到你的流量。

实现目标的一种更安全的方法是使用 SSH 中内置的代理功能。最简单的方法,如果您有 OpenSSH 7.3 或更高版本:

ssh -J usera@Bob usera@C

对于较旧的 OpenSSH 版本,如果您至少有 OpenSSH 5.4,则可以将以下内容添加到您的 ~/.ssh/config 中:

Host C
ProxyCommand ssh -W %h:%p usera@Bob

对于更旧的 OpenSSH 版本,您需要改用 netcat(假设 Bob 已安装它):

Host C
ProxyCommand ssh usera@Bob nc %h %p

现在,当您连接到 C 时,ssh 将首先连接到 Bob 并启动一个代理(它的内置代理或 Bob 的 netcat)。然后通过此代理转发从本地计算机到 C 的连接。连接是端到端加密的,一端是本地 ssh 客户端,另一端是远程服务器 C。会话密钥由您和 C 协商;鲍勃从未见过它。

当然,Bob 作为你的代理仍然可以冒充 C;但只要您之前验证过 C 的主机密钥指纹,您就可以通过通常的方式轻松检测到这一点。

是的,Bob 可以根据需要查看通讯。

本质上,第二个ssh调用是在 Bob 计算机上的 shell 中执行的,类似于有人坐在那里并在真正的键盘上打字。Bob 的计算机必须对它(以及每个输入)进行未加密。目标的输出返回给 Bob,在 usera 的 shell 中“显示”,因此 Bob 的 SSH 服务器将其发送回 A。

Bob 甚至不需要为原始内存访问或类似的事情而烦恼。有一些程序(如script)将 shell 的每个输入和输出记录到文件中。Bob 可以更改他计算机上每个注册用户的登录 shell,所以...