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_SERVICE
capacidade ao nc
biná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-data
ou algo semelhante quando estiver ligado à porta 80. Tente executar /etc/init.d/apache start
como não root e o Apache provavelmente falhará ao iniciar.