Gestionar correctamente los secretos en Docker
Qué cubre este artículo sobre Docker Secrets
- Por qué los secretos en Docker necesitan protección.
- Qué opciones existen.
- Cómo funcionan los Docker Secrets en Swarm.
- Cómo usar archivos
.envde forma segura. - Alternativas como Vault, Infisical o dotenvx.
Introducción: Gestionar correctamente los secretos en Docker
Los contenedores necesitan frecuentemente contraseñas, claves de API, tokens o certificados. Estos secretos no deben acabar en la imagen, en el contexto de compilación o en el control de versiones. Docker ofrece varios mecanismos para proteger estos datos. Conocer las diferencias evita que información confidencial se exponga en imágenes, logs o backups.
Este artículo muestra cómo manejar secretos de forma segura en Docker y Compose.
Conceptos clave
- Secret: Información confidencial como contraseña o clave de API.
- Docker Secret: Secreto gestionado en Swarm.
- Archivo Env: Fichero con variables de entorno.
- Build Secret: Secreto disponible solo durante la compilación.
- Mount: Montar un secreto en un contenedor.
- Vault: Solución especializada para gestionar secretos.
- Rotation: Renovación periódica de secretos.
- Secret Injection: Proporcionar secretos en tiempo de ejecución.
Qué no hacer
Evita estos errores:
- Establecer secretos en el Dockerfile con
ENV. - Escribir contraseñas directamente en
compose.yaml. - Almacenar archivos
.enven el repositorio. - Mostrar secretos en logs.
- Subir imágenes con secretos incrustados.
Cualquiera de estos errores puede provocar un incidente de seguridad.
Archivos Env
Un archivo .env es el forma más simple de proporcionar variables de entorno:
services:
app:
image: mein-image
env_file:
- .env
Añade .env a .gitignore y realiza copias de seguridad o encriptación regularmente.
Ejemplo de Compose con Env
services:
db:
image: postgres:16
environment:
- POSTGRES_PASSWORD_FILE=/run/secrets/db_password
secrets:
- db_password
secrets:
db_password:
file: ./db_password.txt
El archivo db_password.txt contiene la contraseña en texto plano. No debe estar en el repositorio.
Docker Secrets en Swarm
En modo Swarm, los secretos se pueden gestionar centralmente:
echo "meinpasswort" | docker secret create db_password -
En Compose:
services:
db:
image: postgres:16
secrets:
- db_password
environment:
POSTGRES_PASSWORD_FILE: /run/secrets/db_password
secrets:
db_password:
external: true
Los secretos se proporcionan como archivos en /run/secrets/.
Build Secrets
Los build secrets se utilizan durante la compilación y no permanecen en la imagen final:
# syntax=docker/dockerfile:1.7
FROM python:3.11-slim
RUN --mount=type=secret,id=pipconf \
PIP_CONFIG_FILE=/run/secrets/pipconf \
pip install -r requirements.txt
Compilación:
docker build --secret id=pipconf,src=./pip.conf .
Evitar secretos en logs de contenedores
- Nunca mostres secretos en comandos
printoecho. - Establece el nivel de logging en
INFOo superior. - Escanea logs en busca de patrones sensibles.
Alternativas
HashiCorp Vault
Gestión centralizada, secretos dinámicos, rotación automática.
Infisical
Alternativa open-source con buena integración con Docker.
dotenvx
Archivos .env encriptados con clave compartida.
Mozilla SOPS
Encriptación de archivos de secretos en Git.
Estrategia de rotación
- Renueva secretos periódicamente.
- Automatiza la rotación donde sea posible.
- Desactiva claves antiguas antes de desplegar las nuevas.
- Ten procedimientos de emergencia ante sospechas de filtración.
Consejos prácticos
- Protege los archivos
.enven el host. - Principio de mínimos privilegios: solo secretos necesarios en el contenedor.
- Restringe permisos:
chmod 600 .env. - Nunca almacenes secretos sin encriptar en backups.
- Mantén un registro de auditoría.
- Usa un Vault centralizado para configuraciones mayores.
Errores comunes
.enven Git: Todos con acceso ven los secretos.- Secretos en cache de compilación: Build secrets mal configurados.
- Logs exponen información: Contraseñas en mensajes de error.
- Permisos incorrectos:
.enves legible para todos. - Secretos estáticos: Contraseñas nunca rotadas.
- Memory dumps de contenedores: Los volcados contienen secretos.
Enlaces y recursos adicionales
- BotServ.de Docker Seguridad
- BotServ.de Docker Swarm
- BotServ.de Gestión de Secretos
- BotServ.de Mozilla SOPS
- BotServ.de dotenvx
Preguntas frecuentes: Docker Secrets
¿Qué son Docker Secrets? Valores confidenciales gestionados especialmente, en particular en Swarm.
¿Son seguros los archivos .env?
Solo si permanecen localmente, están protegidos y no llegan a Git.
¿Puedo usar Secrets en Compose sin Swarm?
Sí, mediante archivos en /run/secrets y Bind Mounts.
¿Qué es un Build Secret? Un secreto disponible solo durante la compilación que no aparece en la imagen final.
¿Debería usar Vault?
Para configuraciones grandes o profesionales sí, para homelabs pequeños bastan .env o SOPS.
Fuentes y lecturas recomendadas
- Docker Secrets: https://docs.docker.com/engine/swarm/secrets/
- Docker BuildKit Secrets: https://docs.docker.com/build/building/secrets/
- HashiCorp Vault: https://www.vaultproject.io/
- Infisical: https://infisical.com/
Resumen: Gestionar correctamente los secretos en Docker
Los secretos en Docker nunca deben estar en imágenes, repositorios o logs. Para configuraciones simples, archivos .env protegidos y Swarm Secrets son suficientes; para requisitos mayores, considera Vault, Infisical o SOPS. Lo importante es mantener permisos limpios, rotar secretos regularmente y minimizar su distribución en contenedores. Mantener los secretos fuera del contexto de compilación y ejecución reduce significativamente el riesgo de filtración y hace que los entornos de contenedores sean mucho más robustos.


