Pourquoi les premiers 1024 ports sont-ils limités à l'utilisateur root?

53

C'est plus une curiosité oisive qu'autre chose. Un de mes amis m’a demandé: «quelle plage de ports est-ce que seul root peut utiliser sous Linux? Je lui ai dit que 0-1024 étaient limités. Puis il m'a demandé pourquoi il en était ainsi et ... j'étais perdue. Aucune idée du tout.

Y a-t-il une raison pour laquelle ces ports sont limités et 1025-65535 ne le sont pas?

La plupart des principaux services réseau (HTTP, FTP, SSH, Telnet, HTTPS, POP, SMTP, etc.) se situent dans cette plage, de sorte que les réponses possibles que j'ai envisagées sont les suivantes:

  • Un utilisateur non approuvé peut exécuter un programme écoutant les informations de connexion sur ces ports.
  • Un utilisateur non approuvé peut exécuter une application serveur non autorisée.

Quelqu'un peut-il faire la lumière ici?

Andrew Lambert
la source

Réponses:

52

Supposons que vous échangez des données avec un ordinateur sur un port <1024 et que vous savez que cet ordinateur exécute une variante d'Unix. Ensuite, vous savez que le service exécuté sur ce port est approuvé par l'administrateur système: il s'exécute en tant que root ou doit au moins être démarré en tant que root.

Dans le vaste monde sauvage d'Internet, cela n'a pas d'importance. La plupart des serveurs sont administrés par les mêmes personnes que les services qui y sont exécutés. vous ne feriez pas plus confiance aux racines que les autres utilisateurs.

Avec des machines multi-utilisateurs, notamment sur un réseau local, cela peut avoir de l'importance. Par exemple, dans les jours qui précèdent la cryptographie civile, un procédé populaire de la coque en cours d' exécution des commandes sur une autre machine a rsh( r emote sh ell); vous pouvez utiliser l'authentification par mot de passe ou simplement en prouvant que vous êtes l'utilisateur X sur la machine A (la machine B sachant que X @ A peut se connecter en tant que X @ B sans mot de passe). Comment le prouver? Le rshclient est setuid root et utilise un numéro de port <1024, afin que le serveur sache que le client auquel il parle est digne de confiance et ne dira pas quel utilisateur de A l'invoque. De même NFS a été conçu pour être transparent vis-à-vis des utilisateurs et des autorisations; une configuration commune était donc que, sur un réseau local, chaque machine utilisait la même base de données d'utilisateurs et que l'utilisateur N en A installant des systèmes de fichiers à partir du serveur B obtiendrait les autorisations de l'utilisateur N en B. De nouveau, le fait que le client NFS provient d’un numéro de port <1024 prouve que la racine en A a vérifié le client NFS, qui est censé s’assurer que s’il transmet une demande prétendant être de l’utilisateur N, cette demande est vraiment: de l'utilisateur N.

Les utilisateurs non autorisés ne pouvant pas exécuter de serveurs sur des ports bas constituent un autre avantage, mais pas le principal. À l'époque, l'usurpation d'identité était une nouveauté et les utilisateurs exécutant des serveurs usurpés seraient rapidement annulés par des administrateurs vigilants.

Gilles, arrête de faire le mal
la source
2
Donc, une sorte d'authentification du pauvre homme, alors? Cette convention présente-t-elle un avantage réel dans les systèmes d'exploitation modernes * nix-like?
Andrew Lambert
2
@Amazed: Le monde Unix est conservateur, donc la question à poser est "Est-ce que cela cause de vrais problèmes?" (Et il faut répondre en sachant que chaque serveur qui vaut la peine d’être exécuté possède un argument en ligne de commande pour changer le port).
dmckee
5
@dmckee, on pourrait également soutenir qu'une telle conception conduit à plus de serveurs s'exécutant en tant que root, même s'ils ont la possibilité de s'exécuter sur d'autres ports.
Andrew Lambert
5
@Amazed Il peut encore parfois être utile aujourd'hui, sur des réseaux locaux. Je ne pense pas que cela conduira à plus de serveurs fonctionnant en tant que root, les services peuvent lier le port puis abandonner les privilèges, ou utiliser les fonctionnalités disponibles, ou l'administrateur peut rediriger un port sur la configuration du pare-feu. Je ne pense pas que cela serait mis en place si Unix était conçu aujourd'hui, mais ça ne fait pas mal.
Gilles, arrête de faire le mal '13
1
Ce non-sens devrait depuis longtemps disparaître du noyau. Aucun numéro de port ne doit avoir de signification particulière. Le "raisonnement" derrière cette conception est depuis longtemps dépassé (je pense que c'était controversé même au moment de la conception). Mais ce qui est pire, c'est que l'idée d'une plage de numéros spéciale "digne de confiance" en est la conséquence. Les serveurs Web doivent être exécutés en tant que root uniquement pour servir les pages Web. Un seul exploit et le serveur de trous est parti. Et pour quoi faire? Pour la conception de legs qui n'a jamais même légèrement fonctionné.
masi