web-dev-qa-db-fra.com

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

Je voudrais exécuter des applications sur lesquelles je travaille qui se lient à des numéros de port inférieurs à 1000 sans nécessiter un accès root.

J'utilise Linux Mint et j'ai un accès root pour le configurer. J'aimerais idéalement pouvoir le faire via SSH.

Heureux aussi d'entendre si ce n'est pas possible ou si je ne devrais pas le faire, si c'est le cas.

EDIT: Surtout, je suis heureux d'utiliser des numéros de port plus élevés pour le développement, mais Flash attend une politique de socket sur le port 843. Actuellement, je dois exécuter l'application en tant que root et donc je ne peux pas l'exécuter à partir de mon Makefile qui est un PITA .

44
tarn

Une autre façon d'amener votre démon à répondre aux demandes d'un numéro de port inférieur est d'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.

37
James C

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 pour lier ce port spécifiquement, 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 dans la mesure où elle l'était dans un passé lointain.

Voici un script pour OSX pour transférer 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 -
37
joeforker

Je pense qu'il existe un moyen de le faire, mais je ne suis pas sûr à 100% si 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 avoir un accès Sudo en premier lieu.

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é.

8
RobertPitt

Je me souviens vaguement d'une bibliothèque appelée "authbind" qui fait ce dont vous avez besoin, en encapsulant 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 de la descripteur de fichier, puis vérifie que l'application est bien autorisée à se lier au port, effectue le bind () et quitte.

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

6
Simon Richter