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 ouifconfig
). - 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 sudo
ao especificar uma porta ip:.
Pergunta: por que preciso usar sudo
para 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?
fonte
É 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.
Às vezes, esse redirecionamento é feito simplesmente usando a
iptables
regra NAT: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.
Isso permitiria
binary
a ligação a portas privilegiadas, mesmo quando iniciadas a partir de um usuário não raiz. Vejaman capabilities
para mais detalhes.fonte