Ich richte einen Python-basierten Webserver auf meiner Debian-Box ein.
Konfiguration:
- Das Debian-Betriebssystem ist VM-basiert, aber ich habe die VirtualBox von NAT auf Bridged umgestellt.
- IP des VM-Setups =
192.168.1.7
(gemäß dem Administratorbildschirm meines Routers oderifconfig
). - Ich habe die Portweiterleitung meines Routers für SSH und HTTP erfolgreich eingerichtet.
- Ich habe die dynamischen DNS meines Routers erfolgreich mit dyndns.com eingerichtet.
Unabhängig von dem spezifischen Python-Webserver, den ich verwende (Django, CherryPy, Standardbibliothek), muss ich den Webserver @ 192.168.1.7:80 mit starten sudo
. Andernfalls wird eine Fehlermeldung angezeigt, dass ich keine Berechtigung zum Zugriff auf den Port habe. In keinem der Webserver-Tutorials wird erwähnt, dass sudo
bei der Angabe eines ip: port eine Verwendung erforderlich ist .
Frage: Warum muss ich sudo
diese Webserver verwenden , um sie zu starten? Ist es ein Hinweis darauf, dass ich nicht verwenden sollte 192.168.1.7
? Oder dass ich irgendwo keine Konfigurationsdatei richtig einstelle?
quelle
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.
Manchmal erfolgt diese Umleitung einfach mithilfe der
iptables
NAT-Regel: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.
Dies würde es ermöglichen
binary
, an privilegierte Ports zu binden, selbst wenn diese von einem Nicht-Root-Benutzer gestartet werden. Sieheman capabilities
für weitere Details.quelle