根据用户名委托 SSH USERAUTH 流量

根据用户名委托 SSH USERAUTH 流量

我想将给定用户的基于公钥的身份验证委托给不同的 SSH 服务器,而无需修改客户端配置,但允许修改服务器软件。

已经有几个类似的问题了。要求根据主机名而不是用户名进行调度。尝试通过用户名进行调度,但他们只回答了第一个 ssh 会话导致调用第二个ssh命令的情况,因此如果启用了代理转发,这将仅在最终目的地使用公钥。这个问题更具体地说明了如何实现既定目标。

图层

我读了RFC 4251 第 1 节。据此,SSH 堆栈中有三层。TRANS(传输)层提供完整性和服务器身份验证。USERAUTH(用户身份验证)层进行用户身份验证,CONNECT(连接)层多路复用实际有效负载数据。因此,我希望在转发 USERAUTH 和 CONNECT 层时,在 TRANS 层进行中间人拦截。

           client   proxy   server
 CONNECT        X-----------X
USERAUTH        X-----------X
   TRANS        X---X   X---X
     TCP        X---X   X---X

由于 TRANS 层执行服务器身份验证,因此客户端显然会看到代理的公钥,这在我的应用程序中是可以接受的。根据RFC 4252 第 1 节,USERAUTH 层确实会从 TRANS 层接收会话标识符。这意味着实际的服务器可能需要一些附加功能,以便它可以使用客户端和代理之间协商的会话标识符,而不是它自己与代理协商的会话标识符。

可以这样做吗?
是否有已知的此类方案的实现?
或者我忽略了什么,为什么即使可以控制代理和服务器上运行的软件,这种方法也无法奏效?

应用

各种服务都以现成的 Docker 镜像的形式提供,这些镜像以某种方式通过 ssh 提供对其数据的 git 访问。通常所有访问都使用单个帐户进行,使用公钥来实际区分用户。因此传递公钥至关重要。

可以使用不同的端口公开这些服务。但是,对除已注册服务之外的服务使用特权端口可能会被视为不良做法,使用非特权端口存在安全风险,而且总体而言,用户名比端口号更容易记住。此外,用户名无论如何都是必需的,即使它只是git。不需要非标准端口号允许使用‹user›@‹host›:‹path›git 存储库的较短表示法,而不是较长的ssh://‹user›@‹host›:‹port›/‹path›

我怀疑目前是否有任何常见的 Docker 镜像使用类似的东西。但如果可能的话,那么可以建议在这些镜像中添加所需的服务器更改,以便将来可以使用这种方法。

相关内容