Ejecutar Docker sin privilegios de root
Qué cubre este artículo sobre Docker sin privilegios
- Qué es Docker sin privilegios de root.
- Por qué reduce los riesgos de seguridad.
- Cómo instalarlo y configurarlo.
- Limitaciones y compatibilidad.
- Paso de GPU y errores típicos.
Introducción: Ejecutar Docker sin privilegios de root
Por defecto, el daemon de Docker se ejecuta como root. Si un contenedor logra escapar o se explota una vulnerabilidad, un atacante puede obtener acceso root en el host. Docker sin privilegios de root traslada el daemon al contexto del usuario. Un ataque exitoso entonces solo tendría los permisos del usuario no privilegiado, reduciendo significativamente la superficie de ataque.
Este artículo explica cómo funciona Docker sin privilegios, cómo configurarlo y cuándo tiene sentido usarlo.
Conceptos clave
- Rootless: Ejecutándose sin permisos de root.
- User Namespace: Aislamiento de identificadores de usuario en contenedores.
- Rootlesskit: Herramienta que habilita funcionalidades sin privilegios.
- Daemon: Proceso de fondo que gestiona contenedores.
- OverlayFS: Sistema de archivos compatible con modo sin privilegios.
- Cgroups: Gestión de recursos en Linux.
- Puertos privilegiados: Puertos por debajo del 1024 que históricamente requieren root.
- Docker Context: Configuración de entorno para Docker.
Ventajas de Docker sin privilegios
- Un escape de contenedor no otorga permisos de root.
- El daemon se ejecuta en el contexto del usuario.
- Menor superficie de ataque en el host.
- Mejor separación entre procesos de usuario y procesos del sistema.
- Más seguro en entornos multiusuario.
Requisitos previos
- Linux con soporte de kernel para User Namespaces.
newuidmapynewgidmapinstalados.- Paquete Docker con soporte para modo sin privilegios.
- Overlay2 o sistema de archivos compatible.
Instalación
sudo apt-get update
sudo apt-get install -y uidmap
dockerd-rootless-setuptool.sh install
Después, presta atención a la advertencia sobre la variable de entorno:
export DOCKER_HOST=unix:///run/user/$UID/docker.sock
O agrégalo a .bashrc o .zshrc.
Iniciar Docker sin privilegios
systemctl --user start docker
systemctl --user enable docker
Verifica el estado:
docker info
docker context ls
Diferencias respecto a Docker normal
- Los comandos
dockerse ejecutan en el contexto del usuario. - Los contenedores son visibles solo para ese usuario, no a nivel del sistema.
- Los puertos estándar por debajo de 1024 requieren configuración adicional.
- Los servicios de systemd se ejecutan bajo
--user. - Los volúmenes se almacenan en el directorio home del usuario.
Puertos privilegiados
Los puertos por debajo de 1024 requieren permisos root normales. Docker sin privilegios no puede vincularlos directamente. Opciones:
- Utiliza un puerto por encima de 1024, por ejemplo 8080 en lugar de 80.
- Configura
sysctl net.ipv4.ip_unprivileged_port_start=0para permitir que el usuario acceda a todos los puertos. - Coloca un proxy inverso con permisos root frente a él.
Paso de GPU en modo sin privilegios
El paso de GPU es más complicado porque los archivos de dispositivo de GPU requieren permisos especiales:
- El usuario debe pertenecer al grupo
videoorender. - Las reglas
udevdeben hacer que los dispositivos sean accesibles. - NVIDIA Container Toolkit no funciona fácilmente con modo sin privilegios.
Para cargas de trabajo con GPU, Docker sin privilegios a menudo no es la primera opción. Docker con privilegios o soluciones alternativas suelen ser más simples.
Compose con modo sin privilegios
Compose funciona en modo sin privilegios siempre que el entorno esté configurado correctamente:
docker compose up -d
Los volúmenes se ubicarán en ~/.local/share/docker/volumes/.
Logs y depuración
journalctl --user -u docker
docker logs containername
Los permisos insuficientes o contextos incorrectos son fuentes comunes de errores.
Seguridad
- Docker sin privilegios reduce, pero no elimina todos los riesgos.
- El ID de usuario dentro del contenedor no debe ser root.
- Sigue restringiendo capacidades.
- No montes directorios sensibles en contenedores.
- Mantén secretos fuera del directorio home.
Cuándo vale la pena usar modo sin privilegios
- Sistemas multiusuario.
- Alojamiento compartido.
- Entornos de desarrollo.
- Servidores sensibles sin dependencia de GPU.
- Entornos donde se debe minimizar root.
Para cargas de trabajo de IA con GPU, el modo sin privilegios suele ser más difícil porque los controladores y el acceso a dispositivos son más complejos.
Errores comunes
DOCKER_HOSTno configurado: Los comandos docker fallan.- uidmap faltante: La instalación se interrumpe.
- Systemd no activado como usuario: El daemon no se inicia automáticamente.
- Puerto 80 no disponible: El mapeo de puertos falla.
- GPU no accesible: Faltan permisos o el toolkit.
- Volúmenes en la ubicación incorrecta: Los datos parecen desaparecer.
- Imágenes no visibles: Docker sin privilegios y Docker del sistema están separados.
Enlaces e información adicional
- BotServ.de Seguridad en Docker
- BotServ.de Red Docker
- BotServ.de Volúmenes Docker
- BotServ.de Paso de GPU Docker
FAQ: Docker sin privilegios de root
¿Docker sin privilegios es más lento? Apenas. OverlayFS y la red pueden funcionar de manera ligeramente diferente.
¿Puedo usar Rootless con Compose? Sí, Compose funciona en modo sin privilegios.
¿Por qué mi daemon no se inicia?
A menudo falta configurar DOCKER_HOST o el servicio de usuario no está activado.
¿Puedo usar puertos por debajo de 1024? Solo con configuración adicional o un proxy inverso.
¿Es Docker sin privilegios adecuado para servidores? Sí, siempre que no se requieran integraciones de hardware complejas.
Fuentes y lecturas adicionales
- Rootless Mode: https://docs.docker.com/engine/security/rootless/
- Rootlesskit: https://github.com/rootless-containers/rootlesskit
- Docker Contexts: https://docs.docker.com/engine/manage-resources/contexts/
Resumen: Ejecutar Docker sin privilegios de root
Docker sin privilegios de root aumenta la seguridad al ejecutar el daemon en el contexto del usuario. Esto reduce significativamente el impacto de un escape de contenedor. La instalación y operación son perfectamente viables en sistemas Linux modernos, aunque traen limitaciones con puertos inferiores a 1024, integración con systemd y paso de GPU. Para entornos multiusuario, computadoras de desarrollo y configuraciones críticas de seguridad, el modo sin privilegios es una opción sensata, mientras que las cargas de trabajo de IA basadas en GPU suelen funcionar más fácilmente en modo clásico.


