基于用户名的 SSH 代理

基于用户名的 SSH 代理

我正在尝试根据传入的用户名在两个 ssh 服务器之间进行多路复用。

ssh user1@testserver 将转到一个 sshd 实例,而 user2@testserver 将转到另一个 sshd 实例。

这能做到吗?

答案1

不。ssh 会话中的所有内容都是加密的。您认为代理如何能够窥探用户名?

答案2

我认为你可以这样做ForceCommand,例如:

ForceCommand proxyscript

在 /etc/sshd/sshd_config 中。这里proxyscript将是一个自定义脚本,它将根据运行它的用户通过 ssh 连接到下一个服务器。该脚本将具有足够的信息来执行此操作,因为根据 sshd_config 的手册页,它将在用户的登录 shell 下运行,因此例如 $USER 将可用。

如果你只想为一小部分固定的用户执行此操作,那么你可以在 sshd_config 中配置所有内容,例如

Match User user1
ForceCommand ssh user1@host1

Match User user2
ForceCommand ssh user2@host2

但我不知道这是否能正确地将传入连接的标准输出/输入连接到新 ssh 命令的标准输入/输出。

答案3

这是非常不容易做到的透明地(也许可以调整一下SSH 蜜罐程序自动登录,然后用来ForceCommand处理代理?听起来很乱),但您可以设置代理并指导您的用户如何轻松地使用它。

这个概念叫做 SSH堡垒主机。代理(堡垒)上不需要任何特殊软件。最终用户需要访问的唯一软件是 netcat ( nc),因此,如果您愿意,您可以为他们创建一个相当简单的监狱。

每个 OS X / Linux / BSD / UNIX 用户都会在他们的~/.ssh/config文件中(在他们的本地客户端上,而不是堡垒上)有一个如下所示的条目:

Host MYSERVER
  ProxyCommand ssh BASTION nc -w 600 USER1_SERVER 22

每个用户的配置仅在目标服务器(例如 USER1_SERVER)上有所不同,该服务器通过堡垒在本地网络上连接。(如果用户名不同,请考虑ProxyCommand ssh BASTION_USERNAME@BASTION nc -w 600 USER1_SERVER_USERNAME@USER1_SERVER 22。)

这实际上就是全部内容。现在 USER1 可以运行ssh MYSERVER。如果不使用 SSH 密钥,USER1 将被提示输入 BASTION 的密码,然后输入内部系统 USER1_SERVER 的密码。如果使用 SSH 密钥,并且 USER1 的公钥安装在 BASTION 和 USER1_SERVER 中,则登录将自动进行。

Windows 用户可以使用 PuTTY plink(PuTTY 的一部分)来完成此操作。 以下是指南


如果你想严格限制堡垒上的用户,你可以这样做:

Match User user1
  ForceCommand nc -w 600 USER1_SERVER 22

...尽管这确实阻止了用户1在堡垒上管理他们的authorized_keys文件。

相关内容