Por que o sudo é necessário para iniciar um servidor da web em uma determinada porta ip:?

9

Estou configurando um servidor Web baseado em Python na minha caixa Debian.

Configuração:

  • O sistema operacional Debian é baseado em VM, mas eu mudei o VirtualBox de NAT para Bridged.
  • IP da configuração da VM = 192.168.1.7(pela tela de administração do meu roteador ou ifconfig).
  • Configurei com êxito o encaminhamento de porta do meu roteador para ssh e HTTP.
  • Configurei com êxito o DNS dinâmico do meu roteador usando dyndns.com.

Independentemente do servidor Web Python específico que estou usando (Django, CherryPy, biblioteca padrão), tenho que iniciar o servidor Web @ 192.168.1.7:80 usando sudo. Caso contrário, recebo um erro por não ter permissão para acessar a porta. Nenhum dos tutoriais do servidor da web menciona a necessidade de usar sudoao especificar uma porta ip:.

Pergunta: por que preciso usar sudopara iniciar esses servidores da web? É uma indicação que eu não deveria estar usando 192.168.1.7? Ou que não estou definindo um arquivo de configuração corretamente em algum lugar?

Begbie00
fonte

Respostas:

11

Somente processos com permissões de root podem escutar em portas privilegiadas. Esta é uma convenção de segurança padrão do Unix.

Šimon Tóth
fonte
É comum iniciar servidores da web usando o sudo no 80? Ou existe alguma outra estratégia para usar uma porta> 1024 (por exemplo, 8000, 8080)?
Begbie00
@ Begbie00 Sim, é bastante comum rodar servidores web em portas mais altas. Mas é usado principalmente para servidores Web que não são acessíveis ao público na Internet ou que estão sendo executados em máquinas nas quais os usuários não têm permissões de root. Servidores da Web usados ​​para desenvolvimento e teste são executados quase exclusivamente em portas não privilegiadas.
Šimon Tóth
2
Infelizmente, essa afirmação não é totalmente verdadeira para os sistemas unix modernos. Veja minha resposta para obter detalhes, mas o Linux moderno, por exemplo, permite um controle de permissão mais refinado usando CAPABILITIES. O Solaris também possui um sistema de segurança refinado, chamado RBAC. Esses mecanismos permitem atribuir permissões como ligação a portas privilegiadas a usuários ou programas específicos.
SkyBeam
14

É um comportamento padrão que usuários não privilegiados não têm permissão para vincular a portas privilegiadas (números de porta abaixo de 1024). Portanto, um aplicativo que gostaria de vincular à porta 80, por exemplo, precisará executar privilégios (geralmente isso significa executar como root) para vincular a essa porta.

Uma abordagem comum é executar um pequeno processo de "ouvinte" com usuário privilegiado, que aceita a conexão e gera um processo não privilegiado para lidar com a solicitação. A eliminação de privilégios para o processamento de solicitações é feita por motivos de segurança. Se alguém é capaz de explorar o processo que lida com a solicitação, geralmente ele permite que um invasor execute comandos usando os mesmos privilégios que o processo de processamento. Portanto, seria ruim manipular toda a solicitação usando um processo privilegiado.

No entanto, para muitos aplicativos, hoje em dia é comum executar como não raiz; mas é claro que esses processos não podem se vincular a portas privilegiadas na configuração padrão. Portanto, servidores como o Tomcat ou o JBoss costumavam se conectar a portas altas como o 8080, para que não precisassem de um ouvinte privilegiado.

Obviamente, se você expor esse processo à Internet, provavelmente forneceria acesso na porta 80, pois cada navegador tentaria primeiro se conectar à porta 80 quando o protocolo HTTP for usado. Uma solução comum para fornecer isso é usar um firewall ou tradutor de portas entre o aplicativo e a Internet pública. Portanto, as solicitações atingem o firewall que solicita a porta 80, mas o firewall encaminha a solicitação para algum host interno na porta 8080. Dessa forma, o servidor da Web real pode operar em portas altas enquanto estiver disponível publicamente na porta 80.

- (internet request) ----> (port 80)[Firewall] ------> (port 8080)[Webserver]

Às vezes, esse redirecionamento é feito simplesmente usando a iptablesregra NAT:

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

Isso permite executar um aplicativo sem privilégios que atende na porta 8080, enquanto todas as solicitações de entrada da porta 80 são apenas redirecionadas para a porta 8080.

No entanto, usando os kernels modernos do Linux, existe outra possibilidade: Usar recursos.

setcap CAP_NET_BIND_SERVICE=+ep /some/webserver/binary

Isso permitiria binarya ligação a portas privilegiadas, mesmo quando iniciadas a partir de um usuário não raiz. Veja man capabilitiespara mais detalhes.

SkyBeam
fonte
Os recursos fazem parte do POSIX ou apenas são específicos do Linux?
Šimon Tóth
@Let_Me_Be Pelo que entendi em en.wikipedia.org/wiki/Capability-based_security, o POSIX definiu um conceito baseado em capacidade, mas é diferente do que foi implementado no Linux. Então, acho que recursos do Linux como CAP_NET_BIND_SERVICE são apenas específicos do Linux.
SkyBeam