Pourquoi Linux n'autorise-t-il pas les autorisations de port réseau au niveau utilisateur? [fermé]


8

De temps en temps, je vais chercher comment faire des autorisations au niveau utilisateur pour l'accès au port réseau sous Linux et arriver plutôt sec. Par exemple, si vous avez une machine qui exécute un processus critique qui écoute sur le port 5080, je pense qu'il devrait y avoir un moyen de donner à un ensemble particulier d'utilisateurs de confiance un accès à ce port - tout comme la façon dont tout autre processus d'autorisations sain est fait, comme les autorisations du système de fichiers.

Mais il semble que les ports élevés soient disponibles pour tous les utilisateurs, et les ports bas ne sont disponibles que pour root, avec seulement des hacks grossiers comme authbind et le transfert avec iptables pour permettre aux autres utilisateurs d'utiliser des ports bas. Cela semble être une situation très étrange, alors je me demande pourquoi il a été conçu de cette façon et pourquoi les gens n'ont pas ressenti le besoin de changer cette situation?

Réponses:


4

Linux prend en charge les espaces de noms réseau. Vous pouvez faire en sorte que différents processus voient différents ensembles d'interfaces réseau. Il s'agit d'un vaste sujet.

Si vous voulez un port de communication accessible dans la machine à des utilisateurs spécifiques uniquement, vous pouvez utiliser un socket Unix traditionnel, qui a un nom dans l'espace du système de fichiers avec des autorisations. Linux respecte les autorisations de lecture / écriture sur les sockets AF_UNIX.

Si une machine écoute les requêtes TCP ou UDP externes provenant du port 5080 en provenance d'autres machines, alors nous ne pouvons plus vraiment parler des autorisations utilisateur . Vous devez intégrer la sécurité dans le protocole qui va au-delà de 5080: authentification, cryptage, intégrité / anti-usurpation / résistance au dos.


Les espaces de noms de réseau permettent-ils à différents utilisateurs d'avoir accès à différents espaces de noms qui, en substance, pourraient tous les utilisateurs de certains ports et en bloquer d'autres?
BT

2

Initialement, je suppose, car cela aurait nécessité une conception complexe qui était hors de la portée des premiers systèmes Unix.

Plus tard, je suppose, car il y avait un moyen établi d'implémenter des autorisations de port réseau au niveau de l'utilisateur pour les cas courants: inetd , qui est apparu environ deux ans après ( 4.3BSD ) TCP / IP ( 4.2BSD ). Le inetddémon s'exécute en tant que root et écoute sur les ports spécifiés dans son fichier de configuration. Lors d'une connexion entrante, inetdgénère un autre programme spécifié dans son fichier de configuration et qui s'exécute en tant qu'utilisateur également spécifié dans le fichier de configuration inetd. Ainsi, au moins pour les services où il est acceptable de démarrer un nouveau processus sur chaque connexion, le problème est résolu.


Intéressant. Je dois dire que c'est une chose Linux à faire pour créer une solution où chaque action nécessite un nouveau processus.
BT

0

Je pense que l'une des raisons est que la plupart des utilisateurs doivent pouvoir utiliser des ports éphémères pour se connecter à d'autres serveurs, sans nécessairement être root.

Une connexion TCP / IPv4 se compose de deux points de terminaison, et chaque point de terminaison se compose d'une adresse IP et d'un numéro de port. Par conséquent, lorsqu'un utilisateur client se connecte à un ordinateur serveur, une connexion établie peut être considérée comme le quadruple de (IP serveur, port serveur, IP client, port client). Habituellement, trois des quatre sont facilement connus - la machine cliente utilise sa propre adresse IP et lors de la connexion à un service distant, l'adresse IP et le numéro de port de service de la machine serveur sont requis.

Ce qui n'est pas immédiatement évident, c'est que lorsqu'une connexion est établie, le côté client de la connexion utilise un numéro de port. Sauf si un programme client demande explicitement un numéro de port spécifique, le numéro de port utilisé est un numéro de port éphémère. Les ports éphémères sont des ports temporaires attribués par la pile IP d'une machine et sont attribués à partir d'une plage de ports désignée à cet effet. À la fin de la connexion, le port éphémère est disponible pour réutilisation, bien que la plupart des piles IP ne réutilisent pas ce numéro de port tant que le pool entier de ports éphémères n'a pas été utilisé. Ainsi, si le programme client se reconnecte, un numéro de port éphémère différent lui sera attribué pour son côté de la nouvelle connexion.


1
Comment les autorisations réseau au niveau utilisateur empêcheraient-elles cela?
BT
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.