Saltar al contenido principal

Seguridad en el pipeline de CI/CD

Su pipeline de CI/CD es la última línea de defensa antes de que el código llegue a producción. Cada commit, cada pull request, cada despliegue pasa por él. Eso lo convierte en el lugar ideal para detectar problemas de seguridad: vulnerabilidades en su código, dependencias peligrosas, configuraciones incorrectas, secretos filtrados.

El objetivo no es bloquear cada build con advertencias de seguridad. Es detectar los problemas críticos de forma automática, dar retroalimentación rápida a los desarrolladores y evitar que los problemas evidentes lleguen a producción. Un pipeline bien configurado detecta inyecciones SQL antes de la revisión de código, señala dependencias vulnerables antes del merge y bloquea patrones conocidos como peligrosos antes de que lleguen a producción.

Este capítulo cubre los cinco tipos de análisis de seguridad que necesita en CI/CD: análisis estático (SAST), análisis de dependencias (SCA), lista de materiales de software (SBOM), análisis de infraestructura como código (IaC) y pruebas dinámicas (DAST). Todo usando herramientas gratuitas compatibles con GitHub y GitLab.

Por qué esto importa para las empresas pequeñas

El análisis de seguridad parece una carga propia de grandes empresas. No lo es. Para equipos pequeños, el análisis automatizado es aún más valioso: no tiene revisores de seguridad dedicados, así que el pipeline tiene que hacer ese trabajo.

No puede revisar todo manualmente. Un equipo de cinco desarrolladores puede producir decenas de commits al día. Nadie tiene tiempo de revisar cada cambio desde el punto de vista de seguridad. Los escáneres automatizados detectan los problemas evidentes para que los humanos puedan concentrarse en la arquitectura y la lógica.

Las vulnerabilidades se propagan más rápido en equipos pequeños. No hay comités de cambios, ni aprobaciones en múltiples etapas, ni esperas. El código va del portátil a producción en horas. Esa velocidad es una ventaja, pero también significa que las vulnerabilidades se mueven rápido. El análisis en CI/CD es su red de seguridad.

El riesgo de las dependencias es real. Su aplicación puede tener 10.000 líneas de código que usted escribió y 500.000 líneas de dependencias de código abierto que no. Un paquete vulnerable en esa pila puede comprometer todo. El informe de Snyk 2024 encontró que el 80% de las aplicaciones contienen al menos una vulnerabilidad conocida en sus dependencias.

Las herramientas gratuitas están listas para producción. Semgrep, Trivy, Dependabot, npm audit — estos no son proyectos de juguete. Los usan miles de empresas y detectan vulnerabilidades reales. No necesita una plataforma de seguridad de 50.000 dólares para analizar su código.

Lo que buscan los atacantes

Cuando los atacantes apuntan a una aplicación, suelen comenzar por lo más fácil:

  1. CVEs conocidos en dependencias — existen exploits públicos, solo hay que encontrar un objetivo que use la versión vulnerable
  2. Secretos expuestos — claves de API, contraseñas de bases de datos, credenciales cloud en el código o en los registros de CI
  3. Vulnerabilidades de inyección — inyección SQL, inyección de comandos, XSS que las herramientas automatizadas detectan de forma fiable
  4. Infraestructura mal configurada — buckets de S3 abiertos, CORS permisivo, cabeceras de seguridad faltantes

El análisis automatizado detecta la mayoría de estos problemas. Los atacantes usan herramientas automatizadas para encontrarlos — usted debe usar herramientas automatizadas para encontrarlos primero.

Tipos de análisis de seguridad

Cinco categorías cubren la mayoría de lo que necesita:

TipoQué haceCuándo se ejecutaEjemplos
SAST (Static Application Security Testing)Analiza el código fuente en busca de vulnerabilidadesCada commit, PRSemgrep, CodeQL, Bandit
SCA (Software Composition Analysis)Detecta dependencias vulnerablesCada buildDependabot, Snyk, Trivy
SBOM (Software Bill of Materials)Inventaría todos los componentes, rastrea licenciasCada lanzamientoSyft, Grype, Dependency-Track
Análisis IaCDetecta configuraciones incorrectas en código de infraestructuraCada commitCheckov, tfsec, KICS
DAST (Dynamic Application Security Testing)Prueba la aplicación en ejecución en busca de vulnerabilidadesDespliegues en stagingOWASP ZAP, Nuclei

Cada tipo detecta problemas diferentes:

  • SAST detecta problemas en el código que usted escribe: inyección SQL, XSS, criptografía insegura
  • SCA detecta problemas en el código que importa: bibliotecas vulnerables, paquetes desactualizados
  • SBOM rastrea qué hay en su software: inventario de componentes, cumplimiento de licencias, correlación de vulnerabilidades
  • IaC detecta problemas en la infraestructura: buckets de S3 abiertos, IAM excesivamente permisivo, almacenamiento sin cifrar
  • DAST detecta problemas en cómo se ejecuta todo: servidores mal configurados, endpoints expuestos, omisiones de autenticación

Necesita los cinco. Son complementarios, no alternativos.

SAST: análisis estático de código

Las herramientas SAST leen su código fuente y buscan patrones que indiquen vulnerabilidades. Sin tiempo de ejecución, sin despliegue — solo análisis de código.

Qué detecta SAST

VulnerabilidadCómo la detecta SAST
Inyección SQLConcatenación de cadenas en consultas SQL
XSSSalida sin sanitizar en plantillas HTML
Inyección de comandosEntrada del usuario en comandos de shell
Path traversalEntrada del usuario en operaciones de archivo
Secretos en el códigoPatrones que coinciden con claves de API, contraseñas
Criptografía inseguraUso de MD5, SHA1 para contraseñas, aleatoriedad débil

Herramienta: Semgrep

Semgrep es la herramienta SAST de referencia para equipos pequeños. Es rápida, tiene buenas reglas por defecto y se integra con todo.

Instalación local:

# macOS
brew install semgrep

# pip
pip install semgrep

Ejecutar un análisis:

# Analizar con reglas por defecto
semgrep --config auto .

# Analizar con reglas OWASP Top 10
semgrep --config "p/owasp-top-ten" .

# Analizar un lenguaje específico
semgrep --config "p/python" .

Integración con GitHub Actions:

name: Security Scan

on:
push:
branches: [main]
pull_request:
branches: [main]

jobs:
semgrep:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Run Semgrep
uses: semgrep/semgrep-action@v1
with:
config: >-
p/security-audit
p/secrets

Integración con GitLab CI:

semgrep:
stage: test
image: semgrep/semgrep
script:
- semgrep ci --config auto
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

Herramienta: CodeQL (solo GitHub)

CodeQL de GitHub es potente pero solo funciona en GitHub. Es gratuito para repositorios públicos e incluido en GitHub Advanced Security para repositorios privados.

Habilitarlo en la configuración del repositorio:

  1. Vaya a Settings → Security → Code security and analysis
  2. Active «Code scanning»
  3. Elija «CodeQL analysis»
  4. Seleccione los lenguajes a analizar

O configúrelo manualmente:

name: CodeQL

on:
push:
branches: [main]
pull_request:
branches: [main]
schedule:
- cron: '0 6 * * 1' # Weekly Monday 6 AM

jobs:
analyze:
runs-on: ubuntu-latest
permissions:
security-events: write

strategy:
matrix:
language: ['javascript', 'python']

steps:
- uses: actions/checkout@v4

- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}

- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3

Herramientas específicas por lenguaje

LenguajeHerramientaInstalaciónEjecución
PythonBanditpip install banditbandit -r src/
JavaScriptESLint + security pluginnpm i eslint-plugin-securityeslint --ext .js src/
Gogosecgo install github.com/securego/gosec/v2/cmd/gosec@latestgosec ./...
RubyBrakemangem install brakemanbrakeman
PHPPsalmcomposer require --dev vimeo/psalm./vendor/bin/psalm

Gestión de hallazgos SAST

No todo hallazgo es una vulnerabilidad real. Las herramientas SAST tienen falsos positivos. Así se gestionan:

Clasificación por gravedad:

GravedadAcciónPlazo
Crítico/AltoBloquear el merge, corregir de inmediatoEl mismo día
MedioCorregir antes del lanzamientoEste sprint
BajoRegistrar, corregir cuando sea convenienteBacklog

Suprimir falsos positivos correctamente:

# Semgrep: ignorar en línea
password = get_from_vault() # nosemgrep: hardcoded-password

# Bandit: ignorar en línea
subprocess.run(cmd, shell=True) # nosec B602

O use un archivo de configuración:

# .semgrep.yml
rules:
- id: my-custom-rule
# ... rule definition

# Ignore specific paths
exclude:
- "tests/*"
- "vendor/*"
- "*.test.js"

