Warum muss sudo einen Webserver auf einem bestimmten ip: port starten?

9

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 oder ifconfig).
  • 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 sudobei der Angabe eines ip: port eine Verwendung erforderlich ist .

Frage: Warum muss ich sudodiese 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?

Begbie00
quelle

Antworten:

11

Nur Prozesse mit Root-Berechtigungen können privilegierte Ports überwachen. Dies ist eine Standard-Unix-Sicherheitskonvention.

Šimon Tóth
quelle
Ist es üblich, Webserver mit sudo auf 80 zu starten? Oder gibt es eine andere Strategie, um einen Port> 1024 (z. B. 8000, 8080) zu verwenden?
Begbie00
@ Begbie00 Ja, es ist durchaus üblich, Webserver an höheren Ports auszuführen. Es wird jedoch hauptsächlich für Webserver verwendet, die im Internet nicht öffentlich zugänglich sind oder auf Computern ausgeführt werden, auf denen die Benutzer keine Root-Berechtigungen haben. Webserver, die für die Entwicklung und das Testen verwendet werden, werden fast ausschließlich auf nicht privilegierten Ports ausgeführt.
Šimon Tóth
2
Leider trifft diese Aussage für moderne Unix-Systeme nicht vollständig zu. Einzelheiten finden Sie in meiner Antwort, aber modernes Linux ermöglicht beispielsweise eine genauere Berechtigungssteuerung mithilfe von CAPABILITIES. Außerdem verfügt Solaris über ein detailliertes Sicherheitssystem namens RBAC. Mit diesen Mechanismen können Berechtigungen wie das Binden an privilegierte Ports bestimmten Benutzern oder Programmen zugewiesen werden.
SkyBeam
14

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 iptablesNAT-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 capabilitiesfür weitere Details.

SkyBeam
quelle
Sind Funktionen Teil von POSIX oder nur Linux-spezifisch?
Šimon Tóth
@Let_Me_Be Wie ich aus en.wikipedia.org/wiki/Capability-based_security verstehe, hat POSIX ein funktionsbasiertes Konzept definiert, das sich jedoch von dem unterscheidet, was in Linux implementiert wurde. Daher denke ich, dass Linux-Funktionen wie CAP_NET_BIND_SERVICE nur Linux-spezifisch sind.
SkyBeam