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

17

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, por que esses serviços ainda podem se ligar a essas portas?

    
por adaml 18.01.2015 / 19:21

2 respostas

28

Existem basicamente duas abordagens diferentes:

  1. Inicialmente, comece a executar como root, ligue-se à porta privilegiada e, em seguida, desça a um usuário sem privilégios.

  2. O inetd ou o xinetd são executados com privilégios e encaminham os pedidos para o servidor da Web que está sendo executado sem privilégios.

por 18.01.2015 / 19:25
4

Since port 80/443 are system ports, meaning they can only be used by privileged users

Eu acho que você está errado. Qualquer um pode usar essas portas. Ligação para eles é uma operação privilegiada.

O raciocínio aqui é que algum usuário Joe não deve ser capaz de escrever um servidor da Web mal-intencionado e, em seguida, criar algum host no qual ele não tenha direitos administrativos. É claro que este é um modelo bastante fraco que geralmente não impede que Joe coloque seu próprio computador na rede, e ele poderia ter direitos administrativos para qualquer máquina à qual ele tenha acesso físico.

Vou fazer uma demonstração com o netcat.

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

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

Eu posso ligar a porta 8080:

$ nc -l -p 8080

Enquanto isso, em outro terminal, posso conectar-me à porta 80 e enviar alguns dados e vê-lo aparecer no servidor que acabei de iniciar:

$ 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 o recurso CAP_NET_BIND_SERVICE ao binário nc :

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

Outra opção é escrever o programa do servidor de forma que, depois de ser chamado listen() , ele descarte privilégios de root. Esta é uma solução bem comum, e você a verá com a maioria dos daemons. O Apache, por exemplo, é iniciado a partir do init como root e, em seguida, descarta privilégios de root e torna-se o usuário www-data ou algo semelhante, uma vez vinculado à porta 80. Tente executar /etc/init.d/apache start como não-raiz e o Apache provavelmente falhará ao iniciar.

    
por 19.01.2015 / 18:16