Warum sind die ersten 1024 Ports nur dem Root-Benutzer vorbehalten?

53

Das ist mehr müßige Neugier als alles andere. Ein Freund von mir fragte mich: "Welchen Portbereich kann nur root unter Linux verwenden?" Ich sagte ihm, 0-1024 seien eingeschränkt. Dann fragte er mich, warum es so sei und ... ich war ratlos. Keine Ahnung.

Gibt es einen Grund, warum diese Ports eingeschränkt sind und 1025-65535 nicht?

Die meisten wichtigen Netzwerkdienste (HTTP, FTP, SSH, Telnet, HTTPS, POP, SMTP usw.) befinden sich in diesem Bereich. Daher habe ich mir folgende Antworten überlegt:

  • Ein nicht vertrauenswürdiger Benutzer kann ein Programm ausführen, das diese Ports auf Anmeldedetails überwacht.
  • Ein nicht vertrauenswürdiger Benutzer kann eine nicht autorisierte Serveranwendung ausführen.

Kann hier jemand Licht ins Dunkel bringen?

Andrew Lambert
quelle

Antworten:

52

Angenommen, Sie tauschen Daten mit einem Computer an einem Port <1024 aus und wissen, dass auf einem Computer eine Unix-Variante ausgeführt wird. Dann wissen Sie, dass der Dienst, der auf diesem Port ausgeführt wird, vom Systemadministrator genehmigt wurde: Er wird als Root ausgeführt oder musste zumindest als Root gestartet werden.

In der weiten, wilden Welt des Internets spielt dies keine Rolle. Die meisten Server werden von denselben Personen verwaltet wie die auf ihnen ausgeführten Dienste. Sie würden den Wurzeln nicht mehr vertrauen als den anderen Benutzern.

Bei Mehrbenutzermaschinen, insbesondere in einem lokalen Netzwerk, kann dies von Bedeutung sein. Zum Beispiel in den Tagen vor ziviler Kryptografie, eine beliebte Methode der auf einer anderen Maschine Shell - Befehle ausgeführt wurde , rsh( r emote sh ell); Sie können die Kennwortauthentifizierung verwenden oder sich nur authentifizieren, indem Sie nachweisen, dass Sie Benutzer X auf Computer A sind (wobei Computer B weiß, dass sich X @ A als X @ B ohne Kennwort anmelden kann). Wie kann man das beweisen? Der rshClient ist setuid root und verwendet eine Portnummer <1024, sodass der Server weiß, dass der Client, mit dem er spricht, vertrauenswürdig ist und nicht lügt, welcher Benutzer auf A ihn aufruft. Ähnlich NFS wurde so konzipiert, dass es in Bezug auf Benutzer und Berechtigungen transparent ist. Daher bestand eine übliche Konfiguration darin, dass in einem lokalen Netzwerk jeder Computer dieselbe Benutzerdatenbank verwendete und Benutzer N bei A, der Dateisysteme von Server B einbindet, die Berechtigungen von Benutzer N bei B erhält. Die Tatsache, dass der NFS-Client von einem Port mit einer Nummer <1024 stammt, beweist erneut, dass der NFS-Client von root bei A überprüft wurde. Dies soll sicherstellen, dass diese Anforderung tatsächlich von Benutzer N stammt, wenn sie eine Anforderung überträgt von Benutzer N.

Nicht autorisierte Benutzer, die Server nicht an niedrigen Ports ausführen können, sind ein weiterer Vorteil, jedoch nicht der Hauptvorteil. Früher war Spoofing ein Novum, und Benutzer mit Spoof-Servern wurden sowieso schnell von aufmerksamen Administratoren unterdrückt.

Gilles 'SO - hör auf böse zu sein'
quelle
2
Also, eine Art Authentifizierung eines armen Mannes? Hat diese Konvention in modernen * nix-ähnlichen Betriebssystemen einen echten Vorteil?
Andrew Lambert
2
@Amazed: Die Unix-Welt ist konservativ, daher lautet die Frage: "Verursacht sie echte Probleme?" (und es sollte im vollen Wissen beantwortet werden, dass jeder Server, der es wert ist, ausgeführt zu werden, ein Befehlszeilenargument zum Ändern des Ports hat).
dmckee
5
@dmckee Es könnte auch argumentiert werden, dass ein solches Design dazu führt, dass mehr Server als Root ausgeführt werden, auch wenn sie die Option haben, auf alternativen Ports ausgeführt zu werden.
Andrew Lambert
5
@Amazed Es kann heute noch gelegentlich in lokalen Netzwerken nützlich sein. Ich glaube nicht, dass dies dazu führt, dass mehr Server als Root ausgeführt werden. Dienste können den Port binden und dann Berechtigungen löschen oder Funktionen verwenden, falls verfügbar, oder der Administrator kann einen Port in der Firewall-Konfiguration umleiten. Ich glaube nicht, dass es eingebaut werden würde, wenn Unix heute entworfen worden wäre, aber es tut nicht weh.
Gilles 'SO- hör auf böse zu sein'
1
Dieser Unsinn sollte schon lange aus dem Kernel verschwunden sein. Keine Portnummer sollte eine spezielle Bedeutung haben. Die "Argumentation" hinter diesem Design ist längst überholt (ich denke, es war sogar zur Entwurfszeit umstritten). Aber was ist schlimmer als die Idee von speziellen Nummernkreisen, die "vertrauenswürdig" sind, sind die Implikationen. Webserver müssen als Root ausgeführt werden, um Webseiten zu bedienen. Ein einziger Exploit und der ganze Server ist weg. Und wofür? Für altes Design, das noch nie ein bisschen funktioniert hat.
Masi