Trivy: Seguridad de Contenedores y DevSecOps con un Solo Comando
El escáner de seguridad que necesitas en tu pipeline
Trivy es el escáner de seguridad de código abierto más popular para contenedores y cloud native. Desarrollado por Aqua Security, hace lo que otras herramientas necesitan múltiples binarios para lograr: escanea vulnerabilidades, configuraciones inseguras, secrets y licencias con un solo comando.
La ventaja de Trivy sobre herramientas como Clair o Anchore es su simplicidad: un solo binario sin dependencias externas, una base de datos de vulnerabilidades actualizada automáticamente, y soporte nativo para prácticamente cualquier formato de container image. Esto lo convierte en la herramienta ideal para integrar en pipelines de CI/CD donde la velocidad y la fiabilidad son críticas.
Por qué la seguridad de contenedores importa
Los contenedores Docker y Kubernetes son la base de la infraestructura moderna, pero introducen superficies de ataque que muchas organizaciones pasan por alto. Una imagen Docker puede contener cientos de paquetes del sistema operativo base, cada uno con vulnerabilidades conocidas. Sin un escaneo automatizado, estas vulnerabilidades llegan silenciosamente a producción.
Según los informes de Aqua Security, más del 50% de las imágenes en registries públicos contienen al menos una vulnerabilidad de severidad CRITICAL. Las organizaciones que no implementan escaneo de imágenes en su pipeline de CI/CD están desplegando código con vulnerabilidades conocidas que podrían ser explotadas en minutos.
Qué puede escanear Trivy
| Target | Qué detecta |
|---|---|
| Imágenes Docker | CVEs en paquetes OS y librerías |
| Repositorios Git | Vulnerabilidades de dependencias, secrets |
| Kubernetes | Imágenes de pods con vulnerabilidades |
| Terraform/CloudFormation | Configuraciones IaC inseguras |
| Dockerfile | Mejores prácticas de seguridad |
| SBOM | Inventario completo de componentes |
Trivy utiliza múltiples fuentes de datos de vulnerabilidades: NVD, GitHub Advisories, Debian Security Tracker, Red Hat OVAL, y Alpine SecDB. Esto le permite detectar vulnerabilidades en prácticamente cualquier distribución Linux y en librerías de lenguajes como Python, Node.js, Go y Rust.
Instalación
# macOS
brew install trivy
# Ubuntu/Debian
sudo apt-get install trivy
# Docker
docker pull aquasec/trivy
# Arch Linux
yay -S trivy
En contenedores Docker, la forma más rápida de ejecutar Trivy es sin instalarlo:
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
aquasec/trivy image nginx:latest
Esto monta el socket de Docker para que Trivy pueda acceder directamente a las imágenes locales sin necesidad de pull ni push a un registry.
Escaneo básico
# Escanear una imagen Docker
trivy image nginx:latest
# Filtrar por severidad
trivy image --severity HIGH,CRITICAL nginx:latest
# Ignorar vulnerabilidades sin fix
trivy image --ignore-unfixed nginx:latest
# Escaneo rápido (solo paquetes OS, sin librerías)
trivy image --scanners vuln --security-checks vuln nginx:latest
El flag --ignore-unfixed es particularmente útil en producción: filtra las vulnerabilidades para las cuales el vendor no ha publicado un parche, permitiéndote enfocar tus esfuerzos remediales en lo que realmente se puede corregir.
Escaneo de repositorios
# Escanear código fuente
trivy fs --security-checks vuln,secret,config .
# Detectar secrets (API keys, tokens, credenciales)
trivy fs --security-checks secret .
# Generar SBOM
trivy image --format cyclonedx --output sbom.json nginx:latest
# Escanear dependencias lockfiles
trivy fs --scanners vuln ./src
El escaneo de secrets es especialmente valioso en pipelines de CI/CD: detecta tokens de API, credenciales de base de datos y claves privadas que los desarrolladores puedan haber commiteado accidentalmente al repositorio.
Integración con CI/CD
GitHub Actions
name: Trivy Security Scan
on: [push, pull_request]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run Trivy
uses: aquasecurity/trivy-action@master
with:
image-ref: 'mi-app:latest'
severity: 'CRITICAL,HIGH'
exit-code: '1' # Falla el pipeline si hay CRITICAL
format: 'table'
output: 'trivy-results.txt'
- name: Upload results
if: always()
uses: actions/upload-artifact@v4
with:
name: trivy-results
path: trivy-results.txt
GitLab CI
trivy-scan:
stage: test
image: aquasec/trivy
script:
- trivy image --exit-code 1 --severity CRITICAL,HIGH $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
allow_failure: false
Pipeline completo con SBOM
security-scan:
stage: security
script:
- trivy image --format cyclonedx --output sbom.json $IMAGE
- trivy image --exit-code 1 --severity CRITICAL $IMAGE
- trivy fs --format json --output fs-report.json .
artifacts:
reports:
dependency_scanning: fs-report.json
SBOM: Software Bill of Materials
Un SBOM es un inventario completo de todos los componentes de software en una aplicación. Es requerido por regulaciones como el Executive Order 14028 y el EU Cyber Resilience Act.
# Generar SBOM en formato CycloneDX
trivy image --format cyclonedx --output sbom.json mi-app:latest
# Generar SBOM en formato SPDX
trivy image --format spdx --output sbom.spdx mi-app:latest
# SBOM con vulnerabilidades incluidas
trivy image --format cyclonedx-json --output sbom-vulns.json mi-app:latest
El SBOM es fundamental para la gestión de vulnerabilidades en producción: cuando se publica un nuevo CVE, puedes consultar tu SBOM para saber instantáneamente qué aplicaciones están afectadas y en qué versión exacta de la librería vulnerable.
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
# Escanear clúster de Kubernetes
trivy k8s --report summary cluster
# Escanear namespace específico
trivy k8s --report all -n production namespace
El escaneo continuo en producción es una práctica recomendada: las vulnerabilidades pueden aparecer después del despliegue inicial cuando se publican nuevos CVEs. Configurar un CronJob en Kubernetes que ejecute Trivy diariamente permite detectar estas amenazas emergentes antes de que sean explotadas.
Personalización con .trivyignore
# Ignorar CVEs específicos con justificación
cat > .trivyignore << 'EOF'
# CVE-2024-12345: Falso positivo, función no se usa en nuestro contexto
CVE-2024-12345
# CVE-2024-67890: Riesgo aceptado por el equipo de seguridad, mitigación compensatoria implementada
CVE-2024-67890
EOF
trivy image --ignorefile .trivyignore mi-app:latest
Es importante documentar en el archivo .trivyignore por qué se ignora cada CVE: cuando un auditor revise el pipeline de seguridad, necesitará ver que cada excepción fue evaluada y aprobada por alguien con autoridad, no simplemente omitida.
Errores comunes y cómo evitarlos
Falsos positivos: Trivy a veces reporta vulnerabilidades que no son explotables en tu contexto de uso. Revisa cada CVE individualmente antes de ignorarlo. Usa --ignore-unfixed para filtrar vulnerabilidades sin parche disponible.
Escaneo incompleto: No escanear los layers intermedios de una imagen multi-stage puede ocultar vulnerabilidades. Usa --image-src docker para asegurar que todos los layers sean analizados.
Imágenes slim: Las imágenes como alpine o distroless tienen una superficie de ataque mucho menor que ubuntu o debian completas. Siempre usa la imagen base más pequeña posible para tu aplicación.
Conclusión
Trivy hace que la seguridad de contenedores sea simple. Un solo comando, múltiples tipos de escaneo, integración nativa con CI/CD. Si todavía no lo tienes en tu pipeline, es hora de agregarlo.
La clave es automatizar: configura Trivy en tu pipeline para que cada build sea escaneada automáticamente, establece umbrales de severidad que bloqueen el despliegue, y mantén un registro de las excepciones con justificación documentada.
Herramientas relacionadas: OPNsense (firewall), Wireshark (análisis de red)
Artículos relacionados: