基于用户名的SSH代理

我试图根据传入的用户名即两个ssh服务器之间多路复用

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

可以这样做吗?

不是,ssh会话中的所有内容都是encryption的。 你如何build议代理将能够窥探用户名?

我想你可以用ForceCommand来做到这一点,比如:

 ForceCommand proxyscript 

在/ etc / sshd / sshd_config中。 这里proxyscript将是一个自定义的脚本,将ssh到下一个服务器应该是,取决于哪个用户正在运行它。 该脚本将有足够的信息来做到这一点,因为根据sshd_config的手册页,它将运行在用户的loginshell,所以例如$ USER将可用。

如果你只有一小组,固定的用户你想这样做,那么你可以在sshd_configconfiguration全部例如

 Match User user1 ForceCommand ssh user1@host1 Match User user2 ForceCommand ssh user2@host2 

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

这是相当平淡的做透明 (可能调整SSH蜜jar程序自动login,然后使用ForceCommand来处理代理?听起来很混乱),但你可以设置一个代理,并指导你的用户如何使用它很容易。

这个概念被称为SSH 堡垒主机 。 代理(堡垒)上不需要特殊的软件。 最终用户需要访问的唯一软件是netcat( nc ),所以如果你愿意,你可以为他们创build一个相当残酷的监狱。

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

 Host MYSERVER ProxyCommand ssh BASTION nc -w 600 USER1_SERVER 22 

每个用户的configuration只会在通过堡垒连接到本地networking的目标服务器(例如USER1_SERVER)中有所不同。 (如果用户名不同,请考虑使用ProxyCommand ssh BASTION_USERNAME@BASTION nc -w 600 USER1_SERVER_USERNAME@USER1_SERVER 22

这实际上就是这一切。 现在USER1可以运行ssh MYSERVER 。 如果不使用SSH密钥,USER1将被提示input密码给BASTION,然后input内部系统USER1_SERVER的密码。 如果使用SSH密钥,并且在BASTION和USER1_SERVER中都安装了USER1的公钥,则login将自动进行。

Windows用户可以通过使用plink (PuTTY的一部分)通过PuTTY来做到这一点。 这是一个指南 。


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

 Match User user1 ForceCommand nc -w 600 USER1_SERVER 22 

…虽然这阻止了用户1在堡垒上pipe理其authorized_keys文件。