Restringir uma porta a um único aplicativo

4

Gostaria de restringir um intervalo de portas do udp para um único aplicativo (ou um usuário). O que eu gostaria de alcançar não é simplesmente bloquear um bind() de outros uids, mas também remover o intervalo de um pool que pode ser atribuído automaticamente.

Por exemplo, se alguém tentar vincular explicitamente 12345, mas não executar o aplicativo especificado, ele deverá obter EPERM. Se alguém tentar ligar uma porta não especificada, eles nunca devem tentar ligar o 12345 aleatoriamente.

Existe algum sistema que possa ajudar aqui? Eu tentei navegar docs apparmor / selinux, mas eles parecem fazer apenas a parte de bloqueio.

    
por viraptor 03.07.2009 / 12:50

3 respostas

5

A maneira mais fácil de fazer isso no Linux é reservar um bloco no intervalo superior ou inferior do intervalo de portas efêmeras padrão.

Descubra qual é o seu intervalo atual executando

cat /proc/sys/net/ipv4/ip_local_port_range

Em seguida, defina-o fazendo eco de algo diferente (e modificando o sysctl.conf ou similar para que ele aconteça também na inicialização). Meu sistema usa 32768-61000, então eu poderia mudar isso para 32768-60000 em conjunto com o SELinux / AppArmor para reservar 60001-61000 para o meu aplicativo.

echo "32768 60000" > /proc/sys/net/ipv4/ip_local_port_range

Eu não estou ciente de uma maneira de esculpir uma lacuna no meio do intervalo efêmero.

    
por 03.07.2009 / 13:55
0

Dê uma olhada no utilitário portreserve. Mas o serviço real deve pedir ao portreserve para liberar a porta antes que o serviço possa usá-la.

    
por 03.07.2009 / 17:45
0

Instale o portreserve e só o seu programa que os solicita via porcelelease pode ter os sockets.

    
por 16.01.2011 / 20:40