我的networking中有以下设置:
Internet <--> Bastion <--> Local Network
我有几个用户,每个用户被分配到一台特定的机器。 或换句话说:每个用户必须只能访问其中的一台服务器。 例如:用户1 – >机器1,用户2 – >机器2等等。
这些用户将从我的networking外部连接,我已经考虑了很多select如何通过我的堡垒主机转发他们的连接到我的networking。
最终我select了Match Blocks和forcecommand。
所以,我在堡垒上的/ etc / ssh / sshd_config如下所示:
Match User User1 ForceCommand ssh User1@Machine1 $SSH_ORIGINAL_COMMAND
User1连接到自动与Machine1build立连接的堡垒主机。
据我了解ForceCommand,User1将不会有任何真正的访问堡垒主机,因为他的所有操作将由匹配块首先处理,因此重新路由到Machine1。 但是这是真的吗? 这已经足够成为一个安全的设置? 无论如何,用户在Machine1上被监禁,所以他不会有很多的可能性。
我使用堡垒主机的方式是使用ProxyCommand和-W标志,如下例所示:
ssh -o ProxyCommand='ssh -W %h:%p user@bastion' user@machine
出于安全原因,我使用这种方法。 客户端和目标机器之间的通信是端到端encryption和authentication的,这意味着即使堡垒受到攻击,它仍然是安全的。 一个妥协的堡垒主机将提供不低于使用SSH端到端没有堡垒的安全性。
这也消除了使用任何代理转发的需要。 客户端可以首先使用基于密钥的身份validation来访问堡垒,然后再次访问目标主机,而没有提供任何一个可以用来滥用客户端上的私钥的代理连接。
它也限制了我在堡垒主机上所依赖的代码。 我根本不需要在堡垒上执行任何命令。 -W意味着没有命令标志以及单个端口转发,这个端口转发是所有堡垒主机需要允许的。
考虑到这种方法,我的build议是尽可能地locking堡垒主机,只允许使用上述结构的命令。
堡垒上的~/.ssh/authorized_keys文件可以被root用户所拥有(就像从文件系统根目录到文件系统的path上的所有目录一样),这就减less了即使有人设法破坏也可能被修改的风险作为堡垒主机上的非特权用户。
在authorized_keys ,可以通过使用options command , no-agent-forwarding , no-pty , no-user-rc , no-X11-forwarding来限制客户端的权限,以及使用permitopen限制端口转发以仅允许访问允许该用户访问的主机上的端口22。
原则上,即使多个用户在堡垒上共享一个用户名,这种方法也是安全的。 但是通过在堡垒上使用不同的用户名,你会得到更多的分离。
你可以很容易地绕过ForceCommand,因为它在shell启动的时候就开始了。 这基本上意味着你的shell rc文件是先处理的,然后是ForceCommand,如果你允许的话。 简单的exec sh在你的shell rc文件中会产生另外一个shell并保持ForceCommand等待,直到你退出这个shell。
所以底线; 如果用户可以通过ftp,sftp,scp或其他方式以某种方式编辑他的shell rc(比如.bashrc),那么ForceCommand实际上并不是什么可依赖的东西。
我想大多数时候都没问题,但是安全问题是没有人想到的。 没有保证。
比如很久以前没有人想过用bash中的环境variables创build函数的方式,但是最近人们意识到可能会被颠覆,其中一个影响就是ForceCommand可能被获取(在至less在authorized_keys文件中实现)如果用户的shell是bash。 Bash已经修复了,希望你的版本是最新的,但是这样的事情发生了。
我不完全确定定义ForceCommand是否与在authorized_keys文件中定义这些命令的效果相同。 我没有仔细看过。
制作由root:usergrp拥有的.bashrc ,但仍然可以作为用户login时运行的sshd读取。在$ HOME上设置perms / owner不允许用户创build新文件。 这样,根控制.bashrc内容,让它做它所需要的,但是用户本身不能改变这些设置,或者对间接允许它们改变.bashrc内容的文件/目录的权限。
我有另一个想法。 对于bastion服务器上的每一个用户,你可以在/ etc / passwd中定义他们的shell是一个简单的运行ssh user1 @ machine1,user2 @ machine2等的bash脚本。这样你就可以确保它们没有任何有效shell在服务器本身,他们只是连接到他们应该连接到的机器。