我有一台我管理的服务器。它可以通过端口 22 访问许多机器。我想将它用作某些用户的堡垒主机。问题是我希望我服务器上的每个用户都有自己的 IP/地址白名单,它可以通过 SSH 连接到。
例如,假设我的机器 M 可以访问服务器 S1、S2、S3、... S8。我在机器 M 上有 3 个用户,A、B 和 C。我希望 A 只能通过 SSH 连接到 S2,B 只能通过 SSH 连接到 S1、S5 和 S6,而 C 能够通过 SSH 连接到 S2 、S3、S4、S5 和 S8。
我该如何实现?
在目标服务器上,您可以通过 /etc/ssh/sshd_config 文件中的用户名限制 SSH 访问,但我认为这不是您在此处寻找的内容。
在源机器上,您可以尝试使用 iptables “owner” 模块来执行此操作。这可能是一些维护工作,但它可以解决问题。它检查用户的 UID,然后允许(或拒绝)连接。
假设您的用户的 UID 为 1、2 和 3。允许用户 A SSH 到 1.1.1.1,用户 B 到 2.2.2.2,用户 C 到 3.3.3.3
iptables -A OUTPUT -m owner --owner-uid 1 -d 1.1.1.1/32 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -m owner --owner-uid 1 -p tcp --dport 22 -j DROP
iptables -A OUTPUT -m owner --owner-uid 2 -d 2.2.2.2/32 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -m owner --owner-uid 2 -p tcp --dport 22 -j DROP
iptables -A OUTPUT -m owner --owner-uid 3 -d 3.3.3.3/32 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -m owner --owner-uid 3 -p tcp --dport 22 -j DROP
Run Code Online (Sandbox Code Playgroud)
为了让它更“易于管理”,您可以为每个用户创建一个“链”,并在其中定义所有允许的访问权限。
创建链:
iptables -N USER1
iptables -N USER2
iptables -N USER2
Run Code Online (Sandbox Code Playgroud)
将来自用户的传出流量转发到链:
iptables -A output -m owner --owner-uid 1 -J USER1
iptables -A output -m owner --owner-uid 2 -J USER2
iptables -A output -m owner --owner-uid 3 -J USER3
Run Code Online (Sandbox Code Playgroud)
为每个用户的链添加规则:
iptables -A USER1 -d 1.1.1.1/32 -p tcp --dport 22 -m comment --comment "allow ssh to 1.1.1.1" -j ACCEPT
iptables -A USER1 -p tcp --dport 22 -j DROP
iptables -A USER1 -j ACCEPT
iptables -A USER2 -d 2.2.2.2/32 -p tcp --dport 22 -j ACCEPT
iptables -A USER2 -p tcp --dport 22 -j DROP
iptables -A USER3 -d 3.3.3.3/32 -p tcp --dport 22 -j ACCEPT
iptables -A USER3 -p tcp --dport 22 -j DROP
Run Code Online (Sandbox Code Playgroud)
检查用户的访问权限(显示链)
iptables -L USER1
Run Code Online (Sandbox Code Playgroud)
owner 模块也适用于 gid:
iptables -A USER3 -m owner --owner-gid 3 -p tcp --dport 22 -j DROP
Run Code Online (Sandbox Code Playgroud)