DEV Community

Cover image for GitHub Actions + Security Scanning: Cómo Integrar Trivy y Checkov en tu Pipeline
francotel
francotel

Posted on

GitHub Actions + Security Scanning: Cómo Integrar Trivy y Checkov en tu Pipeline

🚨 La Pesadilla que Todos los DevOps Tememos

Era un martes cualquiera cuando recibí la alerta: "Vulnerabilidad CRÍTICA detectada en producción". Nuestra aplicación, que servía a miles de usuarios, tenía una vulnerabilidad de día cero que alguien había logrado explotar.

¿El culpable? Una imagen Docker que habíamos desplegado la semana anterior.

La peor parte: ¡La vulnerabilidad ya existía cuando publicamos la imagen! Había pasado por nuestro pipeline CI/CD sin que nadie la notara.

En ese momento entendí algo crucial: si tu pipeline no valida seguridad, estás desplegando ciegamente.

🛡️ La Solución: Integrar Security Scanning en GitHub Actions

Después de esa experiencia, me propuse crear un pipeline que nunca más permitiera que vulnerabilidades llegaran a producción. Así nació este proyecto que hoy comparto contigo.

🔍 El Problema que Resolvemos

# Así era nuestro workflow ANTES:
- name: Build Docker Image
  run: docker build -t mi-app .


- name: Push to Registry  
  run: docker push mi-app:latest

# ¡Sin validaciones de seguridad!
Enter fullscreen mode Exit fullscreen mode

Resultado: Vulnerabilidades, secretos expuestos, configuraciones inseguras... todo llegando a producción.

🚀 La Arquitectura de Nuestro Pipeline Seguro

Nuestro nuevo pipeline tiene 4 fases críticas:

1. 🐳 Construcción con Etiquetas Inteligentes

# Tags únicos por commit + ambiente
IMAGE_TAG_SHA: "sha-${GITHUB_SHA::7}"
IMAGE_TAG_ENV: "${{ inputs.target_env }}-latest"
Enter fullscreen mode Exit fullscreen mode
  1. 🔍 Escaneo de Vulnerabilidades con Trivy
- name: Security Scan con Trivy
  run: |
    docker run --rm \
      -v $(pwd):/src \
      aquasec/trivy:latest \
      image --severity CRITICAL,HIGH \
      mi-imagen:${TAG}
Enter fullscreen mode Exit fullscreen mode

Trivy nos ayuda a encontrar:

  • Vulnerabilidades en paquetes del sistema

  • Dependencias con CVEs conocidos

  • Secretos expuestos accidentalmente

  • Configuraciones inseguras

3. 🏗️ Validación de Dockerfile con Checkov

- name: IaC Security con Checkov
  run: |
    docker run --rm \
      bridgecrew/checkov \
      --file Dockerfile \
      --framework dockerfile
Enter fullscreen mode Exit fullscreen mode

Checkov revisa que nuestro Dockerfile siga mejores prácticas:

  • ¿Usuario root? ❌

  • ¿Paquetes sin actualizar? ❌

  • ¿Secretos hardcodeados? ❌

4. 🚫 Bloqueo Automático en Fallos

La magia está aquí: si hay vulnerabilidades CRÍTICAS o ALTAS, el pipeline SE DETIENE.

if [ "$VULNERABILIDADES" -gt 0 ]; then
  echo "❌ WORKFLOW BLOQUEADO"
  echo "Hay $VULNERABILIDADES problemas de seguridad"
  exit 1
fi
Enter fullscreen mode Exit fullscreen mode

📊 Dashboard de Seguridad en Tiempo Real

Lo mejor de todo: todo aparece automáticamente en GitHub Actions Summary:

🐳 Reporte de Escaneo - Trivy
══════════════════════════════

📊 Resumen General
──────────────────
| Tipo              | Severidad  | Cantidad |
|-------------------|------------|----------|
| Vulnerabilidades  | 🔴 CRÍTICA | 2        |
| Vulnerabilidades  | 🟠 ALTA    | 9        |
| Total             |            | 11       |

🏗️ Checkov Security Scan  
══════════════════════════

✅ Todos los checks pasaron (22 passed, 0 failed)
Enter fullscreen mode Exit fullscreen mode

🎯 El Resultado: Confianza Automatizada


Antes:

  • "Ojalá no haya vulnerabilidades"

  • Auditorías manuales cada 3 meses

  • Incidentes de seguridad recurrentes

Después:

  • ✅ Cada commit validado automáticamente

  • ✅ Cada imagen escaneada antes de publicar

  • ✅ Cada despliegue con reporte de seguridad

  • ✅ Cero vulnerabilidades en producción desde la implementación

trivy-1

trivy-2

checkov-1

💡 Lecciones Aprendidas

1. Seguridad ≠ Lentitud

Muchos piensan que agregar security scanning hará lento el pipeline. ¡Falso! Nuestros escaneos agregan solo 2-3 minutos.

2. Fail Fast es Mejor que Fail in Production

Preferimos que falle el pipeline (y notifique al desarrollador) a que falle en producción (y afecte a usuarios).

3. Los Reportes Son Tu Mejor Aliado

Un reporte claro y automático hace que los equipos entiendan y arreglen los problemas, no solo los "parcheen".

🚀 Implementa en 3 Pasos Sencillos

==================================

Paso 1: Clona y explora

git clone https://github.com/francotel/docker-image-security-scan  
cd docker-image-security-scan   
Enter fullscreen mode Exit fullscreen mode

Paso 2: Examina el workflow

Revisa .github/workflows/publish-nginx-image.yml - ¡todo está listo para usar!

Paso 3: Adapta a tu caso

Modifica nombres de imágenes, registros y políticas según tu stack.

📈 Impacto Inmediato

  • Detección: De trimestral a en cada commit

  • Cobertura: De muestras a 100% de imágenes

  • Confianza: De "espero" a "sé que está validado"

🤝 ¿Cómo Contribuir?

El proyecto está activo en github.com/francotel/docker-image-security-scan

¿Ideas para mejorar?

  • Notificaciones en Slack/Teams

  • Dashboard histórico

  • Escaneo automático de imágenes base

  • Policy as Code personalizado

🎯 ¡Hazlo Hoy!

Ventajas clave:

  • ✅ Gratuito (open source)

  • ✅ Simple (un archivo YAML)

  • ✅ Efectivo (bloquea problemas reales)

Acción inmediata:

  1. ⭐ Dale estrella al repo

  2. 🐑 Haz fork y adapta

  3. 💬 Comenta en issues

¿Listo para seguridad automatizada?👉 github.com/francotel/docker-image-security-scan

#DevSecOps #GitHubActions #DockerSecurity

¡No te lo pierdas! Sígueme en LinkedIn para estar al tanto de todas las actualizaciones y futuros artículos:

LinkedIn

☕ Apóyame con un café

Si este contenido te ha sido útil y quieres apoyarme para seguir creando más, considera invitarme un café. ¡Tu apoyo hace la diferencia! 🥰

BuyMeACoffee


¡Gracias por leer y hasta la próxima! 👋

Top comments (0)