Frage Binden an Ports kleiner als 1024 ohne Root-Zugriff [duplizieren]


Diese Frage hat hier bereits eine Antwort:

Ich möchte Anwendungen ausführen, an denen ich arbeite, die an Port-Nummern weniger als 1000 bindet, ohne Root-Zugriff zu erfordern.

Ich benutze Linux Mint und habe Root-Zugang, um es einzurichten. Ich würde es am liebsten über SSH machen können.

Auch gerne hören ob es nicht möglich ist oder ich sollte es nicht tun, wenn das der Fall ist.

EDIT: Meistens bin ich glücklich, höhere Port-Nummern für die Entwicklung zu verwenden, aber Flash erwartet eine Socket-Richtlinie auf Port 843. Derzeit muss ich die App als root ausführen und daher kann ich sie nicht von meinem Makefile ausführen, welches ein PITA ist .


42
2018-05-10 10:41


Ursprung


Es ist nicht möglich und Sie sollten es nicht tun :) (und wenn Sie es tun müssen, suexec und Drop-Privilegien nach der Bindung) - Tzarium
@Tzarium - Schätze diese direkte Antwort, obwohl nicht das, was ich hören wollte :) Wird in Kürze leider als akzeptiert markiert. - tarn
@Tzarium Es ist nicht nur möglich, sondern auch einfach, wenn Ihr System Dateisystemfunktionen unterstützt. Siehe @ Joeforker setcapantworte unten. - Gerald Combs
Authbind ist auch eine gute Antwort (von Simon unten). Das ist sehr gut möglich, auf verschiedene Arten ... - Shane Madden♦
Duplikate: serverfault.com/questions/84360/ ...  serverfault.com/questions/182413/...  serverfault.com/questions/133415/...  serverfault.com/questions/245374/ ...  stackoverflow.com/questions/413807/...  stackoverflow.com/questions/2444591 - joeforker


Antworten:


Eine weitere Möglichkeit, Ihren Daemon dazu zu bringen, auf Anfragen von einer niedrigeren Portnummer zu antworten, ist die Verwendung von iptables oder ähnlichem, um einen Port mit niedrigerer Nummer an 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 zu entstellenden Port und 8080 durch Ihren Anwendungs-Listener-Port.


36
2018-05-10 11:15



Ok, das klingt wie eine Workaround. Ich werde das prüfen, Danke. - tarn
Das habe ich vorher gemacht und es funktioniert gut: iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 843 -j REDIRECT --to-port 8430 (dies leitet eingehende Verbindungen auf Port 843 zu Port 8430 um) - Andrew Lambert
Im Gegensatz zu setcap kann jedes Programm, nicht nur das von Ihnen angegebene Programm, auf dem nicht privilegierten Port abhören. - joeforker


Natürlich ist das möglich. Sie müssen nur die binäre CAP_NET_BIND_SERVICE angeben.

sudo setcap cap_net_bind_service=ep some-binary

In Linux kann das, was root tun kann, in eine Reihe von Fähigkeiten aufgeteilt werden. 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, das wäre eine Verschwendung von Zeit. Sicherheit basiert nicht wirklich auf Portnummern in dem Maße, wie es in der Vergangenheit war.

Hier ist ein Skript für OSX, um die Ports 80 und 443 an unprivilegierte Ports weiterzuleiten:

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 -

35
2018-05-10 15:37



Super, das ist die Antwort, die ich wollte. Werde es heute Abend versuchen. Vielen Dank. - tarn
Ein paar zusätzliche Informationen auf Warum Dies ist der einzige Ansatz, der funktioniert: kneuro.net/cgi-bin/lxr/http/source/net/ipv4/... . PROT_SOCK= 1024 und snum ist der Zielport. - BMDan
Für Bonuspunkte: Besuchen Sie AccessFS für einen echten Brain-Twist. - BMDan
authbind funktioniert auch und ermöglicht pro Port und Benutzer / Gruppe basierte Kontrolle, nur daran denken, einzurichten /etc/authbind/byports entsprechend (eine Menge Leute scheinen zu installieren authbind dann erwarte nur, dass es out-of-the-box funktioniert. - Jason C
Gibt es einen ähnlichen Ansatz auf Osx? - svassr


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

Es ist die Bindung des Ports, der root erfordert, nicht die Anwendung, die es verwendet, so dass die unten beschriebene Methode funktioniert, aber Sie müssen in erster Linie sudo Zugriff haben.

Zuerst starten Sie Ihren Prozess als root-Benutzer mit sudo myAppSobald der Port gebunden wurde, können Sie den Besitzer des Prozesses auf einen nicht privilegierten Benutzer umstellen.


8
2018-05-10 10:47



Dadurch wird die Anwendung als Root ausgeführt und das System möglicherweise Sicherheitsrisiken ausgesetzt. Funktioniert aber die iptables-Weiterleitung ist sicherer. - HampusLi
So arbeiten fast alle Dämonen; root startet sie (init), sie öffnen die notwendigen Ports und dann ihre UID / GID einem unprivilegierten Benutzer. - Chris S


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

Ich bin mir nicht sicher über den Projektstatus, aber die Methode sollte bei Bedarf einfach (neu) implementiert werden können.


6
2018-05-10 12:24



Ich würde sagen, dass authbind im Vergleich zu Funktionen oder AppArmor / SELinux / anderen Linux-Sicherheitsmodulen auf Linux veraltet ist. - joeforker