Em um servidor Linux, como posso configurar permissões para que um determinado grupo de usuários possa efetuar login via ssh, mas todas as conexões de rede por seus processos sejam bloqueadas, a menos que a conexão retorne ao endereço do cliente ssh. Por exemplo, quero permitir que um usuário do grupo faça ssh e inicie um servidor HTTP (em uma porta alta) e depois conecte-se a ele a partir do computador onde está executando o cliente ssh, mas qualquer outro cliente na Internet deve não será possível acessar o servidor HTTP.
Eu sei que posso bloquear completamente o acesso à rede de um usuário com iptables, mas como faço para permitir o tráfego que vem ou vai para qualquer valor $SSH_CLIENT
?
Responder1
Uma coisa que você pode fazer é fazer com que eles executem um script suid que modifique o iptables no login. Eles não precisam passar nenhum argumento, apenas invocá-lo. E .bash_login pode invocá-lo automaticamente. Ele pode executar lsof para obter o IP da conexão ssh associada ao UID de seu pai, obter o IP conectado e, em seguida, colocar esse IP na lista de permissões com regras como
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
Onde essas cadeias são colocadas, quando apropriado, nas cadeias INPUT e OUTPUT do filtro. E, claro, também removendo quaisquer regras anteriores com esse --owner-uid. E você pode permitir apenas determinadas portas, se desejar.
Perl com modo taint deve servir para esse tipo de script.
Isso permitiria que a rede persistisse para esse usuário após a queda da conexão ssh. Se isso for um problema, você pode resolver isso com um cronjob ou um daemon que verifica regularmente as conexões ssh conectadas e remove quaisquer regras que não estejam associadas a elas.
Sei que há muito "você poderia fazer" nesta resposta, mas a maior parte é um trabalho pesado. Basta acertar as coisas do proprietário -m.