Es ist Standardverhalten, dass nicht privilegierte Benutzer nicht an privilegierte Ports (Portnummern unter 1024) binden dürfen. Daher muss eine Anwendung, die beispielsweise an Port 80 binden möchte, privilegiert ausgeführt werden (normalerweise bedeutet dies, dass sie als Root ausgeführt wird), um an diesen Port zu binden.
Ein üblicher Ansatz besteht darin, einen kleinen "Listener" -Prozess mit einem privilegierten Benutzer auszuführen, der die Verbindung akzeptiert und dann einen nicht privilegierten Prozess zur Bearbeitung der Anforderung erzeugt. Das Löschen von Berechtigungen für die Anforderungsverarbeitung erfolgt aus Sicherheitsgründen. Wenn jemand in der Lage ist, den Prozess auszunutzen, der die Anforderung verarbeitet, kann ein Eindringling normalerweise Befehle mit denselben Berechtigungen wie der Verarbeitungsprozess ausführen. Daher wäre es schlecht, die gesamte Anfrage mit einem privilegierten Prozess zu bearbeiten.
Für viele Anwendungen ist es heutzutage jedoch üblich, als Nicht-Root-Anwendungen ausgeführt zu werden. Aber solche Prozesse können natürlich in der Standardkonfiguration nicht an privilegierte Ports gebunden werden. Server wie Tomcat oder JBoss banden stattdessen an High-Ports wie 8080, sodass sie keinen privilegierten Listener benötigen.
Wenn Sie einen solchen Prozess dem Internet aussetzen, würden Sie wahrscheinlich Zugriff auf Port 80 gewähren, da jeder Browser zuerst versuchen würde, eine Verbindung zu Port 80 herzustellen, wenn das HTTP-Protokoll verwendet wird. Um dies zu erreichen, wird häufig eine Firewall oder ein Port-Übersetzer zwischen der Anwendung und dem öffentlichen Internet verwendet. Anfragen treffen also die Firewall, die Port 80 anfordert, aber die Firewall leitet die Anfrage an einen internen Host auf Port 8080 weiter. Auf diese Weise kann der echte Webserver auf High-Ports arbeiten, während er auf Port 80 öffentlich verfügbar ist.
- (internet request) ----> (port 80)[Firewall] ------> (port 8080)[Webserver]
Manchmal erfolgt diese Umleitung einfach mithilfe der iptables
NAT-Regel:
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
Auf diese Weise kann eine nicht privilegierte Anwendung ausgeführt werden, die Port 8080 überwacht, während alle eingehenden Anforderungen für Port 80 nur an Port 8080 umgeleitet werden.
Bei Verwendung moderner Linux-Kernel gibt es jedoch eine andere Möglichkeit: Verwenden Sie Funktionen.
setcap CAP_NET_BIND_SERVICE=+ep /some/webserver/binary
Dies würde es ermöglichen binary
, an privilegierte Ports zu binden, selbst wenn diese von einem Nicht-Root-Benutzer gestartet werden. Siehe man capabilities
für weitere Details.