¿Por qué los primeros 1024 puertos están restringidos solo al usuario raíz?


53

Esta es una curiosidad más ociosa que cualquier otra cosa. Un amigo mío me preguntó '¿qué rango de puertos es el que solo la raíz puede usar en Linux?' Le dije que 0-1024 estaban restringidos. Luego me preguntó por qué era así y ... estaba perdido. No tengo idea alguna.

¿Hay alguna razón por la cual estos puertos están restringidos y 1025-65535 no?

La mayoría de los principales servicios de red (HTTP, FTP, SSH, Telnet, HTTPS, POP, SMTP, etc.) se encuentran en este rango, por lo que las posibles respuestas pensé en:

  • Un usuario no confiable podría ejecutar un programa que escuchara en estos puertos para obtener detalles de inicio de sesión.
  • Un usuario no confiable podría ejecutar una aplicación de servidor no autorizada.

¿Alguien puede arrojar luz aquí?

Respuestas:


52

Suponga que está intercambiando datos con una computadora en un puerto <1024, y sabe que la computadora está ejecutando alguna variante de Unix. Entonces sabe que el servicio que se ejecuta en ese puerto está aprobado por el administrador del sistema: se ejecuta como root, o al menos tuvo que iniciarse como root.

En el amplio y salvaje mundo de Internet, esto no importa. La mayoría de los servidores son administrados por las mismas personas que los servicios que se ejecutan en ellos; no confiarías en las raíces más que los otros usuarios.

Con máquinas multiusuario, especialmente en una red local, esto puede ser importante. Por ejemplo, en los días previos a la criptografía civil, un método popular para ejecutar comandos de shell en otra máquina era rsh( r emote sh ell); podría usar la autenticación de contraseña, o podría autenticarse simplemente demostrando que era el usuario X en la máquina A (con la máquina B sabiendo que X @ A podía iniciar sesión como X @ B sin contraseña). ¿Cómo probar eso? El rshcliente es setuid root y usa un número de puerto <1024, por lo que el servidor sabe que el cliente con el que está hablando es confiable y no mentirá sobre qué usuario en A lo está invocando. Del mismo modo NFS fue diseñado para ser transparente con respecto a los usuarios y permisos, por lo que una configuración común era que en una red local cada máquina usaba la misma base de datos de usuarios, y el usuario N en A montando sistemas de archivos del servidor B obtendría los permisos del usuario N en B. Una vez más, el hecho de que el cliente NFS proviene de un número de puerto <1024 demuestra que la raíz en A ha examinado el cliente NFS, lo que se supone que debe asegurarse de que si transmite una solicitud que pretende ser del usuario N, esa solicitud realmente es del usuario N.

Los usuarios no autorizados que no pueden ejecutar servidores en puertos bajos es otro beneficio, pero no el principal. En aquellos días, la suplantación de identidad era una novedad y los usuarios que ejecutaban servidores de suplantación serían anulados rápidamente por administradores vigilantes de todos modos.


2
Entonces, ¿una especie de autenticación de pobre? ¿Tiene esta convención algún beneficio real en los sistemas operativos modernos * tipo nix?
Andrew Lambert

2
@Amazed: el mundo de Unix es conservador, por lo que la pregunta es "¿Causa algún problema real?" (y debe responderse con pleno conocimiento de que cada servidor que vale la pena ejecutar tiene un argumento de línea de comando para cambiar el puerto).
dmckee

55
@dmckee también se podría argumentar que tal diseño lleva a más servidores que se ejecutan como root, incluso si tienen la opción de ejecutarse en puertos alternativos.
Andrew Lambert

55
@Amazed Todavía puede ser útil ocasionalmente hoy en día, en redes locales. No creo que conduzca a más servidores que se ejecutan como root, los servicios pueden vincular el puerto y luego eliminar los privilegios, o usar capacidades si están disponibles, o el administrador puede redirigir un puerto en la configuración del firewall. No creo que se pondría si Unix se diseñó hoy, pero no duele.
Gilles 'SO- deja de ser malvado'

1
Este sinsentido debería haber desaparecido del núcleo. Ningún número de puerto debe tener un significado especial. El "razonamiento" detrás de ese diseño está desactualizado (creo que fue controvertido incluso en el momento del diseño). Pero lo que es peor que la idea de cualquier rango de números especiales que sean "confiables" son las implicaciones. Los servidores web deben ejecutarse como root solo para servir páginas web. Un solo exploit y el servidor de agujeros se ha ido. ¿Y para qué? Para diseños heredados que nunca funcionaron ligeramente.
masi
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.