下面不是询问基于名称的虚拟路由,而是询问使用用户名或身份密钥的虚拟路由。
有没有人做过对用户透明的 SSH 代理,但他们被路由到的终端主机由以下任何一项决定:用户名、身份密钥、DNS 主机名。我猜 DNS 主机名不可能与协议一起使用,但它可以使用身份密钥。
例如,我希望所有用户都能够通过 SSH 连接到同一台机器,但他们最终位于不同的 VPS 节点上:ssh -iidentity_rsa[电子邮件保护]。
这样做有几个非常好的特点:
- 无论您通过 SSH 进入哪个 VPS,RSA 主机密钥都是相同的。
- 主机名可能相同,或者(可疑)它可能在子域名上路由。我不确定这是否在协议中,或者它仅使用 IP 地址连接到 TCP 套接字。
- 客户端零配置(代理命令、多个 ssh 隧道等)
- 所有流量都通过网关进行传输。
我担心这需要自定义的(合法的)MitM SSH 服务器,因为我想要一个可以执行 SCP 和代理转发的正常端到端 SSH 连接。
代理转发可以与强制命令一起使用吗?我可以根据公钥创建强制命令,调用SSH -A
内部主机吗?
答案1
我对此仍心存疑虑(请参阅我之前的回答)。您无法在此处使用反向代理,除非您有一个知道如何进行 ssh 身份验证的反向代理,即使这样,您的代理也是 ssh 连接的端点,因此它知道通过它传输的数据,并且它拥有用户连接和与其后面的服务器连接的 ssh 密钥。如果有人可以访问该系统,那么它后面的一切很可能就都结束了。
如果您准备让用户登录两次,第二次连接通过第一次连接隧道传输到堡垒主机,那么您可以避免一些风险,但您说过这不是您想要的。
所以,你确实需要锁定你的堡垒主机。
您的堡垒主机需要拥有一组用户帐户,每个帐户的 .ssh 文件夹中都有 ssh 私钥,用于登录其背后的主机。它们还将保存用户登录时使用的公钥。
您需要确保用户除了通过 ssh 连接到后面网络上的主机之外,无法在堡垒上运行任何操作。在 ssh authorized_keys 文件中设置该 ssh 命令,这样使用公钥登录时就会自动运行 ssh 命令以连接到堡垒后面的主机。请参阅 中的 AUTHORIZED KEYS 部分 man sshd
,特别是“command=”位。
- 将堡垒上除了 ssh 命令之外可以执行任何操作的用户数量保持在最低限度。可能只有 root 访问权限。也可能是一两个管理员用户。
- 确保用户无法向 ssh 命令添加参数。
- 无需密码访问。仅限 SSH 密钥。
- 禁用 AllowTcpForwarding、PermitTunnel、X11Forwarding
- 如果您要设置 SSH 代理转发,请务必小心。如果不需要,请禁用。
- 考虑设置每个用户的 chroot 目录,其中几乎没有任何内容。
答案2
我很难想出一个好的理由去做你所描述的事情。即我想到过的可能性大多是不可取的。
我建议你更多地介绍一下你试图解决的根本问题是什么,而且答案可能会引导你走向完全不同的方向。
根据进一步的信息:
我的第一个建议是,您在堡垒主机上设置多个转发端口,每个转发端口都转发到不同机器上的 ssh。如果您的用户将端口存储在他们的 .ssh/config 文件或 putty 配置中,那么这并不会造成太大的不便。
您可以在堡垒主机上拥有 ssh 帐户,并使用 authorized_keys 文件中指定的命令通过 ssh 连接到相应的主机。您将需要两个 ssh 登录过程,这会有点慢,但如果您使用 ssh 代理和代理转发,就不会太麻烦。代理转发确实意味着,如果堡垒主机被攻破,那么当时登录的任何人只要保持连接,他们的 ssh 密钥都可能被滥用。
选项 2 更接近您的要求,但在我看来,选项 1 更好。
NB(稍后添加)
请注意,选项 2 会受到炮弹冲击bash 漏洞。我希望人们早就修补了这个问题,但这是一个示例,说明在主机上终止 ssh 访问,然后通过第二个 ssh 连接传递连接,这种做法可能会存在漏洞,而基于端口转发的解决方案则不会存在漏洞。