La ejecución de un servicio web que se vincula al puerto 80 generalmente no requiere privilegios de sudoer. Dado que los puertos 80/443 son puertos del sistema, lo que significa que solo pueden ser utilizados por usuarios privilegiados, ¿cómo es que esos servicios aún pueden unirse a estos puertos?
service
permissions
port-443
adaml
fuente
fuente
Respuestas:
Básicamente hay dos enfoques diferentes:
Inicialmente comience a ejecutarse como root, enlace al puerto privilegiado y luego desplácese a un usuario sin privilegios.
inetd o xinetd se ejecuta con privilegios y reenvía las solicitudes al servidor web que se ejecuta sin privilegios.
fuente
Creo que te equivocas. Cualquiera puede usar estos puertos. Vincularse a ellos es una operación privilegiada.
La razón aquí es que algún usuario Joe no debería poder escribir un servidor web malicioso y luego crear algún host en el que no tenga ningún derecho administrativo. Por supuesto, este es un modelo bastante débil, generalmente no hay nada que impida a Joe poner su propia computadora en la red, y podría tener derechos administrativos sobre cualquier máquina a la que tenga acceso físico.
Haré una demostración con netcat.
Como usuario normal, no puedo vincularme al puerto 80:
Me puedo unir al puerto 8080:
Mientras tanto, en otra terminal, puedo conectarme al puerto 80 y enviar algunos datos, y veo que aparece en el extremo del servidor que acabo de comenzar:
Si quiero enlazar al puerto 80, necesito ser root:
O puedo asignar la
CAP_NET_BIND_SERVICE
capacidad alnc
binario:Otra opción es escribir el programa del servidor de modo que después de que se llame
listen()
, elimine los privilegios de root. Esta es una solución bastante común, y la verás con la mayoría de los demonios. Apache, por ejemplo, se inicia desde init como root, y luego abandona los privilegios de root y se convierte en el usuariowww-data
o algo similar una vez que está vinculado al puerto 80. Intente ejecutarlo/etc/init.d/apache start
como no root y Apache probablemente no se iniciará.fuente