Semestre 02, 2026
La revisión manual de seguridad al final del ciclo no escala a un ritmo de varios despliegues por día.
Práctica que integra la seguridad como un componente fundamental del modelo DevOps, desde las primeras etapas del desarrollo (NIST).
Cifras del informe Cost of a Data Breach 2025 de IBM y el Ponemon Institute.
La revisión de seguridad es una etapa posterior al desarrollo, ejecutada por un equipo separado antes de la liberación.
Mover las actividades de seguridad hacia la izquierda de la línea de tiempo del ciclo de vida, hacia el diseño y la codificación.
Shift left no significa abandonar la seguridad en producción.
El Secure Software Development Framework (SP 800-218) organiza las prácticas de desarrollo seguro en cuatro grupos.
flowchart LR
subgraph P[Planificar]
P1[Modelado de amenazas]
end
subgraph C[Codificar]
C1[Pre-commit y secretos]
end
subgraph B[Build]
B1[SAST y SCA]
end
subgraph T[Pruebas]
T1[DAST]
end
subgraph D[Despliegue]
D1[IaC, imágenes y firma]
end
subgraph O[Operación]
O1[Monitoreo y respuesta]
end
P --> C --> B --> T --> D --> O
Actividad de diseño que analiza qué puede salir mal en un sistema antes de construirlo.
| Técnica | Qué analiza | Herramientas |
|---|---|---|
| Secretos | Credenciales en el código y el historial | Gitleaks, TruffleHog |
| SAST | El código fuente, sin ejecutarlo | Semgrep, CodeQL |
| SCA | Las dependencias de terceros | npm audit, Dependabot |
| DAST | La aplicación en ejecución | OWASP ZAP, Burp |
| IaC | Terraform, Kubernetes, Docker | Checkov, tfsec |
| Contenedores | Imágenes y paquetes del sistema | Trivy, Grype |
Las dos técnicas detectan clases distintas de defectos y se ejecutan en etapas distintas del pipeline.
Analiza el código fuente sin ejecutarlo. Corre en el build, reporta archivo y línea, y tiene más falsos positivos. No detecta errores de configuración del entorno.
Envía peticiones maliciosas a la aplicación desplegada en un entorno de pruebas. Detecta errores de configuración y de comportamiento en ejecución, pero no reporta la línea responsable.
Apache publicó el 7 de marzo un parche para una vulnerabilidad crítica de Apache Struts (CVE-2017-5638). El portal de disputas de Equifax nunca se actualizó, los atacantes entraron desde mediados de mayo y se expusieron datos de cerca de 147 millones de personas.
Los atacantes comprometieron el sistema de build e inyectaron el malware Sunburst en las actualizaciones de Orion. Salieron firmadas por SolarWinds y cerca de 18,000 organizaciones las instalaron.
Un atacante modificó el script de Bash que miles de pipelines de CI descargaban en cada corrida. Durante dos meses, el script envió a un servidor externo las variables de entorno de esos pipelines, con sus credenciales y tokens.
Una vulnerabilidad en Log4j, la biblioteca de registro más usada en Java (CVE-2021-44228), permitía ejecutar código remoto con una sola cadena de texto escrita en un log. Recibió la severidad máxima de 10 en CVSS.
Un ingeniero notó que SSH tardaba medio segundo más de lo normal y encontró una puerta trasera en xz-utils (CVE-2024-3094). La introdujo un colaborador que pasó cerca de dos años ganándose la confianza del proyecto hasta ser mantenedor.
Un contratista publicó por error parte del código de la aplicación T-Connect en un repositorio público de GitHub. Contenía una clave de acceso que estuvo expuesta casi cinco años, con acceso a cerca de 296,000 correos de clientes.
| Caso | Qué falló | Práctica |
|---|---|---|
| Equifax | Dependencia sin parchar | SCA e inventario |
| SolarWinds | Build comprometido | Integridad y procedencia |
| Codecov | Script del pipeline alterado | Versiones fijas, mínimo privilegio |
| Log4Shell | Biblioteca sin ubicar | SBOM |
| xz-utils | Mantenedor malicioso | Verificación y monitoreo |
| Toyota | Clave en el código | Detección de secretos |
// Inseguro, la clave queda en el repositorio
const stripe = new Stripe('sk_live_51Hx9QfK2...');
// Seguro, la clave se lee del entorno
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);
Una clave publicada queda en el historial de Git aunque un commit posterior la borre. Se revoca y se emite una nueva.
Gitleaks revisa cada commit en la máquina del desarrollador y lo rechaza si encuentra un secreto.
repos:
- repo: https://github.com/gitleaks/gitleaks
rev: v8.24.2
hooks:
- id: gitleaks
Se requiere un workflow de GitHub Actions que, en cada pull request dirigido al main branch, busque secretos en el historial, revise las dependencias en busca de vulnerabilidades conocidas y ejecute un análisis estático con las reglas de OWASP Top 10. Si cualquier control encuentra un problema, el pull request no se puede fusionar.
name: Seguridad
on:
pull_request:
branches: [main]
permissions:
contents: read
jobs:
analizar:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: gitleaks/gitleaks-action@v2
env:
GITHUB_TOKEN: {{ secrets.GITHUB_TOKEN }}
- run: npm ci
- run: npm audit --audit-level=high
- run: >
pipx run semgrep scan
--config p/owasp-top-ten --error
name: Seguridad
on:
pull_request:
branches: [main]
permissions:
contents: read
jobs:
analizar:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: gitleaks/gitleaks-action@v2
env:
GITHUB_TOKEN: {{ secrets.GITHUB_TOKEN }}
- run: npm ci
- run: npm audit --audit-level=high
- run: >
pipx run semgrep scan
--config p/owasp-top-ten --error
El workflow corre en cada pull request hacia el main branch. El análisis se ejecuta antes del merge, cuando el cambio todavía no está en la rama principal.
name: Seguridad
on:
pull_request:
branches: [main]
permissions:
contents: read
jobs:
analizar:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: gitleaks/gitleaks-action@v2
env:
GITHUB_TOKEN: {{ secrets.GITHUB_TOKEN }}
- run: npm ci
- run: npm audit --audit-level=high
- run: >
pipx run semgrep scan
--config p/owasp-top-ten --error
Limita el token del pipeline a solo lectura. Si un paso o una acción de terceros se compromete, el token no permite escribir en el repositorio.
name: Seguridad
on:
pull_request:
branches: [main]
permissions:
contents: read
jobs:
analizar:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: gitleaks/gitleaks-action@v2
env:
GITHUB_TOKEN: {{ secrets.GITHUB_TOKEN }}
- run: npm ci
- run: npm audit --audit-level=high
- run: >
pipx run semgrep scan
--config p/owasp-top-ten --error
Descarga el historial completo y no solo el último commit. Un secreto borrado en un commit posterior sigue existiendo en los anteriores.
name: Seguridad
on:
pull_request:
branches: [main]
permissions:
contents: read
jobs:
analizar:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: gitleaks/gitleaks-action@v2
env:
GITHUB_TOKEN: {{ secrets.GITHUB_TOKEN }}
- run: npm ci
- run: npm audit --audit-level=high
- run: >
pipx run semgrep scan
--config p/owasp-top-ten --error
Gitleaks revisa los commits del pull request en busca de claves, tokens y contraseñas. El hook de pre-commit depende de la configuración de cada máquina, y este paso aplica el mismo control en el servidor.
name: Seguridad
on:
pull_request:
branches: [main]
permissions:
contents: read
jobs:
analizar:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: gitleaks/gitleaks-action@v2
env:
GITHUB_TOKEN: {{ secrets.GITHUB_TOKEN }}
- run: npm ci
- run: npm audit --audit-level=high
- run: >
pipx run semgrep scan
--config p/owasp-top-ten --error
Instala las dependencias exactas del archivo de bloqueo y las compara con la base de vulnerabilidades conocidas. Falla solo con severidad alta o crítica, para no bloquear por cada hallazgo menor.
name: Seguridad
on:
pull_request:
branches: [main]
permissions:
contents: read
jobs:
analizar:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: gitleaks/gitleaks-action@v2
env:
GITHUB_TOKEN: {{ secrets.GITHUB_TOKEN }}
- run: npm ci
- run: npm audit --audit-level=high
- run: >
pipx run semgrep scan
--config p/owasp-top-ten --error
Análisis estático con las reglas de OWASP Top 10. La opción error hace que el paso falle si hay hallazgos. Con una regla de protección del main branch que exige este check, el pull request no se puede fusionar mientras falle.
Cada hallazgo se clasifica para decidir si bloquea el merge o solo se registra.
El código de terceros se ejecuta con los mismos permisos que el propio.
| Categoría OWASP | Control en el pipeline |
|---|---|
| A02 Security Misconfiguration | Análisis de IaC y DAST |
| A03 Supply Chain Failures | SCA, SBOM y firma de artefactos |
| A04 Cryptographic Failures | Detección de secretos y SAST |
| A05 Injection | SAST y DAST |
| A06 Insecure Design | Modelado de amenazas |
Ninguna herramienta detecta un diseño inseguro, porque no sabe lo que el sistema debería hacer.
| Métrica | Qué indica |
|---|---|
| Tiempo medio de corrección | De la detección a la corrección, por severidad |
| Vulnerabilidades abiertas | Cuántas hay por severidad y su evolución |
| Vulnerabilidades escapadas | Las encontradas en producción y no en el pipeline |
| Cobertura de análisis | Porcentaje de repositorios con controles activos |
| Tasa de falsos positivos | Hallazgos que no resultan ser un problema real |