Saltar al contenido principal

Trivy

Container Security0.5xBlue Team

El escáner de vulnerabilidades más completo para contenedores, imágenes Docker, repositorios de código, infraestructura como código y dependencias. Integración nativa con CI/CD.

Trivy: seguridad completa en un solo escáner

Capacidades, arquitectura y casos de uso

Trivy es el escáner de seguridad de código abierto más popular para contenedores y cloud native. Desarrollado por Aqua Security, escanea vulnerabilidades, configuraciones inseguras, secrets y licencias en múltiples targets.

¿Qué puede escanear Trivy? • Imágenes Docker y container registries (Docker Hub, ECR, GCR, ACR) • Sistemas de archivos ( filesystem mode) • Repositorios Git (escaneo de código fuente) • Infraestructura como código (Terraform, CloudFormation, Kubernetes manifests) • Dependencias de código (npm, pip, Go, Maven, NuGet, etc.) • Configuraciones inseguras (Dockerfile, Kubernetes, Azure ARM) • Secrets expuestos (API keys, tokens, contraseñas) • Licencias de software

¿Por qué Trivy sobre otras herramientas? • Un solo comando escanea TODO: CVEs + configs + secrets + licencias • Base de datos de vulnerabilidades actualizada diariamente (NVD, GitHub Advisories, etc.) • Integración nativa con GitHub Actions, GitLab CI, Jenkins, Azure DevOps • Soporte completo para multi-arch, SBOM, y formato CycloneDX/SPDX • Fácil de instalar y ejecutar: trivy image nginx:latest

Flujo típico en CI/CD:

  1. Developer hace push a un repo
  2. CI construye la imagen Docker
  3. Trivy escanea la imagen antes del push al registry
  4. Si hay CRITICAL/HIGH, el pipeline falla
  5. Si pasa, la imagen se publica
  6. En producción, Trivy escanea periódicamente las imágenes desplegadas
bash
# ── INSTALACIÓN ───────────────────────────────────────
# macOS
brew install trivy

# Ubuntu/Debian
sudo apt-get install trivy

# Docker
docker pull aquasec/trivy

# Verificar
trivy --version

# ── ESCANEO BÁSICO DE IMÁGENES ────────────────────────
# Escanear una imagen Docker
trivy image nginx:latest

# Escanear con severidad específica
trivy image --severity HIGH,CRITICAL nginx:latest

# Escanear imagen local
docker build -t mi-app:latest .
trivy image mi-app:latest

# Escanear imagen de un registry privado
trivy image registry.empresa.com/app:latest

# ── ESCANEO DE ARCHIVOS Y REPOSITORIOS ────────────────
# Escanear un directorio (filesystem mode)
trivy fs --security-checks vuln,secret,config .

# Escanear un repo Git
trivy repo https://github.com/usuario/repo

# Escanear solo configuraciones inseguras
trivy config --severity HIGH,CRITICAL .

# ── ESCANEO DE KUBERNETES ──────────────────────────────
# Escanear manifiestos de Kubernetes
trivy k8s --report summary cluster

# Escanear un namespace específico
trivy k8s --namespace production cluster

# ── INTEGRACIÓN CON CI/CD ──────────────────────────────
# GitHub Actions
cat > .github/workflows/trivy.yml << 'EOF'
name: Trivy Security Scan
on: [push, pull_request]
jobs:
  scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Run Trivy vulnerability scanner
        uses: aquasecurity/trivy-action@master
        with:
          image-ref: 'mi-app:latest'
          format: 'sarif'
          output: 'trivy-results.sarif'
          severity: 'CRITICAL,HIGH'
      - name: Upload Trivy scan results
        uses: github/codeql-action/upload-sarif@v3
        with:
          sarif_file: 'trivy-results.sarif'
EOF

# GitLab CI
cat > .gitlab-ci.yml << 'EOF'
trivy-scan:
  stage: test
  image:
    name: aquasec/trivy
    entrypoint: [""]
  script:
    - trivy image --exit-code 1 --severity CRITICAL $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
EOF

💡Usa --exit-code 1 para que Trivy falle el pipeline si encuentra vulnerabilidades CRITICAL/HIGH. Esto bloquea automáticamente el despliegue de imágenes inseguras.

SBOM, licencias y reporting

Generar Software Bill of Materials y reportes de cumplimiento

Trivy genera SBOM (Software Bill of Materials) en formatos estándar, lo cual es requerido por muchas regulaciones y frameworks de seguridad.

¿Qué es un SBOM? Un SBOM es un inventario completo de todos los componentes de software en una aplicación. Incluye: librerías, dependencias, versiones, hashes y licencias. Es fundamental para: • Cumplimiento de normativas (Executive Order 14028, EU Cyber Resilience Act) • Respuesta a incidentes: saber rápidamente qué aplicaciones usan una librería vulnerable • Auditorías de licencias: evitar problemas legales con licencias GPL/AGPL en software propietario

