Étant donné que le port 80/443 sont des ports système, ce qui signifie qu'ils ne peuvent être utilisés que par des utilisateurs privilégiés
Je pense que vous vous trompez. Tout le monde peut utiliser ces ports. Contraignant avec eux est une opération privilégiée.
La raison ici est qu'un utilisateur Joe ne devrait pas être en mesure d'écrire un serveur Web malveillant et de créer un hôte sur lequel il n'a aucun droit d'administration. Bien sûr, c'est un modèle assez faible, rien n'empêche généralement Joe de mettre son propre ordinateur sur le réseau, et il pourrait avoir des droits administratifs sur n'importe quelle machine à laquelle il a un accès physique.
Je ferai une démonstration avec netcat.
En tant qu'utilisateur ordinaire, je ne peux pas me lier au port 80:
$ nc -l -p 80
Can't grab 0.0.0.0:80 with bind : Permission denied
Je peux me lier au port 8080:
$ nc -l -p 8080
Pendant ce temps, dans un autre terminal, je peux me connecter au port 80 et envoyer des données, et les voir apparaître côté serveur, je viens de commencer:
$ nc 127.0.0.1 8080 <<<"Hello world"
Si je veux me lier au port 80, je dois être root:
$ sudo nc -l -p 80
Ou je peux attribuer la CAP_NET_BIND_SERVICE
capacité aunc
binaire:
$ cp `which nc` .
$ sudo setcap 'cap_net_bind_service=+ep' ./nc
$ ./nc -l -p 80
Une autre option consiste à écrire le programme serveur de telle sorte qu'après son appel, listen()
il abandonne les privilèges root. C'est une solution assez courante, et vous la verrez avec la plupart des démons. Apache, par exemple, démarre à partir d'init en tant que root, puis abandonne les privilèges root et devient l'utilisateur www-data
ou quelque chose de similaire une fois qu'il est lié au port 80. Essayez /etc/init.d/apache start
de lancer en tant que non root et Apache échouera probablement au démarrage.