На сервере Linux, как я могу настроить разрешения, чтобы определенной группе пользователей было разрешено входить в систему через ssh, но все сетевые подключения их процессов блокируются, если только подключение не возвращается на адрес клиента ssh. Например, я хочу разрешить пользователю в группе подключаться к ssh и запускать HTTP-сервер (на высоком порте), а затем подключаться к нему с компьютера, на котором запущен клиент ssh, но любой другой клиент в Интернете должен не сможет получить доступ к HTTP-серверу.
Я знаю, что могу полностью заблокировать доступ пользователя к сети с помощью iptables, но как мне разрешить трафик, который исходит или идет к любому значению $SSH_CLIENT
является?
Вы можете сделать так, чтобы они запустили 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 с режимом заражения подойдет для такого сценария.
Это позволит сохранить сеть для этого пользователя после разрыва ssh-соединения. Если это проблема, вы можете решить ее с помощью cronjob или демона, который регулярно проверяет подключенные ssh-соединения, а затем удаляет все правила, которые с ними не связаны.
Я понимаю, что в этом ответе много «вы могли бы сделать», но по большей части это черновая работа. Просто сделайте правильный выбор для -m владельца.