Formatos de SBOM soportados: • CycloneDX (OWASP) — el más usado en enterprise • SPDX (Linux Foundation) — el estándar ISO • Table — formato legible para humanos

Reportes de cumplimiento: Trivy genera reportes en múltiples formatos para integrar con herramientas de gestión de vulnerabilidades.

bash
# ── GENERAR SBOM ───────────────────────────────────────
# SBOM en formato CycloneDX
trivy image --format cyclonedx --output sbom.json nginx:latest

# SBOM en formato SPDX
trivy image --format spdx --output sbom.spdx nginx:latest

# SBOM como tabla legible
trivy image --format table --output sbom.txt nginx:latest

# ── REPORTE DE LICENCIAS ──────────────────────────────
# Escanear licencias de una imagen
trivy image --license-full nginx:latest

# Escanear licencias en un repo
trivy repo --license-full https://github.com/usuario/repo

# ── REPORTES DETALLADOS ────────────────────────────────
# Reporte JSON completo (para procesamiento automatizado)
trivy image --format json --output report.json mi-app:latest

# Reporte SARIF (para GitHub Code Scanning)
trivy image --format sarif --output trivy.sarif mi-app:latest

# Reporte con todas las vulnerabilidades (no solo CRITICAL/HIGH)
trivy image --severity UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL mi-app:latest

# ── ANÁLISIS DE DEPENDENCIAS ───────────────────────────
# Escanear solo dependencias (sin configs ni secrets)
trivy fs --security-checks vuln --vuln-type os,library .

# Mostrar solo vulnerabilidades con fix disponible
trivy image --ignore-unfixed nginx:latest

# Escanear con custom severity thresholds
trivy image --severity CRITICAL --exit-code 1 mi-app:latest

# ── ESCANEO DE KUBERNETES PROFUNDO ────────────────────
# Escanear todos los pods en un cluster
trivy k8s --report all --format json --output k8s-report.json cluster

# Escanear imágenes de pods específicos
trivy k8s --report summary -l app=nginx cluster

# ── INTEGRACIÓN CON VULNERABILITY MANAGEMENT ───────────
# Exportar a formato compatible con DefectDojo/SimpleRisk
trivy image --format json mi-app:latest | \
  jq '.Results[].Vulnerabilities[] | {id: .VulnerabilityID, severity: .Severity, pkg: .PkgName, installed: .InstalledVersion, fixed: .FixedVersion}'

💡Genera SBOM en cada release y almacénalo como artefacto del build. En caso de una CVE crítica (como Log4Shell), podrás identificar en minutos qué aplicaciones están afectadas.

Escaneo avanzado y customización

Filtros, reglas personalizadas y escaneo en producción

Trivy ofrece opciones avanzadas de customización para adaptarse a cualquier entorno de producción.

Estrategias de escaneo en producción: • Escaneo periódico de imágenes en containers ejecutándose • Escaneo de filesystem en hosts (detectar binarios comprometidos) • Escaneo de IaC antes del deploy (Terraform, CloudFormation) • Integración con service mesh para escaneo de sidecars

Customización de reglas: • .trivyignore: ignorar CVEs específicos (con justificación) • Custom severity mapping: definir qué CVEs son críticos en tu contexto • Reglas de negocio: escanear solo ciertos paquetes o paths

Rendimiento: • Cache de escaneos: no re-escanear imágenes sin cambios • Parallel scanning: escanear múltiples targets simultáneamente • DB offline: descargar la DB de vulnerabilidades para entornos sin internet

bash
# ── ESCANEO EN PRODUCCIÓN ─────────────────────────────
# Escanear todos los containers en ejecución
for container in $(docker ps --format '{{.Names}}'); do
    image=$(docker inspect --format '{{.Config.Image}}' $container)
    echo "--- Escaneando $container ($image) ---"
    trivy image --severity HIGH,CRITICAL $image
done

# ── CUSTOM .trivyignore ────────────────────────────────
# Crear archivo para ignorar CVEs conocidos con justificación
cat > .trivyignore << 'EOF'
# CVE-2024-12345: Falso positivo confirmado por el equipo de seguridad
# Justificación: La función vulnerable no se usa en nuestro contexto
CVE-2024-12345
# CVE-2024-67890: Pendiente de parche, mitigación aplicada
CVE-2024-67890
EOF

trivy image --ignorefile .trivyignore mi-app:latest

# ── ESCANEO DE TERRAFORM / IaC ─────────────────────────
# Escanear manifiestos de Terraform
trivy config --severity HIGH,CRITICAL /path/to/terraform/

# Escanear CloudFormation
trivy config --severity HIGH,CRITICAL cloudformation.yml

# Escanear Dockerfiles
trivy config --severity HIGH,CRITICAL Dockerfile

# ── CACHE Y RENDIMIENTO ────────────────────────────────
# Usar cache para escaneos rápidos
trivy image --cache-dir /tmp/trivy-cache mi-app:latest

