Das Ausführen eines Webdienstes, der an Port 80 gebunden ist, erfordert normalerweise keine sudoer-Berechtigungen. Da es sich bei den Ports 80/443 um Systemports handelt, das heißt, sie können nur von privilegierten Benutzern verwendet werden. Warum können diese Dienste noch eine Bindung an diese Ports herstellen?
service
permissions
port-443
Adaml
quelle
quelle
Antworten:
Grundsätzlich gibt es zwei verschiedene Ansätze:
Beginnen Sie zunächst mit der Ausführung als root, binden Sie sich an den privilegierten Port und geben Sie ihn dann an einen nicht privilegierten Benutzer weiter.
inetd oder xinetd wird privilegiert ausgeführt und leitet die Anforderungen an einen nicht privilegierten Webserver weiter.
quelle
Ich denke du hast es falsch gemacht. Jeder kann diese Ports nutzen. Das Binden an sie ist eine privilegierte Operation.
Das Grundprinzip hier ist, dass ein Benutzer Joe keinen bösartigen Webserver schreiben und dann einen Host erstellen kann, auf dem er keine Administratorrechte hat. Natürlich ist dies ein ziemlich schwaches Modell. Normalerweise hindert nichts Joe daran, seinen eigenen Computer in das Netzwerk einzubinden, und er könnte Administratorrechte für jeden Computer haben, auf den er physischen Zugriff hat.
Ich werde eine Demonstration mit Netcat machen.
Als normaler Benutzer kann ich mich nicht an Port 80 binden:
Ich kann an Port 8080 binden:
Währenddessen kann ich in einem anderen Terminal eine Verbindung zu Port 80 herstellen und einige Daten senden. Diese werden auf dem gerade gestarteten Server angezeigt:
Wenn ich mich an Port 80 binden möchte, muss ich root sein:
Oder ich kann die
CAP_NET_BIND_SERVICE
Fähigkeit dernc
Binärdatei zuweisen :Eine andere Möglichkeit besteht darin, das Serverprogramm so zu schreiben, dass es nach dem Aufruf
listen()
die Root-Rechte aufhebt. Dies ist eine ziemlich verbreitete Lösung, und Sie werden es bei den meisten Daemons sehen. Apache wird beispielsweise von init als root gestartet und löscht dann die Root-Rechte und wird zum Benutzerwww-data
oder zu etwas Ähnlichem, sobald es an Port 80 gebunden ist. Versuchen Sie,/etc/init.d/apache start
als nicht root auszuführen, und Apache wird wahrscheinlich nicht gestartet.quelle