Embora 80 e 443 sejam portas do sistema, como a maioria dos servidores da Web é capaz de se conectar a eles de qualquer maneira?

18

A execução de um serviço da web que se liga à porta 80 geralmente não requer privilégios de sudoer. Como as portas 80/443 são portas do sistema, o que significa que elas só podem ser usadas por usuários privilegiados, como esses serviços ainda conseguem se conectar a essas portas?

adaml
fonte
11
"geralmente não requer privilégios de sudoer" está incorreto.
precisa saber é o seguinte

Respostas:

29

Existem basicamente duas abordagens diferentes:

  1. Inicialmente, comece a executar como root, vincule à porta privilegiada e, em seguida, desça para um usuário não privilegiado.

  2. O inetd ou xinetd é executado com privilégios e encaminha as solicitações para o servidor da Web sem privilégios.

Joe Sniderman
fonte
3
No Linux, você também pode aplicar o recurso CAP_NET_BIND_SERVICE ao programa ou pode usar o iptables para redirecionar uma porta do sistema para uma porta regular.
Zan Lynx
10
e apenas para esclarecer o OP: a razão pela qual a opção 1 funciona é porque, quando os processos perdem privilégios, eles podem reter descritores de arquivos abertos - mesmo que não tenham permissão para abri-los pela segunda vez.
strugee
Há também Authbind .
Boris the Spider
5

Como a porta 80/443 são portas do sistema, o que significa que elas só podem ser usadas por usuários privilegiados

Eu acho que você entendeu errado. Qualquer pessoa pode usar essas portas. Obrigatório a eles é uma operação privilegiada.

A lógica aqui é que algum usuário Joe não deve ser capaz de escrever um servidor da Web mal-intencionado e criar um host no qual ele não tem nenhum direito administrativo. É claro que este é um modelo bastante fraco, geralmente não há nada impedindo Joe de colocar seu próprio computador na rede, e ele pode ter direitos administrativos em qualquer máquina à qual ele tenha acesso físico.

Eu vou fazer uma demonstração com o netcat.

Como usuário comum, não consigo ligar à porta 80:

$ nc -l -p 80
Can't grab 0.0.0.0:80 with bind : Permission denied

Posso ligar à porta 8080:

$ nc -l -p 8080

Enquanto isso, em outro terminal, eu posso conectar à porta 80 e enviar alguns dados, e vê-los aparecer no final do servidor.

$ nc 127.0.0.1 8080 <<<"Hello world"

Se eu quiser ligar à porta 80, preciso ser root:

$ sudo nc -l -p 80

Ou posso atribuir a CAP_NET_BIND_SERVICEcapacidade ao ncbinário:

$ cp `which nc` .
$ sudo setcap 'cap_net_bind_service=+ep' ./nc
$ ./nc -l -p 80

Outra opção é escrever o programa do servidor, de modo que, depois de chamado listen(), descarte os privilégios de root. Essa é uma solução bastante comum, e você a verá com a maioria dos daemons. O Apache, por exemplo, é iniciado a partir do init como root e, em seguida, elimina os privilégios de root e se torna o usuário www-dataou algo semelhante quando estiver ligado à porta 80. Tente executar /etc/init.d/apache startcomo não root e o Apache provavelmente falhará ao iniciar.

Phil Frost
fonte
A pergunta diz "vincular a essas portas". Por que você acha que ele está errado?
Barmar