# Descargar DB para escaneo offline
trivy image --download-db-only

# Escanear en modo offline (sin conexión)
trivy image --offline-scan --skip-db-update mi-app:latest

# ── ESCANEO MULTIPLE Y RESUMEN ─────────────────────────
# Escanear múltiples imágenes y generar reporte consolidado
cat > scan_all.sh << 'SCRIPT'
#!/bin/bash
IMAGES="nginx:latest node:18 python:3.11 redis:alpine"
REPORT="./trivy_report_$(date +%Y%m%d).json"

echo '{"scan_date":"'$(date)'","images":[' > "$REPORT"
first=true
for img in $IMAGES; do
    if [ "$first" = true ]; then
        first=false
    else
        echo ',' >> "$REPORT"
    fi
    trivy image --format json "$img" >> "$REPORT"
done
echo ']}' >> "$REPORT"

# Resumen
echo "=== RESUMEN DE ESCANEO ==="
jq -r '.images[] | "(.ArtifactName): (.Results[0].Vulnerabilities // [] | length) vulnerabilidades"' "$REPORT"
SCRIPT
chmod +x scan_all.sh

💡Configura Trivy como parte del pipeline de CI/CD con --exit-code 1. Esto garantiza que ninguna imagen con vulnerabilidades CRITICAL/HIGH llegue a producción.

Labs Prácticos

Básico 20 min

Lab 1: Escaneo básico de imágenes Docker

Objetivo

Usar Trivy para escanear imágenes Docker en busca de vulnerabilidades, configuraciones inseguras y secrets expuestos.

Escenario

Tu equipo de DevOps acaba de crear una nueva imagen Docker para un microservicio. Antes de desplegarla en producción, necesitas verificar que no tenga vulnerabilidades conocidas.

Pasos

1

Instalar Trivy y verificar la instalación

2

Escanear una imagen Docker pública (nginx:latest)

3

Filtrar por severidad CRITICAL y HIGH

4

Identificar vulnerabilidades con fix disponible

bash — práctica
# INSTALAR TRIVY
brew install trivy   # macOS
# sudo apt install trivy   # Ubuntu

# VERIFICAR VERSIÓN
trivy --version

# ESCANEAR IMAGEN PÚBLICA
trivy image nginx:latest

# FILTRAR POR SEVERIDAD
trivy image --severity HIGH,CRITICAL nginx:latest

# VER SOLO VULNERABILIDADES CON FIX
trivy image --ignore-unfixed nginx:latest

# ESCANEAR IMAGEN LOCAL
docker pull node:18-alpine
trivy image --severity CRITICAL node:18-alpine

Resultado esperado

Trivy mostrará una lista de vulnerabilidades (CVEs) organizadas por severidad. Deberías ver vulnerabilidades en paquetes del sistema operativo base de la imagen.

Intermedio 30 min

Lab 2: Escaneo de repositorios y CI/CD

Objetivo

Configurar Trivy para escanear repositorios de código, generar SBOM e integrar con pipelines de CI/CD.

Escenario

Tu empresa quiere implementar seguridad shift-left. Necesitas configurar Trivy para escanear automáticamente el código fuente, detectar secrets y generar reportes de cumplimiento.

Pasos

1

Escanear un directorio de código con Trivy

2

Detectar secrets expuestos en repositorios

3

Generar SBOM en formato CycloneDX

4

Configurar GitHub Actions para escaneo automático

bash — práctica
# ESCANEAR DIRECTORIO DE CÓDIGO
trivy fs --security-checks vuln,secret,config .

# ESCANEAR SOLO SECRETS
trivy fs --security-checks secret .

# ESCANEAR SOLO VULNERABILIDADES DE DEPENDENCIAS
trivy fs --security-checks vuln .

# GENERAR SBOM
trivy image --format cyclonedx --output sbom.json nginx:latest
trivy image --format spdx --output sbom.spdx nginx:latest

# CONFIGURAR GITHUB ACTIONS
mkdir -p .github/workflows
cat > .github/workflows/trivy-scan.yml << 'EOF'
name: Trivy Security Scan
on: [push, pull_request]
jobs:
  scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Run Trivy vulnerability scanner
        uses: aquasecurity/trivy-action@master
        with:
          scan-type: 'fs'
          scan-ref: '.'
          format: 'sarif'
          output: 'trivy-results.sarif'
          severity: 'CRITICAL,HIGH'
      - name: Upload Trivy scan results
        uses: github/codeql-action/upload-sarif@v3
        with:
          sarif_file: 'trivy-results.sarif'
EOF

Resultado esperado

Deberías ver vulnerabilidades de dependencias (npm, pip, etc.), configuraciones inseguras (Dockerfile, docker-compose) y posibles secrets expuestos. El SBOM generado contendrá el inventario completo de componentes.

Aviso legal: Este contenido es estrictamente educativo. CyberFlows no apoya actividades ilegales. Úsalo solo en entornos autorizados.