Muchos administradores y desarrolladores despliegan contenedores Docker por defecto con el usuario root. Es el camino fácil, pero es una pesadilla de seguridad. Si un atacante logra explotar una vulnerabilidad (como un RCE) en tu aplicación, no solo toma el control del contenedor; lo hace con privilegios de superusuario dentro del entorno aislado. Un container breakout ejecutado como root es un desastre operativo crÃtico.
La realidad técnica
Aunque los namespaces del kernel de Linux proveen aislamiento, el root dentro del contenedor suele mapearse al mismo UID 0 del host si no tienes configurado User Namespaces (userns-remap). Cualquier vulnerabilidad en el runtime o una mala configuración de capacidades permite que un atacante salte al kernel del host con relativa facilidad.
Ejemplo: Asegura tu Dockerfile
No confÃes en los valores por defecto. Crea un usuario especÃfico en tu imagen:
Mala práctica: Ejecuta como root por defecto
FROM node:20
CMD ["node", "app.js"]
Buenas práctica: Crea un usuario sin privilegios
FROM node:20
RUN groupadd -r appuser && useradd -r -g appuser appuser
USER appuser
Asegura permisos en los archivos de la app
COPY --chown=appuser:appuser . .
CMD ["node", "app.js"]
Checklist de Mitigación Rápida
- USER Instruction: Define siempre un usuario no privilegiado en el Dockerfile. Es tu primera lÃnea de defensa.
- Capabilities: Aplica principio de menor privilegio con –cap-drop=ALL y añade solo lo necesario con –cap-add.
- Filesystem: Monta los directorios sensibles del contenedor en modo –read-only.
- No-new-privileges: Usa el flag –security-opt=no-new-privileges en tu docker-compose o comando run para evitar que procesos ganen nuevos privilegios (ej. mediante binarios SUID).
- Verificación: Ejecuta docker run –rm -it whoami. Si el output es root, necesitas ajustar tu configuración.
Automatización y CI/CD
Implementar esto manualmente es tedioso y propenso a errores. En entornos de DevSecOps, la validación debe ocurrir antes del build.
¿Qué herramienta utilizas para escanear tus Dockerfiles en el pipeline antes de enviarlos a registro? ¿Prefieres el linting estático con hadolint o escaneos de vulnerabilidades dinámicos tipo Trivy/Clair? Te leo en los comentarios.
0 comentarios