La seguridad en contenedores empieza por algo simple: evitar que tus imágenes se ejecuten como usuario root. Aquí verás, paso a paso, cómo crear un usuario y grupo limitados en tu Dockerfile para NGINX, validar los permisos denegados cuando corresponde y ordenar los comandos para no romper la compilación.
¿Por qué evitar el usuario root en Docker?
Ejecutar todo como root da control total dentro de la imagen. Esto abre riesgo si alguien accede y modifica archivos o instala software malicioso. La solución práctica es crear un usuario con privilegios mínimos y cambiar a ese usuario con la instrucción USER. Así, root solo hace lo imprescindible y el usuario limitado maneja el resto.
¿Cómo se prepara la imagen base con NGINX?
- Usar NGINX como imagen base.
- Mantener una estructura clara del Dockerfile.
- Planear qué hace root y qué hace el usuario limitado.
# Ejemplo inicial (resumen de pasos descritos)
FROM nginx
# Crear grupo y usuario "admin".
RUN groupadd admin \
&& useradd -g admin admin
# Asignar permisos a la carpeta HTML de NGINX (ubicación indicada en el proyecto).
# RUN chown -R admin:admin /ruta/nginx/html
# Cambiar al usuario sin privilegios.
USER admin
# Intento de update/upgrade (fallará por permisos no root en Debian/NGINX).
RUN apt-get update && apt-get upgrade -y
# Comando que sí puede ejecutar: un eco desde bash.
RUN bash -c 'echo "app user funcionando"'
¿Cómo crear grupo y usuario admin con RUN?
- Crear un grupo de usuarios llamado admin.
- Crear un usuario admin dentro del grupo admin.
- Usar nombres iguales para grupo y usuario: facilita saber qué se usa en cada paso.
¿Cómo asignar permisos a la carpeta HTML de NGINX?
- Dar privilegios de acceso al grupo y usuario admin sobre la carpeta HTML de NGINX.
- Restringir que admin solo se mueva donde corresponde.
¿Cómo cambiar al usuario no privilegiado con USER?
Cambiar con USER admin evita que root siga en control. Al verificar tareas que requieren privilegios, como apt-get update y apt-get upgrade en Debian, verás permisos denegados: justo lo que confirma que el usuario limitado no es root.
¿Por qué falla apt-get update/upgrade sin root?
- En imágenes basadas en Debian, esos comandos requieren privilegios elevados.
- El fallo confirma que el principio de mínimo privilegio funciona.
¿Cómo corregir el orden de comandos en el Dockerfile?
- Ejecutar apt-get update && apt-get upgrade antes de crear/cambiar al usuario limitado.
- Luego crear el grupo/usuario y hacer USER admin.
# Orden corregido: root hace lo que requiere privilegios.
FROM nginx
# Actualizaciones del sistema como root.
RUN apt-get update && apt-get upgrade -y
# Crear grupo y usuario "admin".
RUN groupadd admin \
&& useradd -g admin admin
# Asignar permisos mínimos necesarios a la carpeta HTML de NGINX.
# RUN chown -R admin:admin /ruta/nginx/html
# Cambiar al usuario limitado.
USER admin
# Validación con un eco en bash.
RUN bash -c 'echo "app user funcionando"'
¿Cómo construir la imagen y validar los permisos?
- Ubicarse en la carpeta del proyecto con el Dockerfile.
- Compilar con docker build y un tag reconocible.
docker build -t Usuarios .
- Observar la salida: el intento de apt-get bajo admin da permisos denegados; al reordenar, compila en menos de un segundo.
¿Qué buenas prácticas de seguridad refuerza este flujo?
Adoptar un usuario no root en la imagen es una medida básica y efectiva para contener riesgos como la inserción de malware. Además, separa claramente qué debe hacer root y qué no.
- Crear y usar un usuario/grupo dedicado (admin) con privilegios limitados.
- Cambiar a USER tan pronto como root termine su parte.
- Mantener permisos mínimos sobre rutas sensibles como HTML de NGINX.
- Validar con comandos simples como bash + echo que el usuario está activo.
- Etiquetar y compilar con docker build -t Usuarios . para rastrear versiones.
¿Quieres que revisemos tu Dockerfile y ajustemos permisos y orden de comandos para tu caso? Deja tu comentario y lo vemos juntos.