No suprima todo. Si está suprimiendo más del 10% de los hallazgos, o su código tiene problemas o está usando el conjunto de reglas incorrecto.

SCA: análisis de dependencias

Sus dependencias son una superficie de ataque. Las herramientas SCA analizan los manifiestos de paquetes (package.json, requirements.txt, go.mod) y señalan los paquetes con vulnerabilidades conocidas.

Qué detecta SCA

  • CVEs conocidos — vulnerabilidades publicadas en versiones específicas de paquetes
  • Problemas de licencias — dependencias GPL en código propietario, conflictos de licencias
  • Paquetes desactualizados — versiones antiguas sin correcciones de seguridad
  • Paquetes maliciosos — typosquatting, maintainers comprometidos

Herramienta: Dependabot (GitHub)

Dependabot está integrado en GitHub. Analiza dependencias, abre PRs para actualizar paquetes vulnerables y mantiene todo al día.

Habilitarlo en el repositorio:

  1. Vaya a Settings → Security → Code security and analysis
  2. Active «Dependabot alerts»
  3. Active «Dependabot security updates»

O configúrelo con un archivo:

# .github/dependabot.yml
version: 2
updates:
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "weekly"
open-pull-requests-limit: 10

- package-ecosystem: "pip"
directory: "/"
schedule:
interval: "weekly"

- package-ecosystem: "docker"
directory: "/"
schedule:
interval: "weekly"

Agrupar actualizaciones para reducir el ruido de PRs:

# .github/dependabot.yml
version: 2
updates:
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "weekly"
groups:
development-dependencies:
dependency-type: "development"
production-dependencies:
dependency-type: "production"
update-types:
- "minor"
- "patch"

Herramienta: Snyk

Snyk funciona con GitHub, GitLab, Bitbucket y de forma independiente. El nivel gratuito cubre pruebas ilimitadas para proyectos de código abierto y análisis limitados para repositorios privados.

Instalar CLI:

npm install -g snyk
snyk auth

Analizar localmente:

# Probar el proyecto actual
snyk test

# Probar y mostrar rutas de remediación
snyk test --show-vulnerable-paths=all

# Monitorizar nuevas vulnerabilidades
snyk monitor

Integración con GitHub Actions:

name: Snyk Security

on:
push:
branches: [main]
pull_request:

jobs:
snyk:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Run Snyk
uses: snyk/actions/node@master
env:
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
with:
args: --severity-threshold=high

Integración con GitLab CI:

snyk:
stage: test
image: snyk/snyk:node
script:
- snyk auth $SNYK_TOKEN
- snyk test --severity-threshold=high
allow_failure: true # Don't block on medium/low

Herramienta: Trivy

Trivy analiza todo: imágenes de contenedor, sistemas de archivos, repositorios git, manifiestos de Kubernetes, Terraform. Es increíblemente versátil.

Instalación:

# macOS
brew install trivy

# Linux
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin

Analizar el sistema de archivos (dependencias):

trivy fs --severity HIGH,CRITICAL .

Analizar una imagen de contenedor:

trivy image --severity HIGH,CRITICAL myapp:latest

GitHub Actions para análisis de contenedores:

name: Container Security

on:
push:
branches: [main]

jobs:
trivy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Build image
run: docker build -t myapp:${{ github.sha }} .

- name: Run Trivy
uses: aquasecurity/trivy-action@master
with:
image-ref: myapp:${{ github.sha }}
severity: 'CRITICAL,HIGH'
exit-code: '1'

Auditorías nativas del gestor de paquetes

La mayoría de los gestores de paquetes tienen análisis de vulnerabilidades integrado:

# npm
npm audit
npm audit fix

# yarn
yarn audit

# pip
pip-audit

# composer
composer audit

# bundler
bundle audit

# go
govulncheck ./...

Agregar al pipeline de CI:

# GitHub Actions - npm audit
- name: Security audit
run: npm audit --audit-level=high

Gestión de vulnerabilidades en dependencias

Cuando una vulnerabilidad tiene solución:

  1. Actualice a la versión corregida
  2. Ejecute las pruebas
  3. Despliegue

Cuando no hay solución disponible:

  1. Compruebe si realmente usa la función vulnerable
  2. Evalúe el riesgo real — ¿es alcanzable la ruta de código vulnerable?
  3. Considere paquetes alternativos
  4. Si el riesgo es aceptable, documéntelo y monitorícelo

Cuando las actualizaciones rompen cosas:

  1. Compruebe si es un cambio incompatible al que puede adaptarse
  2. Fije temporalmente la versión actual
  3. Cree un ticket para corregirlo correctamente
  4. Establezca un plazo — no lo deje indefinidamente

SBOM: Software Bill of Materials

Un SBOM es un inventario completo de todos los componentes de su software — cada biblioteca, framework y dependencia, con versiones y orígenes. Piénselo como la lista de ingredientes de su aplicación.

Por qué importa el SBOM

Velocidad de respuesta ante incidentes. Cuando Log4Shell ocurrió en diciembre de 2021, las organizaciones con SBOMs supieron en pocas horas qué aplicaciones estaban afectadas. Las que no tenían SBOMs tardaron días o semanas en investigar manualmente. La Orden Ejecutiva de Ciberseguridad de EE.UU. 14028 ahora exige SBOMs para el software vendido al gobierno federal.

Visibilidad de la cadena de suministro. Su aplicación depende del paquete A, que depende de B, que depende de C. Una vulnerabilidad en C le afecta a usted, pero puede que no sepa que C existe sin un SBOM. Las dependencias transitivas son invisibles sin las herramientas adecuadas.

Cumplimiento de licencias. Ese paquete con licencia MIT que usa puede depender de una biblioteca GPL. Sin un SBOM, no lo sabrá hasta que el departamento legal llame a la puerta. El análisis de licencias requiere conocer cada componente de su pila.

Requisitos de clientes. Los clientes empresariales exigen cada vez más SBOMs como parte de las evaluaciones de seguridad de proveedores. Los sectores de salud, finanzas y gobierno suelen exigirlos.

Formatos SBOM

Dos formatos principales dominan:

FormatoMantenedorMejor paraEnlace
SPDXLinux FoundationCumplimiento de licencias, adopción ampliaspdx.dev
CycloneDXOWASPEnfoque en seguridad, seguimiento de vulnerabilidadescyclonedx.org

Ambos son legibles por máquina (JSON, XML) e intercambiables para la mayoría de propósitos. CycloneDX tiene mejor correlación de vulnerabilidades; SPDX tiene mayor adopción industrial para el cumplimiento de licencias.

Generación de SBOMs

Herramienta: Syft — el estándar para la generación de SBOMs

# Install
brew install syft
# or
curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin

# Generate SBOM from directory
syft dir:. -o cyclonedx-json > sbom.json

# Generate from container image
syft myapp:latest -o spdx-json > sbom.spdx.json

# Generate from package lock files
syft dir:. -o cyclonedx-json --catalogers javascript

GitHub Actions:

- name: Generate SBOM
uses: anchore/sbom-action@v0
with:
image: myapp:${{ github.sha }}
format: cyclonedx-json
output-file: sbom.json

- name: Upload SBOM
uses: actions/upload-artifact@v4
with:
name: sbom
path: sbom.json

GitLab CI:

generate_sbom:
stage: build
image: anchore/syft
script:
- syft dir:. -o cyclonedx-json > sbom.json
artifacts:
paths:
- sbom.json

Otros generadores de SBOM:

HerramientaTipoMejor paraEnlace
SyftCLIGeneración universalGitHub
TrivyCLIAnálisis combinado + SBOMtrivy.dev
cdxgenCLINativo CycloneDXGitHub
Microsoft SBOM ToolCLI.NET, generalGitHub
SPDX SBOM GeneratorCLINativo SPDXGitHub

Análisis de SBOMs en busca de vulnerabilidades

Una vez que tiene un SBOM, analícelo en busca de vulnerabilidades conocidas:

Herramienta: Grype — escáner de vulnerabilidades que consume SBOMs

# Install
brew install grype

# Scan SBOM for vulnerabilities
grype sbom:sbom.json

# Scan with severity filter
grype sbom:sbom.json --only-fixed --fail-on high

GitHub Actions:

- name: Generate SBOM
uses: anchore/sbom-action@v0
with:
image: myapp:latest
output-file: sbom.json

- name: Scan SBOM for vulnerabilities
uses: anchore/scan-action@v3
with:
sbom: sbom.json
fail-build: true
severity-cutoff: high

Otros escáneres de vulnerabilidades para SBOMs:

