C'est un comportement standard que les utilisateurs non privilégiés ne sont pas autorisés à se lier à des ports privilégiés (numéros de port inférieurs à 1024). Par conséquent, une application qui souhaite se lier au port 80 par exemple devra exécuter des privilèges (généralement cela signifie s'exécuter en tant que root) afin de se lier à ce port.
Une approche courante consiste à exécuter un petit processus "d'écoute" avec un utilisateur privilégié qui accepte la connexion, puis génère un processus non privilégié pour gérer la demande. La suppression des privilèges pour le traitement des demandes est effectuée pour des raisons de sécurité. Si quelqu'un est capable d'exploiter le processus qui gère la demande, il permet généralement à un intrus d'exécuter des commandes en utilisant les mêmes privilèges que le processus de traitement. Par conséquent, il serait mauvais de traiter l'ensemble de la demande à l'aide d'un processus privilégié.
Cependant, pour de nombreuses applications, il est courant aujourd'hui de fonctionner en tant que non root; mais de tels processus ne peuvent bien sûr pas se lier à des ports privilégiés alors en configuration standard. Ainsi, des serveurs comme Tomcat ou JBoss se connectaient à des ports élevés comme 8080 à la place, de sorte qu'ils n'ont pas besoin d'un écouteur privilégié.
Bien sûr, si vous exposez un tel processus à Internet, vous fournirez probablement un accès sur le port 80 car chaque navigateur essaiera d'abord de se connecter au port 80 lorsque le protocole HTTP est utilisé. Pour contourner ce problème, il est courant d'utiliser un pare-feu ou un traducteur de port entre l'application et l'Internet public. Ainsi, les demandes atteignent le pare-feu demandant le port 80 mais le pare-feu transmet la demande à un hôte interne sur le port 8080. De cette façon, le vrai serveur Web peut fonctionner sur des ports élevés tout en étant accessible au public sur le port 80.
- (internet request) ----> (port 80)[Firewall] ------> (port 8080)[Webserver]
Parfois, cette redirection se fait simplement en utilisant la iptables
règle NAT:
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
Cela permet d'exécuter une application non privilégiée à l'écoute sur le port 8080 tandis que toutes les demandes entrantes pour le port 80 sont simplement redirigées vers le port 8080.
Cependant, en utilisant les noyaux Linux modernes, il existe une autre possibilité: utiliser les capacités.
setcap CAP_NET_BIND_SERVICE=+ep /some/webserver/binary
Cela permettrait binary
de se lier à des ports privilégiés même lorsqu'il est démarré à partir d'un utilisateur non root. Voir man capabilities
pour plus de détails.