Vincular a portas menores que 1024 sem acesso root [duplicado]

42

Eu gostaria de executar aplicativos nos quais estou trabalhando, que se ligam a números de portas inferiores a 1000, sem exigir acesso root.

Estou usando o Linux Mint e tenho acesso root para configurá-lo. Eu gostaria de poder fazer isso em SSH.

Também fique feliz em saber se não é possível ou se eu não deveria estar fazendo isso, se for esse o caso.

EDIT: Na maior parte eu estou feliz de usar números de porta mais altos para o desenvolvimento, mas o Flash está esperando uma política de soquete na porta 843. Atualmente eu tenho que executar o aplicativo como root e, portanto, não posso executá-lo do meu Makefile que é um PITA.

    
por tarn 10.05.2011 / 12:41

4 respostas

36

Outra maneira de fazer com que seu daemon responda a solicitações de um número de porta inferior é usar o iptables ou similar para redirecionar uma porta com número menor para a porta numerada mais alta em que seu daemon está escutando:

sudo iptables -A PREROUTING -t nat -p tcp --dport 80 -j REDIRECT --to-port 8080

Substitua 80 pela porta a expor e 8080 pela porta da escuta do aplicativo.

    
por 10.05.2011 / 13:15
35

Claro que isso é possível. Você só precisa dar o binário CAP_NET_BIND_SERVICE.

sudo setcap cap_net_bind_service=ep some-binary

No Linux, as coisas podem ter sido divididas em um conjunto de recursos. CAP_NET_BIND_SERVICE é a capacidade de vincular a portas < = 1024.

É provavelmente possível usar o AppArmor, o SELinux ou outro módulo de segurança do Linux (LSM) para conceder acesso ao programa para vincular especificamente essa porta, mas acho que isso seria uma perda de tempo. A segurança não é realmente baseada em números de porta, na medida em que foi no passado distante.

Aqui está um script para o OSX para encaminhar as portas 80 e 443 para portas não privilegiadas:

echo " 
rdr pass inet proto tcp from any to any port 80 -> 127.0.0.1 port 8080
rdr pass inet proto tcp from any to any port 443 -> 127.0.0.1 port 8443
" | sudo pfctl -ef -
    
por 10.05.2011 / 17:37
8

Acho que existe uma maneira de fazer isso, mas não tenho 100% de certeza se isso funcionaria.

é a ligação da porta que requer raiz, não a aplicação está usando, então o método abaixo pode funcionar, mas você precisa ter acesso sudo em primeiro lugar.

Primeiro você inicia seu processo como usuário root usando sudo myApp , uma vez que a porta foi ligada, você pode alternar o proprietário do processo para um usuário não privilegiado.

    
por 10.05.2011 / 12:47
6

Lembro-me vagamente de uma biblioteca chamada "authbind" que faz o que você precisa, encapsulando a chamada de sistema bind () (via uma biblioteca LD_PRELOAD) e, se uma porta privilegiada é solicitada, gerando um programa raiz setuid que recebe uma cópia do descritor de arquivo, em seguida, verifica se o aplicativo é permitido vincular-se à porta, executa o bind () e sai.

Não tenho certeza sobre o status do projeto, mas o método deve ser bem direto para (re) implementar, se necessário.

    
por 10.05.2011 / 14:24