GNU/Linux >> Tutoriels Linux >  >> Linux

Liaison aux ports inférieurs à 1024 sans accès root

Solution 1 :

Bien sûr, cela est possible. Il vous suffit de donner le binaire CAP_NET_BIND_SERVICE.

sudo setcap cap_net_bind_service=ep some-binary

Sous Linux, les choses que root peut faire ont été divisées en un ensemble de capacités. CAP_NET_BIND_SERVICE est la possibilité de se lier aux ports <=1024.

Il est probablement même possible d'utiliser AppArmor, SELinux ou un autre module de sécurité Linux (LSM) pour accorder au programme l'accès à un port spécifique, mais je pense que ce serait une perte de temps. La sécurité n'est pas vraiment basée sur les numéros de port comme elle l'était dans un passé lointain.

Voici un script permettant à OSX de rediriger les ports 80 et 443 vers des ports non privilégiés :

echo " 
rdr pass inet proto tcp from any to any port 80 -> 127.0.0.1 port 8080
rdr pass inet proto tcp from any to any port 443 -> 127.0.0.1 port 8443
" | sudo pfctl -ef -

Solution 2 :

Une autre façon de faire en sorte que votre démon réponde aux requêtes d'un numéro de port inférieur consiste à utiliser iptables ou similaire pour rediriger un port de numéro inférieur vers le port de numéro supérieur sur lequel votre démon écoute :

sudo iptables -A PREROUTING -t nat -p tcp --dport 80 -j REDIRECT --to-port 8080

Remplacez 80 par le port à exposer et 8080 par le port d'écoute de votre application.

Solution 3 :

Je pense qu'il existe un moyen de le faire, mais je ne suis pas sûr à 100 % que cela fonctionnerait.

c'est la liaison du port qui nécessite root, pas l'application qui l'utilise, donc la méthode ci-dessous peut fonctionner mais vous devez d'abord avoir un accès sudo.

Vous commencez d'abord votre processus en tant qu'utilisateur root en utilisant sudo myApp , une fois le port lié, vous pouvez basculer le propriétaire du processus vers un utilisateur non privilégié.

Solution 4 :

Je me souviens vaguement d'une bibliothèque appelée "authbind" qui fait ce dont vous avez besoin, en enveloppant l'appel système bind() (via une bibliothèque LD_PRELOAD) et, si un port privilégié est demandé, en engendrant un programme racine setuid qui reçoit une copie du descripteur de fichier, puis vérifie que l'application est bien autorisée à se lier au port, exécute la liaison() et quitte.

Pas sûr du statut du projet, mais la méthode devrait être assez simple à (ré)implémenter si nécessaire.


Linux
  1. Installer zsh sans accès root ?

  2. Extraire le numéro de série Linux sans sudo

  3. Sans accès root, exécutez R avec BLAS réglé lorsqu'il est lié à la référence BLAS

  4. Ansible :sudo sans mot de passe

  5. Installer emacs sans sudo ?

Ouvrir un port sous Linux

Autoriser le processus non root à se lier aux ports 80 et 443 ?

Exécutez ifconfig sans sudo

Lire/écrire sur un port série sans racine ?

TCP peut-il fournir plus de 65535 ports ?

Comment puis-je autoriser un utilisateur à su un autre sans autoriser l'accès root?