Para simplificar la administración de puertos de servicio entre contenedores Docker, me gustaría permitir que los servicios HTTP contenidos escuchen en el puerto TCP 80 predeterminado de HTTP de la dirección IP de su contenedor respectivo.
La escucha de números de puerto por debajo de 1025 está clásicamente restringida a usuarios con privilegios especiales, como root . La razón de esto, según tengo entendido, es prohibir que los usuarios sin privilegios en sistemas multiusuario actúen como el servicio HTTP autorizado para toda la máquina.
En las versiones más recientes de Linux, también es posible permitir esto a ejecutables específicos aplicando la capacidad del kernel de Linux CAP_NET_BIND_SERVICE . Para que esto funcione en los contenedores de Docker, también parece que necesito aplicar esta capacidad al propio contenedor de Docker, ya sea mediante el --add-cap en el cliente de Docker o la sección cap_add de Docker-Compose.
Teóricamente, el motivo de esta restricción del número de puerto es obsoleto en este caso, porque el espacio de nombres de red del kernel de Linux permite que los procesos dentro del contenedor solo se unan a sus propias direcciones IP, que son exclusivas para ellos.
Mi pregunta ahora sería, si hay alguna advertencia seria acerca de hacer esto. ¿Es esto o podría convertirse de alguna manera en un problema de seguridad que yo no haya considerado? ¿O hay algún otro problema al hacer esto?
Veo cero problemas al hacer esto.
Si bien es posible usar "cap add" y hacer que se expongan los agujeros de seguridad, permitir que se use el puerto 80 no es un problema. Es solo un puerto TCP/IP donde escucha su software y, desde una perspectiva de seguridad, no es diferente a cualquier otro número de puerto aleatorio.
Por el momento, recomendaría enlazar con otros puertos. Uno siempre los reenvía a otro puerto cuando se crea el contenedor. Jugar con la seguridad y dejar privilegios innecesarios en el contenedor parece demasiado complicado para vincularlo internamente a un puerto específico.