⏱ Tiempo estimado: 20 minutos
🎯 Rama / Perfil: Seguridad / DevOps / devs que quieren “shift-left” en su pipeline.
🧠 Conocimiento previo necesario: Clases 2, 3 y 7 del curso (Docker, imágenes con dependencias fijas, qué hace CI). El curso no cubre seguridad, así que partes de ahí.
💡 ¿Qué vas a lograr? Tres compuertas de seguridad (Dockerfile, vulnerabilidades y secretos) que hacen fallar tu pipeline si hay riesgo.
🛠 Lo que necesitas antes de empezar
- Docker Desktop → 🔗 https://www.docker.com/products/docker-desktop/
- Git → 🔗 https://git-scm.com/downloads
- Un repo en GitHub (opcional, para el paso final) → 🔗 https://github.com/signup
Las tres herramientas se ejecutan como contenedores, así que no necesitas instalarlas:
- Hadolint → 🔗 https://github.com/hadolint/hadolint
- Trivy → 🔗 https://trivy.dev/
- Gitleaks → 🔗 https://github.com/gitleaks/gitleaks
📋 Pasos
Paso 1: Prepara un proyecto con fallos a propósito
Crea una carpeta devsecops-lab con estos archivos.
app.js:
js
console.log('hola');
config.js (token falso para la prueba):
js
module.exports = { token: 'ghp_aBcDeFgHiJkLmNoPqRsTuVwXyZ0123456789' };
Dockerfile (mal escrito a propósito):
dockerfile
FROM node:14
WORKDIR /app
ADD . .
CMD ["node", "app.js"]
Paso 2: Compuerta 1, revisa el Dockerfile con Hadolint
bash
docker run --rm -i hadolint/hadolint < Dockerfile
Te señalará malas prácticas (por ejemplo, usar ADD en vez de COPY y no fijar versiones). Cada regla tiene un código (DLxxxx) documentado en el repositorio de Hadolint.
Paso 3: Compuerta 2, escanea vulnerabilidades con Trivy
bash
docker build -t demo:vuln .
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
aquasec/trivy image --severity HIGH,CRITICAL --exit-code 1 demo:vuln
node:14 es una base muy antigua y sin soporte, por lo que verás una lista larga de CVEs. El --exit-code 1 es lo que hace fallar el pipeline cuando encuentra algo de severidad alta o crítica.
🔗 Documentación: https://trivy.dev/latest/docs/
Paso 4: Compuerta 3, detecta secretos con Gitleaks
bash
docker run --rm -v "$(pwd):/repo" zricethezav/gitleaks:latest detect --source /repo --no-git -v
Debería detectar el token falso de config.js y terminar con código de error. Las versiones nuevas de Gitleaks pueden renombrar este comando (por ejemplo, gitleaks dir); [verificar en el README del repositorio oficial] si el comando no responde.
Paso 5: Corrige y vuelve a escanear
Reemplaza el Dockerfile:
dockerfile
FROM node:20-alpine
WORKDIR /app
COPY app.js .
USER node
CMD ["node", "app.js"]
Borra config.js, reconstruye la imagen y repite los pasos 2 a 4. Los resultados deberían mejorar drásticamente: el Trivy se reduce mucho (puede quedar algún hallazgo de la imagen base, y ese es un escenario real) y Gitleaks y Hadolint quedan limpios.
Paso 6: Llévalo al pipeline
En un repo de GitHub, crea .github/workflows/security.yml:
yaml
name: security
on: [push, pull_request]
jobs:
gates:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Hadolint
run: docker run --rm -i hadolint/hadolint < Dockerfile
- name: Gitleaks
run: docker run --rm -v "$PWD:/repo" zricethezav/gitleaks:latest detect --source /repo --no-git
- name: Build
run: docker build -t app:ci .
- name: Trivy
run: |
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
aquasec/trivy image --severity HIGH,CRITICAL --exit-code 1 app:ci
Si cualquier compuerta falla, el job se marca en rojo y el merge puede bloquearse.
✅ Resultado esperado
Viste fallar tres controles distintos sobre un proyecto vulnerable, lo corregiste y dejaste un workflow security.yml que repite esos controles en cada push. Ahora tu pipeline verifica seguridad además de que el código funcione.
🔥 Tu reto (siguiente acción)
Aplica las tres compuertas a uno de tus proyectos reales. Si Trivy reporta CVEs, intenta reducirlos cambiando la imagen base (por ejemplo, de node:20 a node:20-alpine) y anota cuántos hallazgos eliminaste.
📚 Recursos para ir más lejos
- OWASP Docker Security Cheat Sheet: 🔗 https://cheatsheetseries.owasp.org/cheatsheets/Docker_Security_Cheat_Sheet.html (checklist de buenas prácticas de contenedores)
- Trivy en GitHub Actions: 🔗 https://github.com/aquasecurity/trivy-action (acción oficial con reportes SARIF para la pestaña Security)
Curso Profesional de DevOps
COMPARTE ESTE ARTÍCULO Y MUESTRA LO QUE APRENDISTE