Privilegios de root en Docker

Resuelto
Casoth -  
CasothIT Mensajes publicados 6 Estado Miembro -

Hola,

Estoy comenzando a aprender Docker, a nivel de instalación/pull de contenedores/ejecución, etc., no tengo problemas por el momento. Estoy disfrutando tranquilamente.

Pero me he dado cuenta de que para lanzar los contenedores, debo estar como root. He visto en la documentación que es posible configurarlo para ejecutar los contenedores como no-root.

En sí, imagino que el problema (o al menos la pregunta) ha sido bien estudiado por personas en su nivel en sus respectivos campos. Pero no puedo evitar preguntarme si hay algún riesgo al lanzar contenedores con tantos privilegios.

Por ejemplo, si lanzo un contenedor con un servicio de servidor web, me parece curioso lanzarlo con tantos derechos, sabiendo que hay interacciones directas con mi "host". (Espero haber sido claro, todavía estoy en fase de descubrimiento, así que tal vez confunda algunas nociones)

¿Qué opinan ustedes?

Gracias por sus respuestas

Casoth

pd: Lo siento si no estoy en el foro correcto


3 respuestas

  1. avion-f16 Mensajes publicados 19182 Fecha de registro   Estado Colaborador Última intervención   4 511
     

    Hola,

    Los privilegios de root son necesarios para comunicarse con el demonio de Docker.

    No se hace distinción entre los contenedores gestionados por este demonio en función de "qué usuario ejecutó el comando 'docker run...'". Así, cada usuario que tenga acceso al demonio de Docker puede ver/gestionar los contenedores lanzados por otros usuarios a través de este demonio, lo que puede ser un problema en un sistema multiusuario. Además, para evitar el "sudo", los usuarios pueden ser añadidos al grupo "docker".

    Es solo el demonio el que se ejecuta de forma privilegiada, siempre hay una capa de aislamiento que hace que incluso si un contenedor fuera comprometido (debido a una vulnerabilidad en una aplicación contenida en este contenedor), el hacker no podría alcanzar el sistema host. Sería necesario explotar una vulnerabilidad de seguridad a nivel de la tecnología de contenedores subyacente (LXC para contenedores Linux, HyperV para contenedores Windows), lo cual es poco probable.

    No obstante, tienes razón al preguntarte por qué una aplicación como Apache, un proyecto de NodeJS o una aplicación PHP debería necesitar la intervención de "root" en algún momento, cuando podrían ejecutarse perfectamente como un usuario simple. Por eso es preferible usar contenedores sin root, si es posible con Podman.

    Para utilizar un puerto privilegiado <1024, basta con asociar el contenedor a un puerto no privilegiado y crear una redirección de puertos con el cortafuegos del sistema (nftables), desaconsejo modificar el límite de los puertos privilegiados, método a menudo presentado como "solución".

    0
  2. Casoth
     

    Gracias por tu respuesta.

    Entiendo mejor la idea del daemon, etc. Pero entonces, añadir el grupo Docker a un usuario solo permite hacer un 'docker run' sin el sudo, pero detrás seguirá siendo gestionado por el daemon con privilegios elevados, ¿verdad?

    Me voy a informar sobre las capas LXC/HyperV, gracias por la pista.

    También voy a mirar esta historia de Podman y de contenedores sin privilegios.

    En cuanto a los puertos, tomando como ejemplo un servidor apache. Si lanzo el contenedor en modo ' -p 6666:6666', si no me equivoco, las solicitudes pasarán del contenedor al host a través del puerto 6666. A través del firewall, redirijo mi tráfico 6666 hacia el 80, ¿no? Así, a través de mi navegador, si hago un http://localhost:80, veré mi servidor web, ¿verdad? No conozco demasiado nftables, he dejado la configuración por defecto (deny all en el tráfico entrante de memoria). Quizás deba repasar algunas bases.

    De todas formas, hay muchas pistas por explorar y cosas que leer y probar.

    Te agradezco de nuevo.

    0
    1. avion-f16 Mensajes publicados 19182 Fecha de registro   Estado Colaborador Última intervención   4 511
       

      De hecho, el usuario no privilegiado podría, a través del daemon de Docker, acceder a datos a los que normalmente no tiene acceso lanzando un contenedor y adjuntando el archivo/carpeta objetivo.

      Sí, la idea es utilizar un puerto del host superior a 1024 para publicar el servicio, ya que es necesario ser administrador para acceder a los puertos inferiores. Ten en cuenta que el puerto interno del contenedor puede ser el 80: puedes utilizar "-p 6666:80"

      De este modo, http://localhost:6666 mostrará tu página de Apache que escucha en el puerto 80 del contenedor.

      Y para acceder a http://localhost, será necesario redirigir los paquetes IP destinados a 127.0.0.1:80 hacia 127.0.0.1:6666

      Esto es DNAT, que debe configurarse con tu cortafuegos (iptables, ufw, firewalld, ...). Es necesario ser administrador para crear esta redirección, pero solo para esta acción.

      0
      1. CasothIT Mensajes publicados 6 Estado Miembro > avion-f16 Mensajes publicados 19182 Fecha de registro   Estado Colaborador Última intervención  
         

        De acuerdo, no he pensado mucho en ello, pero es un poco como la tabla NAT de mi router (mi caja en este caso), veo grosso modo el principio, aunque hay muchas cosas que profundizar. ¡Voy a probar todo eso, a equivocarme, a volver a intentarlo y a avanzar!

        Te agradezco por tus luces, hay tantos recursos en internet, que a veces no es fácil hacer la selección ^^

        ¡Diviértete! o/

        0
  3. CasothIT Mensajes publicados 6 Estado Miembro
     

    Hola,

    Para un pequeño regreso, me divertí montando un servidor web (Apache/mariaDB) con un contenedor por servicio y redirecciones de puertos a través de Netfilter.

    Me hice un pequeño CRUD rápido para ver:

    - mis peticiones wget responden perfectamente en http://127.0.0.1

    - en Wireshark / los logs de Netfilter, veo bien la redirección de paquetes y el tráfico como se esperaba.

    ¡Gracias de nuevo por el desbroce de información!

    0