GNU/Linux >> Tutoriels Linux >  >> Linux

Existe-t-il un moyen pour les processus non root de se lier à des ports privilégiés sous Linux ?

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 :

  1. Vous aurez besoin d'au moins un noyau 2.6.24
  2. 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.
  3. Linux désactivera LD_LIBRARY_PATH sur n'importe quel program qui a des privilèges élevés comme setcap ou suid . Donc, si votre program 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.


Linux
  1. 30 exercices de processus Linux pour les administrateurs système

  2. Existe-t-il une interface graphique gdb C++ pour Linux ?

  3. Existe-t-il un moyen d'inspecter le rpath actuel sous Linux ?

  4. Existe-t-il un Flash Player autonome pour Linux ?

  5. Services Linux :existe-t-il une interface graphique pour les services ?

Comment vérifier les ports d'écoute sous Linux (ports utilisés)

Comment se préparer au mauvais temps sous Linux

Existe-t-il un client OneDrive pour Linux ?

40 exemples utiles de commande Linux PS pour les aspirants administrateurs système

Commandes pour la gestion des processus sous Linux

Existe-t-il un équivalent WinSCP pour Linux ?