我需要限制对许多我无法控制的网络的访问,并计划使用 jumpbox 作为进入所有环境的单一入口点。用户将使用他们的 ldap 凭据以及他们的 ssh 密钥登录,然后从这里跳转到他们被允许访问的一组主机。
核心问题是限制用户可以访问哪些地方。由于这是我们团队的许多成员都可以访问的共享资源,我该如何限制这种访问。我以为可以使用 radius 来实现,但我没有看到任何方法。我想让这尽可能简单,即
ssh -t user@jumpbox ssh user@remote_host
remote_host
他们被允许访问哪个系统?
我的想法如下:
(最耗资源)每个用户一个跳转箱,并通过 puppet 集中管理允许他们访问的路由。这可能是最容易管理的,因为它是每个用户一个 VM。
(对用户来说最痛苦)设置一个脚本,这是用户唯一可以运行的,可以给他们选择的东西。这会很麻烦,因为用户必须从可能很长的列表中进行选择。这也很容易解决。
其他人做了什么来解决这个问题?
答案1
我使用组和链-m owner --gid-owner
中的 iptables 规则来执行此操作OUTPUT
。
离开跳转箱的流量根据不同的组进行控制:
# timesheet people go to the timesheet rule
iptables -A OUTPUT -m owner --gid-owner 401 -j TIMESHEET
# debt mgmt people go to the debt rule
iptables -A OUTPUT -m owner --gid-owner 402 -j DEBT
# end to end testing people
iptables -A OUTPUT -m owner --gid-owner 403 -j E2E
然后,每个自定义链将实施一组(有时相当复杂)规则,规定与该链匹配的人可以访问哪些系统。一个简单的规则可能是:
# people in the primary group timesheet can go to the timesheet app http://192.168.12.38:17001/
iptables -A TIMESHEET -p tcp --dport 17001 -d 192.168.12.38 -j ACCEPT
# but can't do anything else, with logging
iptables -A TIMESHEET -j LOG --log-prefix "TIMESHEET REJECT: "
iptables -A TIMESHEET -j REJECT
一旦设置完成,允许访问只需将某人放入主要组 401(用于时间表)、402(用于债务管理)等即可。如果我想允许高复杂性,我可以--uid-owner
为每个用户使用不同的链,但相反,我通过设置组来让我的生活更简单一些。
答案2
如果我必须使用 SSH 作为访问控制层,我会强制使用密钥来访问堡垒主机,然后force_command
在每个密钥上放置一个,以调用一个脚本,该脚本带有密钥后面用户的标识符。然后,该脚本将验证所识别用户的访问控制权限,并启动到相应计算机的 netcat 会话。用户将ProxyCommand
在本地使用代理通过堡垒主机连接到实际目标计算机,因此用户可以通过 netcat 隧道通过 SSH 连接到感兴趣的计算机,最好再次通过 SSH 密钥。
答案3
您可以使用以下指令在目标上配置 sshd_config,以允许来自特定主机的特定用户。
AllowUsers username@foot
所以在一台服务器中,你可以限制从跳转服务器对该用户的访问。(假设你的跳转服务器地址是 192.168.15.15。
AllowUsers [email protected]
并将访问限制为仅限该跳转服务器的另一个用户:
AllowUsers [email protected]
您还可以使用此指令进行模式匹配(根据 man sshd_config)。请注意,根据员工人数,您可能需要对配置文件进行大量管理。这也会影响您用于登录服务器的任何脚本,因为在您添加 AllowUsers 后,登录次数将限制在 AllowUsers 中。