HerramientaPrecioCaracterísticasEnlace
GrypeGratuitoRápido, nativo para SBOMGitHub
TrivyGratuitoEscáner universaltrivy.dev
OSV-ScannerGratuitoBase de datos OSV de GoogleGitHub
SnykNivel gratuitoMejor asesoramiento de remediaciónsnyk.io
OWASP Dependency-TrackGratuito (autoalojado)Plataforma completa de gestión de SBOMdependencytrack.org
Anchore EnterpriseDe pagoMotor de políticas, cumplimientoanchore.com
Sonatype Nexus LifecycleDe pagoAnálisis profundo, políticassonatype.com

Análisis de SBOMs para el cumplimiento de licencias

Los problemas de licencias pueden ser tan dañinos como las vulnerabilidades de seguridad: exposición legal, obligación de publicar código propietario como código abierto, o imposibilidad de distribuir a ciertos clientes.

Preocupaciones comunes sobre licencias:

Tipo de licenciaPreocupaciónLicencias de ejemplo
CopyleftPuede requerir publicar su código como código abiertoGPL, AGPL, LGPL
Copyleft débilRequiere atribución, algunas restriccionesMPL, EPL
PermisivaGeneralmente segura para uso comercialMIT, Apache 2.0, BSD
DesconocidaSin licencia = todos los derechos reservadosPaquetes sin licencia

Herramienta: OWASP Dependency-Track — gestión completa de SBOM

Dependency-Track es una plataforma gratuita y autoalojada que ingiere SBOMs y proporciona:

  • Seguimiento de vulnerabilidades en todos los proyectos
  • Análisis de cumplimiento de licencias
  • Aplicación de políticas
  • Seguimiento histórico
# Run with Docker
docker run -d -p 8080:8080 dependencytrack/bundled

Luego cargue los SBOMs mediante la API o la interfaz de usuario.

Herramientas comerciales para el cumplimiento de licencias:

HerramientaPrecioCaracterísticasEnlace
OWASP Dependency-TrackGratuito (autoalojado)Plataforma SBOM completadependencytrack.org
FOSSANivel gratuito, planes de pagoAnálisis profundo de licenciasfossa.com
SnykNivel gratuitoAnálisis de licencias incluidosnyk.io
Mend (WhiteSource)De pagoCumplimiento empresarialmend.io
Black DuckEmpresarialInteligencia profunda sobre licenciassynopsys.com
Sonatype NexusDe pagoPolíticas de licenciassonatype.com
SnykNivel gratuitoSeguridad + licencias unificadassnyk.io

Análisis rápido de licencias con Trivy:

# Scan for licenses
trivy fs --scanners license .

# Check for specific problematic licenses
trivy fs --scanners license --license-full .

GitHub Actions para el cumplimiento de licencias:

- name: License check
uses: fossas/fossa-action@main
with:
api-key: ${{ secrets.FOSSA_API_KEY }}

SBOM en el flujo de CI/CD

Integre la generación y el análisis de SBOM en su pipeline:

# Complete SBOM workflow
name: SBOM Pipeline

on:
push:
branches: [main]
release:
types: [published]

jobs:
sbom:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Build image
run: docker build -t myapp:${{ github.sha }} .

# Generate SBOM
- name: Generate SBOM
uses: anchore/sbom-action@v0
with:
image: myapp:${{ github.sha }}
format: cyclonedx-json
output-file: sbom.json

# Scan for vulnerabilities
- name: Vulnerability scan
uses: anchore/scan-action@v3
with:
sbom: sbom.json
fail-build: true
severity-cutoff: high

# Check licenses
- name: License scan
run: |
trivy fs --scanners license --severity HIGH,CRITICAL . \
--exit-code 1

# Store SBOM with release
- name: Upload SBOM to release
if: github.event_name == 'release'
uses: softprops/action-gh-release@v1
with:
files: sbom.json

Mejores prácticas para SBOM

  1. Genere con cada build. Los SBOMs deben ser artefactos versionados junto con sus lanzamientos.

  2. Almacene los SBOMs con los lanzamientos. Adjúntelos a los releases de GitHub, guárdelos en el registro de artefactos o envíelos a Dependency-Track.

  3. Automatice el análisis de vulnerabilidades. No solo genere — analice. Configure alertas para nuevos CVEs que afecten a sus componentes.

  4. Defina políticas de licencias. Decida qué licencias son aceptables para su caso de uso. Bloquee los builds que introduzcan licencias problemáticas.

  5. Comparta con los clientes. Si los clientes requieren SBOMs, automatice la entrega. No lo convierta en un proceso manual.

  6. Monitorice continuamente. Se descubren nuevas vulnerabilidades cada día. Analice los SBOMs almacenados contra bases de datos de vulnerabilidades actualizadas.

DAST: pruebas dinámicas

Las herramientas DAST prueban las aplicaciones en ejecución enviando solicitudes y analizando respuestas. Detectan problemas que el análisis estático no puede ver: configuraciones incorrectas en tiempo de ejecución, omisiones de autenticación, problemas en las cabeceras de respuesta.

Qué detecta DAST

ProblemaCómo lo detecta DAST
Cabeceras de seguridad faltantesComprueba las cabeceras de respuesta
XSSInyecta payloads, comprueba si se reflejan
Inyección SQLInyecta SQL, comprueba errores/cambios de comportamiento
Omisión de autenticaciónPrueba el acceso sin credenciales válidas
Configuración CORS incorrectaPrueba solicitudes de origen cruzado
Problemas SSL/TLSPrueba el certificado, versiones de protocolo

Herramienta: OWASP ZAP

ZAP (Zed Attack Proxy) es la herramienta DAST de código abierto estándar. Puede ejecutar análisis automatizados o usarse como proxy de interceptación para pruebas manuales.

Análisis en CI basado en Docker:

# GitHub Actions
name: DAST Scan

on:
push:
branches: [main]

jobs:
zap:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Start application
run: |
docker compose up -d
sleep 30 # Wait for app to start

- name: ZAP Baseline Scan
uses: zaproxy/action-[email protected]
with:
target: 'http://localhost:3000'
rules_file_name: '.zap/rules.tsv'
allow_issue_writing: false

Integración con GitLab CI:

dast:
stage: test
image: ghcr.io/zaproxy/zaproxy:stable
script:
- mkdir -p /zap/wrk
- zap-baseline.py -t $STAGING_URL -r report.html -I
artifacts:
paths:
- report.html
only:
- main

Análisis básico vs. análisis completo:

Tipo de análisisDuraciónCoberturaCaso de uso
Básico1-5 minutosComprobaciones pasivas, sin ataquesCada despliegue
Completo30-60+ minutosAtaques activos, exhaustivoSemanal, antes de un lanzamiento

Herramienta: Nuclei

Nuclei es rápido, basado en plantillas y excelente para comprobaciones de vulnerabilidades específicas.

Instalación:

# macOS/Linux
brew install nuclei

# or
go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest

Ejecutar análisis:

# Default templates
nuclei -u https://staging.example.com

# Specific severity
nuclei -u https://staging.example.com -severity high,critical

# Specific templates
nuclei -u https://staging.example.com -t cves/ -t misconfigurations/

Integración en CI:

nuclei:
stage: test
image: projectdiscovery/nuclei
script:
- nuclei -u $STAGING_URL -severity high,critical -o results.txt
artifacts:
paths:
- results.txt

Cuándo ejecutar DAST

DAST necesita una aplicación en ejecución, lo que complica la integración con CI/CD:

Opción 1: probar staging después del despliegue

deploy_staging:
stage: deploy
script:
- ./deploy-staging.sh

dast_scan:
stage: test
needs: [deploy_staging]
script:
- zap-baseline.py -t $STAGING_URL

Opción 2: crear un entorno efímero

dast:
stage: test
services:
- docker:dind
script:
- docker compose up -d
- sleep 30
- nuclei -u http://docker:3000 -severity critical
- docker compose down

Opción 3: análisis programados (no en el pipeline de PR)

# Run weekly, not on every commit
dast_weekly:
stage: security
script:
- zap-full-scan.py -t $PRODUCTION_URL -r report.html
only:
- schedules

Análisis IaC: infraestructura como código

Si usa Terraform, CloudFormation o manifiestos de Kubernetes, necesita análisis IaC. Las configuraciones incorrectas en el código de infraestructura son tan peligrosas como las vulnerabilidades de aplicaciones — buckets de S3 abiertos, roles IAM excesivamente permisivos, bases de datos sin cifrar.

Qué detecta el análisis IaC

ProblemaEjemplo
Buckets S3 públicosacl = "public-read"
IAM excesivamente permisivoAction: "*", Resource: "*"
Almacenamiento sin cifrarencrypted = true ausente
Grupos de seguridad abiertosIngress 0.0.0.0/0
Registro faltanteCloudTrail, VPC flow logs deshabilitados
Secretos en el códigoClaves de API en variables de Terraform

