it-swarm.com.de

Binden Sie an Ports unter 1024 ohne Root-Zugriff

Ich möchte Anwendungen ausführen, an denen ich arbeite und die an Portnummern unter 1000 gebunden sind, ohne dass Root-Zugriff erforderlich ist.

Ich verwende Linux Mint und habe Root-Zugriff, um es einzurichten. Idealerweise möchte ich dies über SSH tun können.

Freut mich auch zu hören, ob es nicht möglich ist oder ich es nicht tun sollte, wenn das der Fall ist.

BEARBEITEN: Meistens verwende ich gerne höhere Portnummern für die Entwicklung, aber Flash erwartet eine Socket-Richtlinie für Port 843. Derzeit muss ich die App als Root ausführen und kann sie daher nicht von meinem Makefile aus ausführen, das eine PITA ist .

44
tarn

Eine andere Möglichkeit, Ihren Daemon dazu zu bringen, auf Anforderungen von einer niedrigeren Portnummer zu antworten, besteht darin, iptables oder ähnliches zu verwenden, um einen Port mit niedrigerer Nummer auf den Port mit höherer Nummer umzuleiten, den Ihr Daemon abhört:

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

Ersetzen Sie 80 durch den anzuzeigenden Port und 8080 durch den Anwendungs-Listener-Port.

37
James C

Das ist natürlich möglich. Sie müssen nur die Binärdatei CAP_NET_BIND_SERVICE angeben.

Sudo setcap cap_net_bind_service=ep some-binary

Unter Linux wurden die Aufgaben von root in eine Reihe von Funktionen unterteilt. CAP_NET_BIND_SERVICE ist die Fähigkeit, an Ports <= 1024 zu binden.

Es ist wahrscheinlich sogar möglich, AppArmor, SELinux oder ein anderes Linux-Sicherheitsmodul (LSM) zu verwenden, um dem Programm Zugriff zu gewähren, um diesen einen Port spezifisch zu binden, aber ich denke, dies wäre Zeitverschwendung. Sicherheit basiert nicht wirklich auf Portnummern in dem Maße, wie es in der fernen Vergangenheit war.

Hier ist ein Skript für OSX zum Weiterleiten der Ports 80 und 443 an nicht privilegierte Ports:

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

Ich denke, es gibt einen Weg, aber ich bin nicht 100% sicher, ob dies funktionieren würde.

es ist die Bindung des Ports, für den root erforderlich ist, nicht die Anwendung, die ihn verwendet. Daher funktioniert die folgende Methode möglicherweise, Sie müssen jedoch zunächst über Sudo-Zugriff verfügen.

Zuerst starten Sie Ihren Prozess als Root-Benutzer mit Sudo myApp, sobald der Port gebunden wurde, können Sie den Eigentümer des Prozesses auf einen nicht privilegierten Benutzer umstellen.

8
RobertPitt

Ich erinnere mich schwach an eine Bibliothek namens "authbind", die das tut, was Sie brauchen, indem sie den Systemaufruf bind () umschließt (über eine LD_PRELOAD-Bibliothek) und, wenn ein privilegierter Port angefordert wird, ein setuid-Root-Programm erzeugt, das eine Kopie von erhält Der Dateideskriptor überprüft dann, ob die Anwendung tatsächlich an den Port binden darf, führt bind () aus und wird beendet.

Sie sind sich über den Projektstatus nicht sicher, aber die Methode sollte bei Bedarf recht einfach (erneut) zu implementieren sein.

6
Simon Richter