
Escáner de seguridad de Docker impulsado por IA que explica las vulnerabilidades en un lenguaje sencillo. Un proyecto de laboratorio de OWASP.

Escáner de seguridad de Docker impulsado por IA que explica las vulnerabilidades en lenguaje sencillo
DockSec es un Proyecto de Laboratorio de OWASP que cierra la brecha entre los resultados complejos de los escaneos de seguridad y las correcciones prácticas para los desarrolladores. Integra escáneres estándar de la industria (Trivy, Hadolint, Docker Scout) con IA para proporcionar análisis de seguridad contextual.
En lugar de abrumarte con una lista de más de 200 CVEs, DockSec:
Todo se escanea localmente; lo único que sale de tu máquina es el contenido del archivo (con los secretos redactados) que se envía al proveedor de IA que elijas, y con un modelo local o el modo de solo escaneo, no sale nada en absoluto. Consulta Flujo de datos y privacidad.
Flujo de trabajo de DockSec: del escaneo a información práctica
DockSec sigue un proceso de cuatro etapas:
DockSec orquesta escáneres locales, por lo que necesita:
| Requisito | Necesario para | Instalación |
|---|---|---|
| Python 3.12+ | El propio DockSec | python.org |
| Trivy | Todos los escaneos (obligatorio) | brew install trivy o documentación de Trivy |
| Hadolint | Linting de Dockerfile | brew install hadolint o documentación de Hadolint |
| Docker | Escaneos de imágenes (-i) | documentación de Docker |
O deja que DockSec instale Trivy y Hadolint por ti:```bash python -m docksec.setup_external_tools
### 2. Instalar DockSec```bash
# Full install with AI analysis support (recommended)
pip install "docksec[ai]"
# Or the slim, scan-only core (no LLM dependencies, no API key needed)
pip install docksec
No se necesita clave API para el escaneo local:```bash docksec Dockerfile --scan-only
Cada escaneo termina con un resumen de resultados: una tabla de severidad, una puntuación de seguridad de 0 a 100 con su
calificación, un bloque de acción "Quick take", los informes generados (guardados en
`~/.docksec/results/` por defecto) y un comando siguiente sugerido.
### 4. Habilitar el análisis con IA
El análisis con IA explica los hallazgos y sugiere correcciones. Elige un proveedor, configura su clave de API y ejecuta:```bash
# OpenAI (default provider)
export OPENAI_API_KEY="sk-..."
docksec Dockerfile
# Anthropic Claude
export ANTHROPIC_API_KEY="sk-ant-..."
docksec Dockerfile --ai-only --provider anthropic --model claude-sonnet-5
# Google Gemini
export GOOGLE_API_KEY="..."
docksec Dockerfile --ai-only --provider google
# Ollama (fully local, no API key, data never leaves your machine)
docksec Dockerfile --ai-only --provider ollama --model llama3.1
Cada proveedor tiene un modelo predeterminado sensato (OpenAI: gpt-4o, Anthropic:
claude-haiku-4-5, Google: gemini-1.5-pro, Ollama: llama3.1), por lo que --model es
opcional. Para evitar repetir banderas, establece variables de entorno (o colócalas en un archivo .env
en el directorio desde el que ejecutas; DockSec lo carga automáticamente):```bash
export LLM_PROVIDER=anthropic
export LLM_MODEL=claude-sonnet-5
docksec Dockerfile
Antes de que cualquier contenido se envíe a un proveedor de IA, los valores que parecen secretos (contraseñas, tokens,
claves de API, bloques de claves privadas) se enmascaran automáticamente. Consulta
[Flujo de datos y privacidad](#data-flow-and-privacy).
### 5. O usa la GitHub Action```yaml
- name: Run DockSec AI Scanner
uses: OWASP/[email protected]
with:
dockerfile: 'Dockerfile'
openai_api_key: ${{ secrets.OPENAI_API_KEY }}
docksec Dockerfile -i myapp:latest
docksec --compose docker-compose.yml
docksec --image-only -i myapp:latest
docksec Dockerfile --scan-only
docksec -i myapp:latest --image-only --severity CRITICAL,HIGH,MEDIUM
docksec -i myapp:latest --image-only --fail-on high
docksec Dockerfile --scan-only --format json,html --output-dir ./reports
docksec -i myapp:latest --image-only --json
docksec Dockerfile --scan-only --sarif
docksec --image-only -i myapp:latest --sbom
docksec --image-only -i myapp:latest --offline
docksec -i myapp:latest --image-only --baseline .docksec-baseline.json --update-baseline docksec -i myapp:latest --image-only --baseline .docksec-baseline.json --fail-on high
docksec -i myapp:latest --image-only --ignore-file .docksec-ignore.yml
docksec -i myapp:latest --image-only --no-cache
docksec install-skill
docksec Dockerfile --scan-only --quiet # warnings, errors, summary only docksec Dockerfile --scan-only --verbose # INFO-level diagnostics on stderr docksec Dockerfile --scan-only --verbose --log-file logs/docksec.log docksec Dockerfile --no-color # also honors NO_COLOR
---
## Archivo de configuración
Haz commit de un `.docksec.yml` en la raíz de tu repositorio y todo el equipo — y
cada trabajo de CI — escaneará bajo la misma política, en lugar de que cada desarrollador pase
sus propias banderas.```yaml
# yaml-language-server: $schema=https://owasp.org/DockSec/docksec-config-schema.json
severity: CRITICAL,HIGH
fail_on: HIGH
formats: [json, html]
output_dir: ./security-reports
rules:
disabled:
- compose-missing-healthcheck
Cada ajuste es opcional; cualquier cosa que omitas recurre a la variable de entorno y luego al valor predeterminado integrado. Un ejemplo completo anotado está en examples/.docksec.yml.
Mayor prioridad primero:``` CLI flag > environment variable > .docksec.yml > built-in default
Así que un `severity: LOW` confirmado sigue siendo anulado por `--severity CRITICAL` en
la línea de comandos, y por `DOCKSEC_DEFAULT_SEVERITY` en el entorno.
### Descubrimiento
DockSec busca `.docksec.yml` (o `.docksec.yaml`) en el directorio de trabajo
y luego sube hasta la raíz del repositorio, por lo que un servicio en un
subdirectorio de un monorepo hereda la política confirmada en el nivel superior. La búsqueda se detiene en
el directorio que contiene `.git`, por lo que nunca toma un archivo de fuera del
repositorio.
- `--config FILE` usa un archivo específico en lugar de buscar.
- `--no-config` ignora cualquier archivo de configuración, para ejecuciones de CI reproducibles.
El archivo de configuración en vigor se muestra en el banner de escaneo, por lo que siempre queda claro
qué política se aplicó.
### Configuración
| Configuración | Indicador equivalente | Notas |
| --- | --- | --- |
| `severity` | `--severity` | Niveles de severidad para el escaneo de imágenes |
| `fail_on` | `--fail-on` | Umbral de puerta de CI |
| `formats` | `--format` | Forma de lista: `[json, html]` |
| `output_dir` | `--output-dir` | Destino del informe |
| `provider` | `--provider` | `openai`, `anthropic`, `google`, `ollama` |
| `model` | `--model` | Nombre del modelo para el proveedor |
| `offline` | `--offline` | Sin red; omite IA y Docker Scout |
| `skip_ai_scoring` | `--skip-ai-scoring` | Solo puntuación local |
| `no_redact` | `--no-redact` | No enmascarar secretos antes de la llamada de IA |
| `no_cache` | `--no-cache` | Omitir la caché de escaneo |
| `ignore_file` | `--ignore-file` | Ruta del archivo de exención |
| `baseline` | `--baseline` | Ruta del archivo de línea base |
| `rules.disabled` | - | IDs de reglas para desactivar por completo |
Un archivo de configuración no válido (una clave desconocida, una severidad incorrecta) es un error grave que
sale con `2` en lugar de una advertencia, por lo que un archivo de política roto nunca puede hacer que un escaneo
se ejecute bajo reglas que el equipo no confirmó.
### Autocompletado del editor
El comentario `# yaml-language-server:` en la primera línea proporciona autocompletado y
validación en línea en los editores VS Code y JetBrains. El esquema se publica en
[`docs/docksec-config-schema.json`](https://github.com/owasp/docksec/blob/main/docs/docksec-config-schema.json) y se puede
regenerar con `docksec --print-config-schema`.
### Desactivación de reglas
`rules.disabled` desactiva una comprobación por completo, en todas partes: se elimina
antes de la puntuación, los informes, `--json` y la puerta `--fail-on`. Úsalo para comprobaciones
que no se aplican a tu entorno. Para hallazgos individuales que tu equipo ha
triado y aceptado, prefiere el [archivo de exención](#ignoring-findings-waivers),
cuyas entradas llevan una razón y una fecha de caducidad y, por lo tanto, siguen siendo auditables.
---
## Integración CI/CD
### Códigos de salida
DockSec usa códigos de salida compatibles con CI para que las compilaciones y los shells puedan reaccionar a los resultados:
| Código | Significado |
|---|---|
| `0` | Éxito, sin hallazgos en o por encima de `--fail-on` |
| `1` | Hallazgos en o por encima del umbral `--fail-on` |
| `2` | Error de uso o de argumento |
| `3` | Error de herramienta o de tiempo de ejecución (escaneo fallido, imagen no encontrada, herramientas faltantes) |
`--fail-on` actúa como puerta sobre los hallazgos estructurados (vulnerabilidades de imagen y
configuraciones incorrectas de compose). Cuando `--fail-on` está por debajo de la `--severity` solicitada, la severidad del escaneo
se amplía automáticamente para que la puerta pueda observar esos hallazgos.
### Salida legible por máquina
`--json` imprime un único objeto JSON en stdout (información del escaneo, vulnerabilidades, recuentos
de severidad y cualquier hallazgo de IA) en lugar del resumen legible por humanos, por lo que se puede canalizar
directamente a otras herramientas:```bash
docksec -i myapp:latest --image-only --json | jq '.severity_counts'
Con --json solo, no se escriben archivos de informe; combínalo con --format para escribir
archivos e imprimir JSON en la misma ejecución. Todos los mensajes legibles para humanos se mueven a stderr en
el modo --json, por lo que stdout solo contiene la carga útil JSON.
--sarif escribe un informe SARIF 2.1.0 junto con los otros formatos de informe. Súbelo
con la acción estándar github/codeql-action/upload-sarif para ver los hallazgos anotados
directamente en las pull requests y en la pestaña Security:```yaml
name: Run DockSec uses: OWASP/[email protected] with: dockerfile: 'Dockerfile' sarif: 'true'
name: Upload SARIF to GitHub Code Scanning uses: github/codeql-action/upload-sarif@v3 if: always() with: sarif_file: ~/.docksec/results
> `if: always()` es importante: sin él, el paso de subida se omite cada vez que
> `--fail-on` hace que DockSec salga con un código distinto de cero, perdiendo los hallazgos precisamente cuando
> más importan.
### Modo de línea base / trinquete
`--baseline FILE` te permite adoptar `--fail-on` en un proyecto existente sin un muro de
hallazgos preexistentes que bloqueen cada compilación. Ejecútalo una vez con `--update-baseline` para capturar una instantánea de
los hallazgos de hoy, y luego confirma el archivo de línea base; a partir de entonces, `--fail-on` solo se activa con
hallazgos que no estén ya en la línea base:```bash
# Snapshot current findings (does not gate)
docksec -i myapp:latest --image-only --baseline .docksec-baseline.json --update-baseline
# Later runs only fail on NEW findings above the threshold
docksec -i myapp:latest --image-only --baseline .docksec-baseline.json --fail-on high
Los hallazgos se comparan por ID de vulnerabilidad, objetivo y nombre de paquete, por lo que la línea base sigue siendo válida a medida que aparecen y desaparecen hallazgos no relacionados. Vuelve a ejecutar con --update-baseline siempre que quieras aceptar el estado actual como la nueva línea base.
--ignore-file FILE suprime hallazgos individuales que un equipo ha clasificado y aceptado. A diferencia de la línea base (una instantánea en un momento dado), el archivo de ignorados es una lista explícita y revisable donde cada entrada incluye un motivo y una fecha de caducidad opcional. Si existe un archivo .docksec-ignore.yml en el directorio actual, se recoge automáticamente.```yaml
ignores:
Los hallazgos suprimidos se eliminan antes de la puntuación, los informes, la salida `--json` y la puerta `--fail-on`. Las entradas caducadas dejan de aplicarse automáticamente (con una advertencia), y las entradas sin motivo se marcan para que las exenciones sigan siendo auditables. Confirma el archivo en el control de versiones para que las supresiones se revisen como cualquier otro cambio.
---
## Informes
### Formatos de informe
De forma predeterminada, cada escaneo escribe cuatro archivos de informe; usa `--format` para elegir un subconjunto:
- **html**: Un informe web interactivo y visualmente limpio: tarjetas de severidad, calificación de puntuación, tabla completa de vulnerabilidades con versiones corregidas y los hallazgos completos de IA.
- **pdf**: Un documento portátil y listo para presentar.
- **json**: Datos de escaneo completos y legibles por máquina (misma forma que la salida estándar de `--json`).
- **csv**: Una tabla de vulnerabilidades individuales lista para hojas de cálculo.
> Nota sobre el comportamiento de CSV: con cero vulnerabilidades, DockSec aún escribe un CSV solo con encabezados (nombres de columnas, sin filas) para que la automatización posterior nunca falle por un archivo faltante o vacío. Esto es intencional.
### SBOM CycloneDX
`--sbom` escribe una lista de materiales de software CycloneDX (`<image>.cdx.json`) de la
imagen escaneada, enumerando cada componente de paquete más las vulnerabilidades conocidas. La BOM es
producida por el exportador nativo de Trivy (por lo que cumple con la especificación) y DockSec se sella a sí mismo
en los metadatos de la herramienta. Aliméntala en Dependency-Track, el gráfico de dependencias de GitHub o cualquier
otro consumidor de SBOM:```bash
docksec --image-only -i myapp:latest --sbom
--sbom necesita una única imagen (-i), por lo que se omite en las ejecuciones de compose. Al igual que --sarif,
es independiente de --format.
DockSec está diseñado para que siempre sepas qué sale de tu máquina:
--no-redact para optar por no hacerlo.--provider ollama para mantener el análisis de IA en tu
propio hardware, o --scan-only / --offline para omitir la IA por completo.--offline ejecuta un escaneo sin acceso a la red. Usa la base de datos de vulnerabilidades de Trivy
ya presente en el disco (sin actualización de la base de datos) y omite el análisis de IA y el escaneo avanzado
de Docker Scout, ambos requieren red. Esta es la forma más sencilla de escanear en un entorno aislado o
restringido:```bash
docksec --image-only -i myapp:latest --offline
Asegúrate de que la base de datos de Trivy se haya descargado al menos una vez (cualquier escaneo en línea previo lo hace) antes de confiar en `--offline`.
### Caché de resultados de escaneo
Los resultados de escaneo de imágenes se almacenan en caché (por defecto: 24 horas, se puede sobrescribir con `DOCKSEC_CACHE_TTL_HOURS`) y se indexan por el digest de contenido de la imagen, por lo que una etiqueta reconstruida como un `:latest` reutilizado siempre recibe un escaneo nuevo. Usa `--no-cache` (o `DOCKSEC_USE_CACHE=false`) para omitir la caché en una ejecución.
---
## Habilidades para asistentes de IA (`install-skill`)
`docksec install-skill` escribe las instrucciones de uso de DockSec en los archivos de contexto conocidos para los asistentes de codificación de IA populares, de modo que un asistente que trabaje en tu repositorio sepa cómo invocar DockSec:```bash
docksec install-skill
Esto crea o actualiza:
.claude/commands/docksec.md (comando de barra /docksec de Claude Code).cursor/rules/docksec.mdc (Cursor)AGENTS.md (Codex CLI), GEMINI.md (Gemini CLI).github/copilot-instructions.md (GitHub Copilot)Los archivos son texto plano que puedes revisar y confirmar; no se ejecuta nada. Volver a ejecutar el comando actualiza la sección de DockSec en su lugar en lugar de duplicarla.
--fail-on, modo de línea base/trinquete, exenciones auditables, JSON a stdout y una GitHub Action en el Marketplace.--offline) usando la base de datos local de Trivy.docksec install-skill enseña a Claude Code, Cursor, Copilot y otros cómo ejecutar DockSec en tu repositorio.| Capacidad | DockSec | Trivy (independiente) | Snyk Container | Aikido |
|---|---|---|---|---|
| Licencia y costo | Gratuito, código abierto (MIT) | Gratuito, código abierto (Apache 2.0) | Comercial (nivel gratuito limitado) | Comercial (nivel gratuito limitado) |
| Gobernanza | Proyecto de laboratorio OWASP, neutral respecto al proveedor | Código abierto, mantenido por Aqua | Proveedor único | Proveedor único |
| Detecta CVEs y configuraciones incorrectas de Dockerfile | Sí | Sí | Sí | Sí |
| Explica los hallazgos en lenguaje sencillo | Sí (contexto e impacto escritos por IA) | No (datos CVE sin procesar) | Parcial (gravedad y sugerencias de corrección) | Parcial (resúmenes de IA en la plataforma) |
| Corrección contextual de Dockerfile | Sí (reescrituras específicas con explicación) | No (solo detección) | Sí (consejos de actualización de imagen base, PRs de corrección) | Sí (PRs de corrección automática con IA) |
| Escaneo de Docker Compose (multi-servicio) | Sí (comprobaciones de orquestación y escaneo por servicio) | Parcial (escaneo de configuración, sin expansión por servicio) | Parcial | Parcial |
| Modo de línea base / trinquete (falla solo con hallazgos nuevos) | Sí | No | Parcial (políticas de plataforma) | Parcial (políticas de plataforma) |
| Exenciones auditables por hallazgo con motivos y caducidad | Sí | Parcial (.trivyignore, sin motivos obligatorios) | Parcial (políticas de plataforma) | Parcial (políticas de plataforma) |
| Salida nativa para CI (SARIF para GitHub Code Scanning) | Sí | Sí | Sí | Sí |
| Exportación de SBOM (CycloneDX) | Sí (--sbom) | Sí | Sí | Sí |
| Instalación de habilidades para asistentes de IA (Claude Code, Cursor, Copilot) | Sí (install-skill) | No | No | No |
| Funciona totalmente sin conexión / aislado | Sí (LLM local mediante Ollama, modo solo escaneo, sin clave API) | Solo escaneo (sin capa de corrección) | No (plataforma en la nube) | No (plataforma alojada) |
| Los datos de tu imagen permanecen en tu red | Sí |
DockSec es el único de estos que combina la corrección contextual de Dockerfile con un diseño totalmente de código abierto, gobernado por OWASP y ejecutable localmente. Snyk y Aikido ofrecen corrección con IA capaz, pero solo como plataformas comerciales en la nube que envían tus datos a su servicio. Trivy es de código abierto y local, pero se detiene en la detección y no te ayuda a corregir nada. DockSec llena ese vacío para desarrolladores y para equipos regulados o aislados que necesitan tanto la guía de corrección como el control total de sus datos, sin costo alguno.
Consulta ROADMAP.md para ver hacia dónde se dirige DockSec: escaneo de registros sin un demonio Docker local, un archivo de configuración de políticas a nivel de repositorio, plantillas para Jenkins/GitLab/Azure DevOps, una imagen de contenedor oficial, escaneo de Kubernetes y Helm, y más. Los comentarios y votos sobre prioridades son bienvenidos en issues y en OWASP Slack.
DockSec prospera gracias a las contribuciones de la comunidad. Ya seas desarrollador, diseñador o entusiasta de la seguridad, hay muchas formas de participar:
Para empezar, consulta nuestras Guías de contribución, Código de conducta y Guía de patrocinio.
DockSec está liderado por un equipo dedicado comprometido con hacer accesible la seguridad de contenedores:
Encuéntranos aquí:
| Sí |
| No |
| No |
| Trae tu propio LLM / elección de modelo | Sí (OpenAI, Anthropic, Gemini u Ollama local) | No aplicable | No (IA propietaria) | No (IA propietaria) |
| Autoalojable, sin despliegue de plataforma | Sí | Sí | No | No |
| Bloqueo de proveedor | Ninguno | Ninguno | Sí | Sí |
| Puntuación de seguridad (0-100) e informes multi-formato | Sí | Parcial (formatos de máquina, sin informe de corrección) | Parcial (informes de panel) | Parcial (informes de panel) |