D'accord, merci aux personnes qui ont souligné le système de capacités et CAP_NET_BIND_SERVICE
aptitude. Si vous avez un noyau récent, il est en effet possible de l'utiliser pour démarrer un service en tant que non root mais lier des ports bas. La réponse courte est que vous faites :
setcap 'cap_net_bind_service=+ep' /path/to/program
Et puis n'importe quand program
est exécuté par la suite il aura le CAP_NET_BIND_SERVICE
aptitude. setcap
est dans le paquet debian libcap2-bin
.
Passons maintenant aux mises en garde :
- Vous aurez besoin d'au moins un noyau 2.6.24
- Cela ne fonctionnera pas si votre fichier est un script. (c'est-à-dire, utilise une ligne #! pour lancer un interpréteur). Dans ce cas, pour autant que je sache, vous devrez appliquer la capacité à l'exécutable de l'interpréteur lui-même, ce qui est bien sûr un cauchemar pour la sécurité, car tout programme utilisant cet interpréteur aura la capacité. Je n'ai pas trouvé de moyen propre et simple de contourner ce problème.
- Linux désactivera LD_LIBRARY_PATH sur n'importe quel
program
qui a des privilèges élevés commesetcap
ousuid
. Donc, si votreprogram
utilise son propre.../lib/
, vous devrez peut-être envisager une autre option, telle que la redirection de port.
Ressources :
- page de manuel des capacités (7). Lisez ceci longuement si vous envisagez d'utiliser des fonctionnalités dans un environnement de production. Il y a des détails vraiment délicats sur la façon dont les capacités sont héritées à travers les appels exec() qui sont détaillés ici.
- page de manuel setcap
- "Lier les ports inférieurs à 1024 sans racine sur GNU/Linux" :le document qui m'a d'abord pointé vers
setcap
.
Remarque :RHEL a ajouté ceci pour la première fois dans la v6.
Vous pouvez faire une redirection de port. C'est ce que je fais pour un serveur de politiques Silverlight exécuté sur une machine Linux
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 943 -j REDIRECT --to-port 1300
La méthode standard consiste à les rendre "setuid" afin qu'ils démarrent en tant que root, puis ils suppriment ce privilège root dès qu'ils se sont liés au port mais avant qu'ils ne commencent à accepter les connexions à celui-ci. Vous pouvez en voir de bons exemples dans le code source d'Apache et d'INN. On me dit que Lighttpd est un autre bon exemple.
Un autre exemple est Postfix, qui utilise plusieurs démons qui communiquent via des canaux, et seulement un ou deux d'entre eux (qui font très peu sauf accepter ou émettre des octets) s'exécutent en tant que root et les autres s'exécutent avec un privilège inférieur.