Seguridad
Docker reduce friccion, pero no elimina riesgos. Una imagen insegura o un contenedor demasiado privilegiado puede comprometer el host o exponer secretos.
Principios
- Menor privilegio.
- Imagenes pequenas.
- Dependencias actualizadas.
- Secretos fuera de la imagen.
- Puertos minimos.
- Logs sin credenciales.
Usuario no root
dockerfile
FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
USER node
CMD ["node", "server.js"]Capabilities
Linux capabilities dividen privilegios de root. Puedes reducirlas:
bash
docker run --cap-drop ALL --cap-add NET_BIND_SERVICE nginxRead-only filesystem
bash
docker run --read-only nginxSi la app necesita escribir, monta rutas concretas.
Secretos
No hagas:
dockerfile
ENV API_KEY=secreto
COPY .env .envMejor:
- Variables inyectadas en runtime.
- Secret managers.
- Secrets del orquestador.
- Archivos montados temporalmente.
Socket de Docker
Montar el socket da control casi total del host:
bash
-v /var/run/docker.sock:/var/run/docker.sockEvitalo salvo que entiendas muy bien el riesgo.
Escaneo
bash
docker scout quickview
docker scout cves imagen:tagTambien puedes usar herramientas de CI como Trivy, Grype o escaneres del registry.
Buenas practicas
- No ejecutes como root.
- Fija versiones de imagen base.
- Escanea imagenes.
- No copies secretos.
- Limita capabilities.
- Publica solo puertos necesarios.
Errores comunes
- Usar imagenes abandonadas.
- Ejecutar con
--privileged. - Montar el socket Docker.
- Guardar tokens en capas.
- Exponer servicios internos a Internet.
