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.