¿Por qué Linux no permite permisos de puerto de red a nivel de usuario? [cerrado]

8

De vez en cuando, buscaré cómo hacer permisos a nivel de usuario para el acceso al puerto de red en Linux y apareceré bastante seco. Por ejemplo, si tiene una máquina que ejecuta un proceso crítico que escucha en el puerto 5080, creo que debería haber una manera de dar acceso a ese puerto a un conjunto particular de usuarios confiables, al igual que cualquier otro proceso de permisos sensatos. hecho, como los permisos del sistema de archivos.

Pero parece que los puertos altos están disponibles para todos los usuarios, y los puertos bajos están disponibles solo para rootear, con solo hacks crudos como authbind y reenvío con iptables para permitir que otros usuarios usen puertos bajos. Parece una situación muy extraña, así que me pregunto, ¿por qué fue diseñado de esa manera y por qué las personas no han sentido la necesidad de cambiar esa situación?

BT
fuente

Respuestas:

4

Linux admite espacios de nombres de red. Puede hacer que diferentes procesos vean diferentes conjuntos de interfaces de red. Este es un tema amplio.

Si desea un puerto de comunicación que sea accesible dentro de la máquina solo para usuarios específicos, puede usar un socket Unix tradicional, que tiene un nombre en el espacio del sistema de archivos con permisos. Linux honra los permisos de lectura / escritura en sockets AF_UNIX.

Si una máquina escucha solicitudes externas TCP o UDP en el puerto 5080 que llegan de otras máquinas, entonces ya no podemos hablar sobre los permisos de los usuarios . Debe incorporar seguridad en el protocolo que va más allá de 5080: autenticación, encriptación, integridad / falsificación / resistencia doble.

Kaz
fuente
¿Los espacios de nombres de red permiten que diferentes usuarios tengan acceso a diferentes espacios de nombres que, en esencia, podrían todos los usuarios de algunos puertos y bloquear otros?
BT
2

Inicialmente, supongo, porque habría requerido un diseño complejo que estaba fuera de línea con el alcance de los primeros sistemas Unix.

Más tarde, supongo, porque había una forma establecida de implementar permisos de puerto de red a nivel de usuario para casos comunes: inetd , que apareció unos años después después de ( 4.3BSD ) TCP / IP ( 4.2BSD ). El inetddaemon se ejecuta como root y escucha en los puertos especificados en su archivo de configuración. En una conexión entrante, inetdgenera otro programa especificado en su archivo de configuración, y que se ejecuta como un usuario también especificado en el archivo de configuración inetd. Entonces, al menos para los servicios donde es aceptable comenzar un nuevo proceso en cada conexión, el problema está resuelto.

Gilles 'SO- deja de ser malvado'
fuente
Interesante. Tengo que decir que es una cosa muy linda para hacer una solución donde cada acción requiere un nuevo proceso.
BT
0

Creo que una razón es que la mayoría de los usuarios necesitan poder usar puertos efímeros para conectarse a otros servidores, sin ser necesariamente root.

Una conexión TCP / IPv4 consta de dos puntos finales, y cada punto final consta de una dirección IP y un número de puerto. Por lo tanto, cuando un usuario cliente se conecta a una computadora servidor, una conexión establecida puede considerarse como la tupla de 4 (IP del servidor, puerto del servidor, IP del cliente, puerto del cliente). Por lo general, tres de los cuatro se conocen fácilmente: la máquina del cliente usa su propia dirección IP y, cuando se conecta a un servicio remoto, se requiere la dirección IP de la máquina del servidor y el número de puerto de servicio.

Lo que no es inmediatamente evidente es que cuando se establece una conexión, el lado del cliente de la conexión utiliza un número de puerto. A menos que un programa cliente solicite explícitamente un número de puerto específico, el número de puerto utilizado es un número de puerto efímero. Los puertos efímeros son puertos temporales asignados por la pila de IP de una máquina, y se asignan desde un rango designado de puertos para este propósito. Cuando finaliza la conexión, el puerto efímero está disponible para su reutilización, aunque la mayoría de las pilas de IP no reutilizarán ese número de puerto hasta que se haya utilizado todo el conjunto de puertos efímeros. Por lo tanto, si el programa cliente se vuelve a conectar, se le asignará un número de puerto efímero diferente para su lado de la nueva conexión.

Paul Calabro
fuente
1
¿Cómo evitarían eso los permisos de red a nivel de usuario?
BT