unix ip

unix - ¿Por qué los puertos por debajo de 1024 son privilegiados?



ip (2)

Escuché que pretende ser una característica de seguridad, pero a menudo parece ser un problema de seguridad. Si quiero escribir un servidor que use un puerto con privilegios, no solo me tengo que preocupar de cuán seguro es mi código, especialmente tengo que preocuparme de si estoy usando setuid a la derecha y soltando privilegios.


Cierto. Pero también significa que cualquier persona que le hable sabe que debe tener privilegios de root para ejecutar ese servidor. Cuando inicia sesión en un servidor en el puerto 22 (por ejemplo), sabe que está hablando con un proceso que fue ejecutado por root (problemas de seguridad aparte), por lo que confía en su contraseña para ese sistema u otra información que pueda no confíes en nadie con una cuenta de usuario en ese sistema.

Referencia: http://www.w3.org/Daemon/User/Installation/PrivilegedPorts.html .

Edite para explicar el razonamiento: muchos de los servicios de red más importantes (telnet (sí, todavía se usa, sorprendentemente), SSH, muchos servicios HTTP, FTP, etc., implican el envío de datos importantes como contraseñas por cable. En una configuración segura, algún tipo de cifrado, ya sea inherente al protocolo (SSH) o envuelto alrededor (stunnel, IPSec), protege los datos de ser interceptados en el cable, pero todas estas protecciones terminan en el servidor.

Para proteger sus datos correctamente, debe asegurarse de estar hablando con el servidor "real". Hoy en día, los certificados seguros son la forma más importante de hacerlo en la web (y en cualquier otro lugar): usted supone que solo el servidor "real" tiene acceso al certificado, por lo que si verifica que el servidor con el que está hablando tiene ese certificado lo voy a confiar

Los puertos con privilegios funcionan de una manera muy similar: solo root tiene acceso a puertos con privilegios, por lo que si está hablando con un puerto con privilegios sabe que está hablando con root. Esto no es muy útil en la web moderna: lo que importa es la identidad del servidor, no su IP. En otros tipos de redes, este no es el caso: en una red académica, por ejemplo, los servidores a menudo son controlados físicamente por personal de confianza en habitaciones seguras, pero los estudiantes y el personal tienen un acceso bastante libre como usuarios. En esta situación, a menudo es seguro asumir que siempre puede confiar en root, por lo que puede iniciar sesión y enviar datos privados a un puerto con privilegios de manera segura. Si los usuarios normales pudieran escuchar en todos los puertos, necesitarías una capa adicional para verificar que un determinado programa era confiable con ciertos datos.


No dices qué plataforma estás usando, pero en Linux al menos puedes usar capacidades (específicamente CAP_NET_BIND_SERVICE) para permitir que un proceso que no sea raíz escuche en un puerto de menos de 1024. Ver, por ejemplo, ¿Hay alguna manera de hacerlo? procesos no root para enlazar a puertos "privilegiados" en Linux?

Otra alternativa es configurar reglas de iptables para reenviar tráfico desde el puerto privilegiado al puerto no privilegiado (lo he usado en producción, y es bastante simple y funciona bien). También se describe en el enlace de arriba.