DockerContenedoresAislamiento5 min de lectura

Seguridad en contenedores Docker

Contenedores non-root, filesystems read-only, límites de recursos, aislamiento de red y escaneo de imágenes.


Principios de seguridad en Docker

Docker no es seguro por defecto. Seguí estas prácticas para reducir riesgos:

  • Nunca corras contenedores como root
  • No uses --privileged a menos que sea absolutamente necesario
  • Limitá recursos (CPU, RAM)
  • Aislá redes entre contenedores
  • Escaneá imágenes antes de usarlas

Contenedores non-root

En tu Dockerfile:

dockerfile
FROM node:20-alpine

# Crear usuario no-root
RUN addgroup -S appgroup && adduser -S appuser -G appgroup

WORKDIR /app
COPY --chown=appuser:appgroup . .

# Cambiar al usuario no-root
USER appuser

CMD ["node", "server.js"]

Filesystem read-only

Ejecutá contenedores con filesystem de solo lectura:

bash
docker run --read-only --tmpfs /tmp --tmpfs /var/run mi-app

En docker-compose:

yaml
services:
  app:
    image: mi-app
    read_only: true
    tmpfs:
      - /tmp
      - /var/run

Límites de recursos

yaml
services:
  app:
    image: mi-app
    deploy:
      resources:
        limits:
          cpus: '1.0'
          memory: 512M
        reservations:
          cpus: '0.25'
          memory: 128M

O con docker run:

bash
docker run --memory=512m --cpus=1.0 mi-app

Aislamiento de red

Creá redes separadas para cada grupo de servicios:

yaml
services:
  app:
    networks:
      - frontend
      - backend
  db:
    networks:
      - backend
  nginx:
    networks:
      - frontend

networks:
  frontend:
  backend:
    internal: true  # Sin acceso a internet

La base de datos solo es accesible desde la red backend.

Escaneo de imágenes con Trivy

bash
# Instalar Trivy
sudo apt install -y wget
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
echo 'deb https://aquasecurity.github.io/trivy-repo/deb generic main' | sudo tee /etc/apt/sources.list.d/trivy.list
sudo apt update && sudo apt install -y trivy

# Escanear una imagen
trivy image mi-app:latest

# Escanear solo vulnerabilidades críticas
trivy image --severity CRITICAL mi-app:latest

Integrá Trivy en tu CI/CD para escanear antes de deployar.

Docker Secrets

Nunca pongas contraseñas en variables de entorno del Dockerfile:

yaml
services:
  app:
    secrets:
      - db_password

secrets:
  db_password:
    file: ./secrets/db_password.txt

En la app, leé el secreto desde /run/secrets/db_password.

Buenas prácticas adicionales

dockerfile
# Usar imágenes mínimas (alpine)
FROM node:20-alpine

# No instalar paquetes innecesarios
RUN apk add --no-cache dumb-init

# Usar .dockerignore
# Copiar solo lo necesario
COPY package.json package-lock.json ./
RUN npm ci --production
COPY src/ ./src/

Recomendaciones

  • Usá imágenes oficiales y mínimas (alpine)
  • Actualizá imágenes base regularmente
  • No expongas el socket de Docker (/var/run/docker.sock)
  • Usá Docker Bench Security para auditar tu instalación
  • Implementá health checks en todos los contenedores
  • Nunca guardes secretos en la imagen

¿Te resultó útil esta guía?