Herramienta: Checkov

Checkov es el escáner IaC gratuito más completo. Soporta Terraform, CloudFormation, Kubernetes, Helm, ARM y más.

Instalación:

pip install checkov

Análisis local:

# Scan Terraform directory
checkov -d terraform/

# Scan specific file
checkov -f main.tf

# Output as JSON for CI
checkov -d terraform/ -o json

GitHub Actions:

- name: Checkov
uses: bridgecrewio/checkov-action@master
with:
directory: terraform/
soft_fail: false
skip_check: CKV_AWS_18,CKV_AWS_21 # Skip specific checks if needed

GitLab CI:

checkov:
stage: test
image: bridgecrew/checkov
script:
- checkov -d terraform/ --output cli --output junitxml --output-file-path console,results.xml
artifacts:
reports:
junit: results.xml

Herramienta: tfsec (específica para Terraform)

Si solo usa Terraform, tfsec es más rápido y está enfocado en Terraform.

Instalación:

brew install tfsec

Análisis:

tfsec terraform/
tfsec terraform/ --severity-override=HIGH,CRITICAL

GitHub Actions:

- name: tfsec
uses: aquasecurity/tfsec-[email protected]
with:
working_directory: terraform/

Gestión de hallazgos IaC

Los hallazgos IaC a menudo requieren contexto. Un «bucket S3 público» puede ser intencional (alojar un sitio web estático) o un problema crítico (almacenar datos de clientes).

Suprimir configuraciones intencionales:

# tfsec:ignore:aws-s3-no-public-access
resource "aws_s3_bucket" "website" {
# This bucket intentionally hosts public website
bucket = "company-website-assets"
}
# Checkov skip
resource "aws_s3_bucket" "website" {
#checkov:skip=CKV_AWS_18:This bucket hosts public website
bucket = "company-website-assets"
}

Integrando todo

Una configuración completa de análisis de seguridad para una aplicación web típica:

Ejemplo con GitHub Actions

name: Security Pipeline

on:
push:
branches: [main]
pull_request:
branches: [main]

jobs:
# SAST - runs on every commit
sast:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Semgrep
uses: semgrep/semgrep-action@v1
with:
config: p/security-audit p/secrets

# SCA - runs on every commit
sca:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '20'

- name: Install dependencies
run: npm ci

- name: npm audit
run: npm audit --audit-level=high

- name: Snyk test
uses: snyk/actions/node@master
env:
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
with:
args: --severity-threshold=high
continue-on-error: true # Alert but don't block

# Container scanning - if building images
container:
runs-on: ubuntu-latest
if: github.event_name == 'push'
steps:
- uses: actions/checkout@v4

- name: Build image
run: docker build -t app:${{ github.sha }} .

- name: Trivy scan
uses: aquasecurity/trivy-action@master
with:
image-ref: app:${{ github.sha }}
severity: 'CRITICAL,HIGH'
exit-code: '1'

# DAST - only on main branch after deploy
dast:
runs-on: ubuntu-latest
needs: [sast, sca]
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4

- name: Deploy to staging
run: ./deploy-staging.sh

- name: ZAP Baseline
uses: zaproxy/action-[email protected]
with:
target: ${{ secrets.STAGING_URL }}

Ejemplo con GitLab CI

stages:
- test
- build
- security
- deploy

variables:
DOCKER_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA

# SAST
semgrep:
stage: test
image: semgrep/semgrep
script:
- semgrep ci --config auto
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

# SCA - dependencies
dependency_scan:
stage: test
image: node:20
script:
- npm ci
- npm audit --audit-level=high
allow_failure: true

# SCA - Snyk
snyk:
stage: test
image: snyk/snyk:node
script:
- snyk auth $SNYK_TOKEN
- snyk test --severity-threshold=high
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

# Build container
build:
stage: build
image: docker:latest
services:
- docker:dind
script:
- docker build -t $DOCKER_IMAGE .
- docker push $DOCKER_IMAGE

# Container scanning
trivy:
stage: security
image: aquasec/trivy
script:
- trivy image --exit-code 1 --severity HIGH,CRITICAL $DOCKER_IMAGE
needs: [build]

# DAST on staging
dast:
stage: security
image: ghcr.io/zaproxy/zaproxy:stable
script:
- zap-baseline.py -t $STAGING_URL -I
needs: [deploy_staging]
only:
- main

Cuando los escáneres detectan problemas: manual de respuesta del Security Champion

Su pipeline bloqueó un merge request. O peor — señaló algo en código que ya está en producción. ¿Qué hacer ahora?

Esta sección proporciona un enfoque estructurado para que los Security Champions gestionen los hallazgos de seguridad, desde la clasificación inicial hasta la resolución. El proceso sigue metodologías modernas de gestión de vulnerabilidades incluyendo CVSS, SSVC y VEX.

Paso 1: clasificación inicial (5-10 minutos)

Antes de profundizar, evalúe rápidamente con qué está tratando:

Reúna información básica:

PreguntaDónde encontrarla
¿Qué escáner lo detectó?Salida del pipeline, nombre de la herramienta
¿Qué tipo de hallazgo es?ID del CVE, CWE, ID de la regla
¿Dónde está?Archivo, número de línea, dependencia
¿Qué gravedad reporta la herramienta?Crítico/Alto/Medio/Bajo
¿Es código nuevo o existente?Diferencia del PR, git blame

Clasificación rápida:

Preguntas de clasificación inicial:

  • ¿Es este un falso positivo conocido? → Sí: documéntelo y suprímalo (Paso 6). No: continúe al Paso 2.
  • ¿Está esto en producción ahora mismo? → Sí: pista paralela — evalúe la exposición en producción (Paso 5). No: continúe el flujo normal.
  • ¿Está bloqueando un despliegue crítico? → Sí: escale de inmediato, involucre a más personas. No: continúe metódicamente.

Paso 2: verificar el hallazgo (15-30 minutos)

No toda alerta del escáner es una vulnerabilidad real. Verifique antes de invertir más tiempo.

Para hallazgos SAST (vulnerabilidades de código):

  1. Lea el código señalado. Comprenda qué hace.
  2. Compruebe el flujo de datos. ¿La entrada del usuario realmente llega a este código?
  3. Rastree el origen de la entrada. ¿Se valida/sanitiza antes?
  4. Compruebe las protecciones existentes. Características de seguridad del framework, reglas WAF, validación de entrada.
# Example: Semgrep flags this as SQL injection
query = f"SELECT * FROM users WHERE id = {user_id}"

# Questions to answer:
# 1. Where does user_id come from? (request parameter? internal service?)
# 2. Is it validated before this line? (type check? allowlist?)
# 3. Is there a WAF or parameterization layer above?

Para hallazgos SCA (dependencias vulnerables):

  1. Compruebe si usa la función vulnerable. La mayoría de los CVEs afectan a características específicas.
  2. Lea la descripción del CVE. ¿Cuál es el vector de ataque?
  3. Compruebe su código. ¿Llama a la API vulnerable?
  4. Compruebe la exposición transitiva. ¿Otra dependencia usa la función vulnerable?
# Find where a dependency is used
grep -r "require('vulnerable-package')" src/
grep -r "from vulnerable_package import" src/

# Check if specific vulnerable function is called
grep -r "vulnerableFunction(" src/

Para hallazgos de contenedor/IaC:

  1. Compruebe si la configuración es intencional. Algunas configuraciones «inseguras» son válidas para su caso de uso.
  2. Verifique el riesgo real. ¿Está expuesto el recurso? ¿Hay un control compensatorio?
  3. Compruebe en tiempo de ejecución vs. en build. Algunos hallazgos solo importan en entornos específicos.

Resultado de la verificación:

ResultadoAcción
Vulnerabilidad confirmadaContinúe al Paso 3
Falso positivoDocumente y suprima (Paso 6)
InciertoPida una segunda opinión, trátelo como real por defecto

Paso 3: evaluar la explotabilidad (15-45 minutos)

Una vulnerabilidad confirmada no es necesariamente explotable en su contexto. Evalúe el riesgo real.

Factores de explotabilidad (basados en CVSS v4.0):

FactorPreguntas a responder
Vector de ataque¿Accesible por red? ¿Solo local? ¿Necesita acceso físico?
Complejidad del ataque¿Fácil de explotar? ¿Requiere condiciones específicas?
Privilegios requeridos¿Anónimo? ¿Usuario autenticado? ¿Administrador?
Interacción del usuario¿Ninguna? ¿La víctima debe hacer clic en un enlace?

Evaluación específica del contexto:

