Как настроить разрешения на сервере 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.