在 Linux 服务器上,如何设置权限,以便允许某一组用户通过 ssh 登录,但除非连接返回到 ssh 客户端地址,否则其进程的所有网络连接都将被阻止。例如,我想允许组中的用户通过 ssh 登录并启动 HTTP 服务器(在高端口上),然后从运行 ssh 客户端的计算机连接到它,但互联网上的任何其他客户端都不能访问 HTTP 服务器。
我知道我可以使用 iptables 完全阻止用户的网络访问,但是我如何允许来自或去往 的流量$SSH_CLIENT
?
答案1
您可以做的一件事是让他们运行一个 suid 脚本,该脚本在登录时修改 iptables。他们不需要传递任何参数,只需调用它。而 .bash_login 可以自动调用它。它可以运行 lsof 来获取与其父级 UID 关联的 ssh 连接的 IP,获取连接的 IP,然后使用以下规则将该 IP 列入白名单:
iptables -w -A users_input -p tcp -s $ip -m owner --owner-uid $owner -j ACCEPT
iptables -w -A users_output -p tcp -d $ip -m owner --owner-uid $owner -j ACCEPT
这些链被放置在过滤器 INPUT 和 OUTPUT 链中的适当位置。当然,还可以使用 --owner-uid 删除任何先前的规则。如果您愿意,您可以仅允许某些端口。
对于这样的脚本来说,具有污点模式的 Perl 应该没问题。
这样,在 ssh 连接断开后,该用户的网络仍可继续使用。如果这是个问题,您可以使用 cronjob 或守护进程来解决这个问题,该守护进程会定期检查已连接的 ssh 连接,然后删除与这些连接无关的任何规则。
我意识到这个答案中有很多“你可以做”的内容,但大部分都是苦差事。只要把 -m 所有者的东西弄对就行了。