FactorPreguntas a responder
Exposición¿Es este código/componente accesible desde Internet?
Sensibilidad de los datos¿A qué datos se podría acceder si se explota?
Controles existentes¿WAF, limitación de velocidad, autenticación, segmentación de red?
Disponibilidad del exploit¿Exploit público? ¿Módulo de Metasploit? ¿Solo teórico?

Comprobación rápida de explotabilidad:

# Check if a public exploit exists
searchsploit CVE-2024-XXXXX

# Check ExploitDB
curl -s "https://www.exploit-db.com/search?cve=2024-XXXXX"

# Check CISA KEV (Known Exploited Vulnerabilities)
curl -s https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json | \
jq '.vulnerabilities[] | select(.cveID=="CVE-2024-XXXXX")'

Matriz de explotabilidad:

Exploit disponibleAccesible externamenteDatos sensibles en riesgoPrioridad
CRÍTICO — Acción inmediata
NoALTO — Corregir este sprint
NoALTO — Corregir este sprint
NoMEDIO — Corregir pronto
NoNoNoBAJO — Registrar, corregir cuando sea conveniente

Paso 4: determinar el impacto empresarial (10-20 minutos)

La gravedad técnica ≠ impacto empresarial. Un CVE crítico en una herramienta de desarrollo importa menos que un problema medio en su sistema de pagos.

Preguntas de evaluación de impacto:

CategoríaPreguntas
Confidencialidad¿Qué datos podrían filtrarse? ¿PII? ¿Credenciales? ¿Secretos empresariales?
Integridad¿Podrían modificarse datos? ¿Registros financieros? ¿Permisos de usuario?
Disponibilidad¿Podría caer el sistema? ¿Durante cuánto tiempo?
Cumplimiento¿Infringe regulaciones? ¿GDPR, PCI DSS, HIPAA?
Reputación¿Sería noticia si se explotara?

Calcular la prioridad (inspirado en SSVC):

Puntúe cada factor y sume el resultado:

  • Explotación — Activa en el mundo real: +2 / PoC existe: +1 / Ninguna conocida: +0
  • Exposición — Con acceso a Internet sin autenticación: +2 / Autenticado: +1 / Solo interno: +0
  • Impacto — Compromiso total del sistema: +2 / Acceso o modificación de datos: +1 / Limitado: +0

Total: 5–6 → Inmediato | 3–4 → Urgente | 1–2 → Programado

Paso 5: comprobar la exposición en producción (pista paralela)

Si el código/componente vulnerable está en producción, necesita saberlo de inmediato.

Preguntas a responder:

  1. ¿Está la vulnerabilidad en producción?

    • Compruebe las versiones desplegadas
    • Compruebe el historial de lanzamientos
    • ¿Cuándo se introdujo?
  2. ¿Ha sido explotada?

    • Compruebe los registros de la aplicación en busca de patrones sospechosos
    • Compruebe los registros del WAF en busca de firmas de ataque
    • Compruebe los registros de acceso en busca de anomalías
    • Compruebe las alertas del SIEM
  3. ¿Cuál es el radio de explosión?

    • ¿Qué entornos están afectados?
    • ¿Qué clientes/usuarios?
    • ¿Cuánto tiempo ha estado expuesto?

Lista de verificación para investigación en producción:

# Check if vulnerable version is deployed
kubectl get deployments -o jsonpath='{.items[*].spec.template.spec.containers[*].image}'

