Блокировать сетевой доступ пользователя, за исключением обратного адреса клиента SSH

Блокировать сетевой доступ пользователя, за исключением обратного адреса клиента SSH

Как настроить разрешения на сервере Linux так, чтобы определенной группе пользователей было разрешено входить через ssh, но все сетевые соединения их процессов блокировались, если только соединение не возвращается к адресу клиента ssh? Например, я хочу разрешить пользователю в группе входить по ssh и запускать HTTP-сервер (на высоком порту), а затем подключаться к нему с компьютера, на котором запущен клиент ssh, но любой другой клиент в Интернете не должен иметь доступа к HTTP-серверу.

Я знаю, что могу полностью заблокировать сетевой доступ пользователя с помощью iptables, но как разрешить трафик, который исходит или уходит в соответствии со значением $SSH_CLIENT?

решение1

Одно из того, что вы можете сделать, это заставить их запустить скрипт suid, который изменяет iptables при входе в систему. Им не нужно передавать ему никаких аргументов, просто вызвать его. И .bash_login может вызывать его автоматически. Он может запустить lsof, чтобы получить IP-адрес ssh-подключения, связанного с UID его родителя, получить подключенный 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 с режимом taint.

Это позволит сохранить сетевое соединение для этого пользователя после разрыва соединения ssh. Если это проблема, вы можете решить ее с помощью cronjob или демона, который регулярно проверяет подключенные соединения ssh, а затем удаляет любые правила, которые с ними не связаны.

Я понимаю, что в этом ответе много "можно сделать", но большая часть - это рутинная работа. Просто правильно разберитесь с -m owner.

Связанный контент