我想将给定用户的基于公钥的身份验证委托给不同的 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 镜像使用类似的东西。但如果可能的话,那么可以建议在这些镜像中添加所需的服务器更改,以便将来可以使用这种方法。