# Search logs for exploit patterns (example for SQL injection)
grep -E "(UNION|SELECT.*FROM|DROP TABLE|--|;)" /var/log/app/*.log

# Check for unusual error rates
grep "500\|502\|503" /var/log/nginx/access.log | wc -l

# Check authentication failures spike
grep "authentication failed" /var/log/app/*.log | \
awk '{print $1}' | sort | uniq -c | sort -rn | head -20

Si se sospecha explotación:

  1. Contenga de inmediato — Deshabilite la función afectada, bloquee las IPs, rote credenciales
  2. Preserve la evidencia — No elimine los registros, tome snapshots
  3. Active la respuesta a incidentes — Esto es ahora un incidente de seguridad, no solo una vulnerabilidad
  4. Notifique a las partes interesadas — Dirección, legal, cumplimiento según corresponda

Paso 6: decidir y actuar

Basándose en su evaluación, elija la respuesta apropiada:

Opciones de respuesta:

PrioridadRespuestaPlazoQuién decide
InmediatoBloquear merge, hotfix en producciónHorasSecurity Champion + Lead
UrgenteCorregir en el sprint actual, parche en producción programadoDíasSecurity Champion
ProgramadoAñadir al backlog, corregir en el desarrollo normalSemanasSecurity Champion
Aceptar riesgoDocumentar decisión, implementar monitorizaciónN/ASecurity Champion + Dirección
Falso positivoSuprimir con documentaciónInmediatoSecurity Champion

Para vulnerabilidades confirmadas — flujo de corrección:

┌─────────────┐     ┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│ Create │────►│ Implement │────►│ Verify │────►│ Deploy │
│ ticket │ │ fix │ │ fix │ │ + close │
└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘
│ │ │ │
▼ ▼ ▼ ▼
- CVE/CWE ID - Code change - Run scanner - Deploy to prod
- Severity - Dependency - Manual verify - Monitor for issues
- Impact analysis update - Regression - Update SBOM
- Affected versions - Config fix tests - Close ticket

Para falsos positivos — flujo de supresión:

# 1. Document WHY it's a false positive
# semgrep: .semgrepignore or inline
def process_data(data):
# nosemgrep: sql-injection
# Reason: 'data' is validated UUID from internal service, not user input
query = f"SELECT * FROM cache WHERE id = '{data}'"

# 2. Add to team knowledge base
# Create entry in security wiki explaining this pattern

# 3. Consider improving the rule
# Report to Semgrep community if rule has high false positive rate

Para riesgos aceptados:

## Risk Acceptance Record

**Vulnerability:** CVE-2024-XXXXX in package-name v1.2.3
**Date:** 2024-12-28
**Decided by:** [Name], approved by [Manager]

### Risk assessment
- Severity: HIGH (CVSS 8.1)
- Exploitability in our context: LOW
- Reason: Vulnerable function not used in our codebase

### Mitigating controls
- [ ] WAF rule blocks attack pattern
- [ ] Input validation in place
- [ ] Monitoring for exploitation attempts

### Review schedule
- Next review: 2025-03-28
- Trigger for re-review: New exploit published, or mitigating control removed

### Acceptance signature
Accepted by: _____________ Date: _____________

Paso 7: prevenir la recurrencia

Después de corregir, evite que el mismo problema vuelva a aparecer.

Acciones:

  1. Añadir reglas específicas al escáner — Si es un patrón de código personalizado, añada una regla de Semgrep
  2. Actualizar la política de dependencias — Bloquear versiones vulnerables en el lockfile
  3. Añadir a la formación de seguridad — Compartir como caso de estudio con el equipo
  4. Mejorar la detección — Si se detectó tarde, mejorar la cobertura del análisis

Ejemplo: prevenir el uso futuro de un patrón vulnerable:

# .semgrep.yml - custom rule to prevent pattern
rules:
- id: no-string-format-sql
patterns:
- pattern: f"SELECT ... {$VAR} ..."
message: "Use parameterized queries, not string formatting"
languages: [python]
severity: ERROR

Tiempos de respuesta recomendados

PrioridadRespuesta inicialCorrección implementadaParche en producción
Inmediato (exploit activo, datos críticos)1 hora4 horas8 horas
Urgente (exploit público, exposición externa)4 horas24 horas48 horas
Programado (sin exploit, exposición limitada)24 horas1-2 semanasPróximo lanzamiento
Bajo (teórico, sin exposición)1 semana1-2 mesesCuando sea conveniente

Matriz de escalación

SituaciónEscalar aMétodo
Explotación activa en cursoCTO, Respuesta a incidentes, LegalLlamada telefónica
Vulnerabilidad crítica en producciónEngineering Lead, CTOSlack + llamada
Incertidumbre sobre gravedad/explotabilidadIngeniero senior, consultor externoSlack
Aceptación de riesgo necesariaEngineering ManagerEmail con documentación
Parche de proveedor requeridoContacto de seguridad del proveedorEmail, ticket de soporte

Plantilla de documentación

Use esta plantilla para cada hallazgo significativo:

## Security Finding Report

### Summary
- **Finding ID:** [JIRA/ticket number]
- **Scanner:** [Semgrep/Snyk/Trivy/etc]
- **Rule/CVE:** [Rule ID or CVE number]
- **Severity (tool):** [Critical/High/Medium/Low]
- **Severity (assessed):** [After your analysis]
- **Status:** [New/Investigating/Confirmed/Fixed/False Positive/Accepted]

### Technical details
- **Location:** [file:line or package:version]
- **Introduced:** [commit/date/PR]
- **In production:** [Yes/No, since when]

### Analysis
- **Verification result:** [Confirmed/False positive]
- **Exploitability:** [High/Medium/Low/None]
- **Attack vector:** [Description]
- **Existing controls:** [WAF/validation/etc]

### Impact
- **Confidentiality:** [None/Low/High]
- **Integrity:** [None/Low/High]
- **Availability:** [None/Low/High]
- **Business impact:** [Description]

### Resolution
- **Action taken:** [Fix/Accept/Suppress]
- **Fix PR:** [Link]
- **Deployed:** [Date]
- **Verified:** [How]

### Prevention
- **New scanner rule:** [Yes/No, link]
- **Training update:** [Yes/No]
- **Process change:** [Description]

Errores comunes

Bloquear todo

# BAD: Every finding blocks the build
- run: npm audit # Fails on ANY vulnerability

Esto lleva a pipelines ignorados, controles deshabilitados o cultura de «corregir después».

# GOOD: Block on critical, warn on medium
- run: npm audit --audit-level=critical

No bloquear nada

# BAD: Scan runs but never fails
- run: semgrep --config auto || true

Los hallazgos de seguridad se acumulan, nadie mira los informes.

# GOOD: Block on high severity
- run: semgrep --config auto --error --severity=ERROR

Ejecutar DAST en producción

# BAD: Attacking your own production
- run: zap-full-scan.py -t https://production.example.com

Los análisis DAST completos pueden romper cosas. Use staging.

# GOOD: Attack staging only
- run: zap-full-scan.py -t $STAGING_URL

Ignorar la salida de las herramientas

Configurar el análisis sin un proceso para gestionar los hallazgos. Las herramientas detectan problemas → nadie los clasifica → las alertas se ignoran → las herramientas se deshabilitan.

Solución: Asigne responsabilidad. Alguien revisa los hallazgos semanalmente. Los problemas críticos crean tickets. Los problemas medios se revisan mensualmente.

Demasiadas herramientas

Ejecutar cinco herramientas SAST diferentes, tres escáneres SCA y esperar que más sea mejor. Resultado: ruido, hallazgos duplicados, pipelines lentos.

Solución: Comience con una herramienta por categoría. Añada más solo si tiene carencias específicas.

Analizar solo en main

# BAD: Issues found after merge
only:
- main

Detecte los problemas en los PRs, no después de que se hayan mezclado.

# GOOD: Scan on every PR
on:
push:
branches: [main]
pull_request: # This is key

Incidentes reales

Ataque a la cadena de suministro de Codecov (2021). Los atacantes comprometieron el script bash uploader de Codecov utilizado en miles de pipelines de CI/CD. Durante más de dos meses, el script modificado exfiltró variables de entorno — incluyendo secretos de CI, tokens de API y credenciales — de cada pipeline que lo usaba. Empresas como Twilio, HashiCorp y Confluent se vieron afectadas.

Secuestro de ua-parser-js (2021). Un popular paquete npm (8 millones de descargas semanales) fue secuestrado cuando un atacante comprometió la cuenta npm del maintainer. Las versiones maliciosas minaban criptomonedas y robaban contraseñas. Los proyectos con análisis SCA detectaron el problema en horas; los que no lo tenían distribuyeron builds comprometidos.

Log4Shell (2021). CVE-2021-44228 en Log4j afectó a prácticamente todas las aplicaciones Java. Las organizaciones con análisis SCA conocieron su exposición en horas. Las que no tenían análisis tardaron días en averiguar qué aplicaciones usaban Log4j y qué versiones. La diferencia entre «estamos parcheados» y «seguimos investigando» fue el análisis automatizado de dependencias.

Estos incidentes comparten un patrón: las organizaciones con análisis automatizado detectaron y respondieron más rápido. Las que no lo tenían se vieron abrumadas.

Taller: proteja su pipeline

Reserve 2-3 horas para este ejercicio.

Parte 1: añadir análisis SAST (30 minutos)

Para GitHub:

  1. Cree .github/workflows/security.yml:
name: Security Scan

on:
push:
branches: [main]
pull_request:

jobs:
semgrep:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: semgrep/semgrep-action@v1
with:
config: p/security-audit p/secrets
  1. Haga commit y push
  2. Cree un PR de prueba y verifique que el análisis se ejecuta
  3. Revise los hallazgos

Para GitLab:

  1. Añada a .gitlab-ci.yml:
semgrep:
stage: test
image: semgrep/semgrep
script:
- semgrep ci --config auto
  1. Haga commit y push
  2. Verifique que el análisis se ejecuta en el pipeline
  3. Revise los hallazgos en la salida del pipeline

Entregable: Análisis SAST funcionando en CI

Parte 2: configurar Dependabot o Snyk (30 minutos)

Opción A — Dependabot (GitHub):

  1. Cree .github/dependabot.yml:
version: 2
updates:
- package-ecosystem: "npm" # or pip, bundler, etc.
directory: "/"
schedule:
interval: "weekly"
open-pull-requests-limit: 5
  1. Vaya a Settings → Security → Active las alertas y actualizaciones de seguridad de Dependabot
  2. Revise las alertas existentes en la pestaña Security

Opción B — Snyk:

  1. Regístrese en snyk.io (nivel gratuito)
  2. Instale la CLI: npm install -g snyk
  3. Autentíquese: snyk auth
  4. Ejecute el análisis inicial: snyk test
  5. Añada a CI (vea los ejemplos anteriores)

Entregable: Análisis de dependencias habilitado con los hallazgos iniciales revisados

Parte 3: añadir análisis de contenedores (30 minutos)

Si usa Docker:

  1. Añada Trivy a su flujo de trabajo:
container-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: docker build -t myapp:test .
- uses: aquasecurity/trivy-action@master
with:
image-ref: myapp:test
severity: 'CRITICAL,HIGH'
  1. Construya su imagen localmente y analícela:
docker build -t myapp:test .
trivy image myapp:test
  1. Revise los hallazgos y corrija los problemas críticos

Entregable: Análisis de contenedores en CI con vulnerabilidades de imagen base documentadas

Parte 4: configurar DAST de base (30 minutos)

  1. Despliegue su aplicación en un entorno de staging (o ejecútela localmente)

  2. Ejecute el análisis de base de ZAP:

docker run -t ghcr.io/zaproxy/zaproxy:stable zap-baseline.py \
-t http://your-staging-url
  1. Revise la salida — compruebe:

    • Cabeceras de seguridad faltantes
    • Problemas de seguridad en cookies
    • Divulgación de información
  2. Añada el análisis de base al pipeline de CI (solo staging)

Entregable: Análisis DAST de base configurado para staging

Parte 5: añadir análisis IaC (20 minutos)

Si usa Terraform, CloudFormation o Kubernetes:

  1. Instale Checkov:
pip install checkov
  1. Analice su código de infraestructura:
checkov -d terraform/  # or cloudformation/, k8s/
  1. Añada a CI:
# GitHub Actions
- name: Checkov
uses: bridgecrewio/checkov-action@master
with:
directory: terraform/
soft_fail: false
  1. Revise los hallazgos y corrija las configuraciones incorrectas críticas

Entregable: Análisis IaC en CI con los principales problemas documentados

Parte 6: configurar la generación de SBOM (20 minutos)

  1. Instale Syft:
brew install syft
# or
curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin
  1. Genere un SBOM para su proyecto:
syft dir:. -o cyclonedx-json > sbom.json
  1. Analice el SBOM en busca de vulnerabilidades:
brew install grype
grype sbom:sbom.json
  1. Añada a CI:
# GitHub Actions
- name: Generate SBOM
uses: anchore/sbom-action@v0
with:
path: .
format: cyclonedx-json
output-file: sbom.json

- name: Scan SBOM
uses: anchore/scan-action@v3
with:
sbom: sbom.json
fail-build: true
severity-cutoff: high
  1. Revise la información de licencias en el SBOM

Entregable: Generación y análisis de SBOM en CI

Parte 7: crear el proceso de clasificación (30 minutos)

Cree un documento simple:

# Security Findings Triage Process

## Severity levels
- **Critical/High**: Block merge, fix immediately
- **Medium**: Fix in current sprint
- **Low**: Add to backlog, fix when convenient

## Who triages
- [Name] reviews findings weekly
- Critical findings notify #security-alerts channel

## False positives
- Document in `.semgrep.yml` or tool config
- Require approval from [Name] to suppress

## Metrics tracked
- Open findings by severity
- Time from finding to fix
- Findings per deployment

Entregable: Proceso de clasificación documentado

Artefactos de este capítulo

Al finalizar este capítulo, debería tener:

  1. Escáner SAST configurado — Semgrep o CodeQL ejecutándose en cada PR
  2. Dependabot/Snyk habilitado — Análisis de dependencias con alertas configuradas
  3. Análisis de contenedores — Trivy analizando imágenes Docker (si aplica)
  4. Análisis IaC — Checkov o tfsec analizando código de infraestructura (si aplica)
  5. Generación de SBOM — Syft generando SBOMs con cada build
  6. Base DAST — ZAP o Nuclei ejecutándose en los despliegues de staging
  7. Archivo del flujo de trabajo de seguridad — Configuración completa del pipeline de seguridad CI/CD
  8. Manual de respuesta a hallazgos — Proceso paso a paso para gestionar los hallazgos de los escáneres
  9. Matriz de escalación — A quién contactar para diferentes niveles de gravedad
  10. Documento del proceso de clasificación — Cómo se priorizan y asignan los hallazgos

Cómo explicarlo a la dirección

Cuando alguien pregunta por qué está añadiendo análisis de seguridad a CI/CD:

«Estoy añadiendo comprobaciones de seguridad automatizadas a nuestro pipeline de despliegue. Estas herramientas analizan nuestro código en busca de vulnerabilidades, comprueban nuestras dependencias en busca de problemas de seguridad conocidos y prueban la aplicación en ejecución ante vectores de ataque comunes. Detectan los problemas antes de que lleguen a producción — inyección SQL, bibliotecas vulnerables, servidores mal configurados. Las herramientas son gratuitas y añaden unos 2-3 minutos a nuestro pipeline. La alternativa es encontrar estos problemas después de una brecha, lo que es significativamente más costoso en dinero y reputación.»

Versión corta: «Estoy añadiendo comprobaciones de seguridad automatizadas para detectar vulnerabilidades antes que los atacantes.»

Autoevaluación

Análisis estático (SAST)

  • Semgrep o CodeQL ejecutándose en cada PR
  • Los hallazgos de alta gravedad bloquean el merge
  • Proceso de supresión de falsos positivos documentado
  • El equipo sabe cómo leer los hallazgos SAST

Análisis de dependencias (SCA)

  • Dependabot o Snyk habilitado
  • Alertas configuradas y siendo revisadas
  • Vulnerabilidades críticas en dependencias corregidas
  • Proceso para gestionar vulnerabilidades sin solución

Análisis de contenedores

  • Trivy analizando imágenes antes de enviarlas al registro
  • Imágenes base actualizadas para corregir vulnerabilidades críticas
  • Análisis integrado en el pipeline de build

Infraestructura como código (IaC)

  • Checkov o tfsec ejecutándose en cambios de infraestructura
  • Configuraciones incorrectas críticas (buckets públicos, grupos de seguridad abiertos) bloqueadas
  • Excepciones intencionales documentadas con comentarios de skip

SBOM (Software Bill of Materials)

  • SBOM generado para cada lanzamiento
  • SBOMs analizados en busca de vulnerabilidades
  • Política de licencias definida (licencias aceptables/bloqueadas)
  • SBOMs almacenados con los artefactos de lanzamiento

Pruebas dinámicas (DAST)

  • Análisis de base ejecutándose en staging
  • Cabeceras de seguridad comprobadas
  • Análisis completo programado (semanal o antes de un lanzamiento)

Proceso de respuesta a hallazgos

  • Manual de respuesta a hallazgos documentado
  • Matriz de escalación definida
  • Proceso de aceptación de riesgo establecido
  • Plantilla de documentación de hallazgos en uso

Proceso

  • Alguien es responsable de la clasificación de hallazgos de seguridad
  • Umbrales de gravedad definidos
  • Métricas siendo rastreadas

Marque al menos 18 de 28 elementos antes de continuar.

Referencia de herramientas de análisis de seguridad

Esta sección proporciona una lista completa de herramientas de análisis de seguridad, organizadas de gratuitas/simples a empresariales/complejas. Comience con el nivel gratuito — cubre la mayoría de las necesidades. Pase a herramientas de pago cuando necesite características específicas, mejor soporte o cumplimiento empresarial.

Herramientas SAST (análisis estático de código)

HerramientaPrecioLenguajesMejor paraEnlace
SemgrepGratuito (código abierto)30+ lenguajesGeneral, reglas personalizadassemgrep.dev
BanditGratuito (código abierto)PythonSeguridad específica de PythonGitHub
gosecGratuito (código abierto)GoSeguridad específica de GoGitHub
BrakemanGratuito (código abierto)Ruby/RailsAplicaciones Railsbrakemanscanner.org
ESLint securityGratuito (código abierto)JavaScriptReglas de seguridad JS/Node.jsGitHub
PsalmGratuito (código abierto)PHPComprobación de tipos + seguridad PHPpsalm.dev
PHPStanGratuito (código abierto)PHPAnálisis estático PHPphpstan.org
CodeQLGratuito para repos públicos10+ lenguajesAnálisis semántico profundoGitHub
SonarQube CommunityGratuito (autoalojado)30+ lenguajesCalidad de código + seguridadsonarsource.com
Semgrep ProDe pago30+ lenguajesReglas avanzadas, funciones de equiposemgrep.dev
SonarCloudGratuito para público, de pago para privado30+ lenguajesSonarQube en la nubesonarcloud.io
Snyk CodeNivel gratuito, planes de pago10+ lenguajesImpulsado por IA, rápidosnyk.io
CheckmarxEmpresarial30+ lenguajesCumplimiento empresarialcheckmarx.com
VeracodeEmpresarial30+ lenguajesEmpresarial, análisis binarioveracode.com
FortifyEmpresarial30+ lenguajesEmpresarial, on-premisemicrofocus.com

Recomendación para equipos pequeños: Comience con Semgrep (gratuito, rápido, buenas reglas). Añada CodeQL si está en GitHub. Considere Snyk Code si necesita más cobertura.

Herramientas SCA (análisis de dependencias)

HerramientaPrecioEcosistemasMejor paraEnlace
npm auditGratuito (integrado)npmProyectos Node.jsdocs.npmjs.com
pip-auditGratuito (código abierto)pipProyectos PythonGitHub
bundle-auditGratuito (código abierto)bundlerProyectos RubyGitHub
govulncheckGratuito (oficial)Go modulesProyectos Gopkg.go.dev
composer auditGratuito (integrado)ComposerProyectos PHPgetcomposer.org
DependabotGratuito (integrado en GitHub)15+ ecosistemasRepositorios GitHubGitHub
TrivyGratuito (código abierto)Todos los principales + contenedoresEscáner universaltrivy.dev
GrypeGratuito (código abierto)Todos los principales + contenedoresRápido, soporte SBOMGitHub
OSV-ScannerGratuito (Google)Todos los principalesBase de datos OSV de GoogleGitHub
OWASP Dependency-CheckGratuito (código abierto)Java, .NET, JS, RubyProyecto OWASPowasp.org
RenovateGratuito (código abierto)50+ ecosistemasActualizaciones de dependenciasGitHub
Snyk Open SourceNivel gratuito, planes de pagoTodos los principalesMejores sugerencias de correcciónsnyk.io
Mend (WhiteSource)De pagoTodos los principalesCumplimiento de licenciasmend.io
Black DuckEmpresarialTodos los principalesCumplimiento empresarialsynopsys.com
JFrog XrayDe pagoTodos los principalesIntegración con repositorio de artefactosjfrog.com

Recomendación para equipos pequeños: Use Dependabot (gratuito en GitHub) o Renovate. Añada Trivy para contenedores. El nivel gratuito de Snyk es excelente si necesita más visibilidad.

Herramientas DAST (pruebas dinámicas)

HerramientaPrecioTipoMejor paraEnlace
OWASP ZAPGratuito (código abierto)DAST completoPruebas generales de aplicaciones webzaproxy.org
NucleiGratuito (código abierto)Basado en plantillasRápido, comprobaciones de CVE específicosnuclei.projectdiscovery.io
NiktoGratuito (código abierto)Escáner de servidor webConfiguraciones incorrectas de servidorGitHub
wapitiGratuito (código abierto)Escáner de aplicación webPruebas de caja negraGitHub
ArachniGratuito (código abierto)DAST completoEscáner con muchas funcionesGitHub
sqlmapGratuito (código abierto)Inyección SQLPruebas de inyección SQLsqlmap.org
StackHawkNivel gratuito, planes de pagoEnfocado en APIAPIs modernas, nativo para CI/CDstackhawk.com
Burp Suite CommunityGratuitoPruebas manualesPruebas de seguridad manualesportswigger.net
Burp Suite Pro449$/añoDAST completoPruebas de penetración profesionalesportswigger.net
AcunetixDe pagoDAST completoAnálisis web automatizadoacunetix.com
Invicti (Netsparker)EmpresarialDAST completoAplicaciones web empresarialesinvicti.com
Qualys WASEmpresarialDAST completoEmpresarial, cumplimientoqualys.com

Recomendación para equipos pequeños: Comience con análisis de base de ZAP en CI. Añada Nuclei para comprobaciones específicas de CVE. Burp Suite Community para pruebas manuales.

Análisis de contenedores e imágenes

HerramientaPrecioCaracterísticasMejor paraEnlace
TrivyGratuito (código abierto)Imágenes, IaC, SBOMEscáner universaltrivy.dev
GrypeGratuito (código abierto)Imágenes, SBOMRápido, ecosistema AnchoreGitHub
ClairGratuito (código abierto)ImágenesRegistros de contenedoresGitHub
SyftGratuito (código abierto)Generación de SBOMSoftware Bill of MaterialsGitHub
Docker ScoutNivel gratuitoImágenesIntegración con Docker Hubdocker.com
Snyk ContainerNivel gratuito, planes de pagoImágenes, KubernetesRecomendaciones de correcciónsnyk.io
Anchore EnterpriseDe pagoImágenes, políticasCumplimiento empresarialanchore.com
Sysdig SecureDe pagoRuntime + análisisSeguridad en tiempo de ejecuciónsysdig.com
Prisma CloudEmpresarialCNAPP completoSeguridad cloud-nativepaloaltonetworks.com

Recomendación para equipos pequeños: Trivy hace todo lo que necesita de forma gratuita. Añada Docker Scout si está en Docker Hub.

Análisis de infraestructura como código (IaC)

HerramientaPrecioIaC soportadoMejor paraEnlace
CheckovGratuito (código abierto)Terraform, CloudFormation, K8s, ARMAnálisis IaC completocheckov.io
tfsecGratuito (código abierto)TerraformEnfocado en TerraformGitHub
TerrascanGratuito (código abierto)Terraform, K8s, Helm, DockerfilePolítica como códigoGitHub
KICSGratuito (código abierto)15+ plataformas IaCCobertura ampliakics.io
cfn-lintGratuito (oficial AWS)CloudFormationAWS CloudFormationGitHub
cfn_nagGratuito (código abierto)CloudFormationSeguridad en CloudFormationGitHub
kubesecGratuito (código abierto)KubernetesSeguridad de manifiestos K8skubesec.io
TrivyGratuito (código abierto)Terraform, K8s, DockerfileUniversal (IaC + contenedores)trivy.dev
Snyk IaCNivel gratuito, planes de pagoTerraform, K8s, CloudFormationRecomendaciones de correcciónsnyk.io
BridgecrewDe pago (ahora Prisma Cloud)Todos los principalesEmpresarial, backend Checkovpaloaltonetworks.com

Recomendación para equipos pequeños: Comience con Checkov — es completo y gratuito. tfsec es excelente si solo usa Terraform.

Análisis IaC en CI:

# GitHub Actions - Checkov
- name: Checkov
uses: bridgecrewio/checkov-action@master
with:
directory: terraform/
framework: terraform
soft_fail: false

# GitLab CI - tfsec
tfsec:
stage: test
image: aquasec/tfsec:latest
script:
- tfsec terraform/ --severity-override=HIGH,CRITICAL

Generación y análisis de SBOM

HerramientaPrecioTipoMejor paraEnlace
SyftGratuito (código abierto)Generación de SBOMGenerador universalGitHub
cdxgenGratuito (código abierto)Generación de SBOMFormato CycloneDXGitHub
TrivyGratuito (código abierto)SBOM + análisisTodo en unotrivy.dev
GrypeGratuito (código abierto)Análisis de vulnerabilidades SBOMAnálisis rápidoGitHub
OSV-ScannerGratuito (Google)Análisis de vulnerabilidades SBOMBase de datos de GoogleGitHub
OWASP Dependency-TrackGratuito (autoalojado)Plataforma SBOMGestión completadependencytrack.org
FOSSANivel gratuito, planes de pagoCumplimiento de licenciasAnálisis profundo de licenciasfossa.com
Anchore EnterpriseDe pagoPlataforma SBOMPolíticas empresarialesanchore.com
Sonatype NexusDe pagoSBOM + cumplimientoIntegración con repositoriosonatype.com

Recomendación para equipos pequeños: Use Syft para generar SBOMs, Grype para analizar vulnerabilidades. Añada OWASP Dependency-Track si necesita seguimiento centralizado.

Análisis de secretos

HerramientaPrecioCaracterísticasMejor paraEnlace
gitleaksGratuito (código abierto)Historial git, pre-commitRápido, configurablegitleaks.io
truffleHogGratuito (código abierto)Git, S3, GCS, secretos verificadosAnálisis profundoGitHub
git-secretsGratuito (AWS)Hooks pre-commitCredenciales AWSGitHub
detect-secretsGratuito (código abierto)Enfoque de línea baseHerramienta de YelpGitHub
GitHub Secret ScanningGratuito (integrado en GitHub)Protección en pushRepositorios GitHubdocs.github.com
GitLab Secret DetectionGratuito (integrado en GitLab)Integración en pipelineRepositorios GitLabdocs.gitlab.com
GitGuardianGratuito para individuosMonitorización en tiempo realAmigable para desarrolladoresgitguardian.com
SnykNivel gratuitoParte de Snyk CodePlataforma unificadasnyk.io

Recomendación para equipos pequeños: Active el análisis integrado de GitHub/GitLab. Añada gitleaks como hook pre-commit. Vea el capítulo de gestión de secretos para la configuración detallada.

Pruebas de seguridad de API

HerramientaPrecioTipoMejor paraEnlace
OWASP ZAPGratuito (código abierto)Análisis OpenAPI/SwaggerAPIs RESTzaproxy.org
NucleiGratuito (código abierto)Basado en plantillasComprobaciones de CVE en APInuclei.projectdiscovery.io
PostmanNivel gratuitoPlataforma de pruebas de APIManual + automatizadopostman.com
StackHawkNivel gratuito, planes de pagoDAST enfocado en APIAPIs modernas, GraphQLstackhawk.com
AktoNivel gratuitoDescubrimiento + pruebas de APIInventario de APIakto.io
42CrunchDe pagoSeguridad OpenAPIPlataforma de seguridad de API42crunch.com
Salt SecurityEmpresarialProtección de API en runtimeDetección de amenazas en APIsalt.security
Noname SecurityEmpresarialSeguridad de API completaAPIs empresarialesnonamesecurity.com

Recomendación para equipos pequeños: Use ZAP con importación OpenAPI. Añada StackHawk si necesita mejor soporte para APIs.

Plataformas todo en uno

Estas plataformas combinan múltiples tipos de análisis en una sola solución:

PlataformaIncluyePrecioMejor paraEnlace
GitHub Advanced SecuritySAST (CodeQL), SCA, Secretos49$/usuario/mesEquipos nativos de GitHubgithub.com
GitLab UltimateSAST, SCA, DAST, Secretos, Contenedor99$/usuario/mesEquipos nativos de GitLabgitlab.com
SnykSAST, SCA, Contenedor, IaCNivel gratuito, planes de pagoAmigable para desarrolladoressnyk.io
SonarSAST, calidad de códigoNivel gratuito (Cloud), de pagoEnfoque en calidad de códigosonarsource.com
VeracodeSAST, SCA, DASTEmpresarialGrandes empresasveracode.com
Checkmarx OneSAST, SCA, DAST, IaCEmpresarialCumplimiento empresarialcheckmarx.com
SynopsysSAST, SCA, DASTEmpresarialEmpresarial, legacysynopsys.com

Recomendación para equipos pequeños: Si está en GitHub, active primero las funciones gratuitas, luego considere GitHub Advanced Security. El nivel gratuito de Snyk es generoso y cubre la mayoría de las necesidades. Evite las plataformas empresariales hasta que realmente necesite funciones empresariales.

Inicio rápido: pipeline de seguridad mínimo viable

Si está empezando, aquí está la configuración mínima usando solo herramientas gratuitas:

CategoríaHerramientaPor qué
SASTSemgrepRápido, buenas reglas, gratuito
SCADependabot o TrivyIntegrado o universal
SecretosgitleaksPre-commit + CI
ContenedoresTrivyAnaliza todo
IaCCheckovCompleto, gratuito
SBOMSyft + GrypeGenerar + analizar
DASTZAP BaselineEstándar, fiable

Coste total: 0€. Tiempo de configuración: 3-4 horas.

Lecturas adicionales

Qué sigue

Ha integrado el análisis de seguridad en su pipeline de CI/CD. Próximo capítulo: seguridad de contenedores e infraestructura cloud — proteger imágenes Docker, configuraciones cloud e infraestructura como código.