L'exécution d'un service Web qui se lie au port 80 ne nécessite généralement pas de privilèges sudoer. Étant donné que les ports 80/443 sont des ports système, ce qui signifie qu'ils ne peuvent être utilisés que par des utilisateurs privilégiés, comment se fait-il que ces services puissent toujours se lier à ces ports?
service
permissions
port-443
adaml
la source
la source
Réponses:
Il existe essentiellement deux approches différentes:
Commencez initialement à exécuter en tant que root, liez au port privilégié, puis accédez à un utilisateur non privilégié.
inetd ou xinetd s'exécute avec privilèges et transfère les requêtes au serveur Web fonctionnant sans privilèges.
la source
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:
Je peux me lier au port 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:
Si je veux me lier au port 80, je dois être root:
Ou je peux attribuer la
CAP_NET_BIND_SERVICE
capacité aunc
binaire: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'utilisateurwww-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.la source