¿Qué hace Construcción de Pipeline DevSecOps con GitLab CI?
Visión General
GitLab proporciona una plataforma DevSecOps integrada que incorpora pruebas de seguridad directamente en el pipeline de CI/CD. Al aprovechar los escáneres de seguridad integrados de GitLab (SAST, DAST, escaneo de contenedores, escaneo de dependencias, detección de secretos y cumplimiento de licencias), los equipos pueden adelantar la seguridad, detectando vulnerabilidades durante el desarrollo en lugar de después del despliegue. La IA de GitLab Duo ayuda con la detección de falsos positivos para vulnerabilidades SAST, ayudando a los equipos de seguridad a centrarse en problemas reales.
Cuándo Usarlo
- Al implementar o configurar capacidades de construcción de pipeline devsecops con gitlab ci en tu entorno
- Al establecer controles de seguridad alineados con requisitos de cumplimiento
- Al construir o mejorar la arquitectura de seguridad para este dominio
- Al realizar evaluaciones de seguridad que requieran esta implementación
Prerrequisitos
- Licencia GitLab Ultimate (requerida para el conjunto completo de escáneres de seguridad)
- GitLab Runner configurado (compartido o auto-alojado)
- Familiaridad con la configuración del pipeline
.gitlab-ci.yml - Docker-in-Docker (DinD) o Kaniko para compilaciones de contenedores
- Aplicación desplegada en un entorno de prueba para el escaneo DAST
Etapas Principales de Escaneo de Seguridad
Pruebas de Seguridad de Aplicaciones Estáticas (SAST)
SAST analiza el código fuente en busca de vulnerabilidades antes de la compilación. GitLab admite más de 14 lenguajes utilizando analizadores como Semgrep, SpotBugs, Gosec, Bandit y NodeJsScan. La inclusión más simple utiliza las plantillas gestionadas de GitLab.
Pruebas de Seguridad de Aplicaciones Dinámicas (DAST)
DAST prueba aplicaciones en ejecución simulando cargas de ataque contra endpoints HTTP. Detecta XSS, SQLi, CSRF y otras vulnerabilidades en tiempo de ejecución que el análisis estático no puede encontrar. DAST requiere una URL objetivo desplegada y accesible.
Escaneo de Contenedores
Utiliza Trivy para escanear imágenes Docker en busca de CVEs conocidos en paquetes del SO y dependencias de aplicaciones. Se ejecuta después de la etapa de compilación de Docker para filtrar imágenes antes de que lleguen a un registro.
Escaneo de Dependencias
Inspecciona manifiestos de dependencias (package.json, requirements.txt, pom.xml, Gemfile.lock) en busca de versiones vulnerables conocidas. Opera a nivel de código fuente, complementando el escaneo de contenedores.
Detección de Secretos
Escanea commits en busca de credenciales, claves API, tokens y claves privadas cometidas accidentalmente mediante coincidencia de patrones y análisis de entropía. Se ejecuta en cada commit para evitar que los secretos lleguen al repositorio.
Implementación
Configuración Completa del Pipeline
# .gitlab-ci.yml
stages:
- build
- test
- security
- deploy-staging
- dast
- deploy-production
variables:
DOCKER_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
SECURE_LOG_LEVEL: "info"
# Incluir plantillas de seguridad gestionadas por GitLab
include:
- template: Security/SAST.gitlab-ci.yml
- template: Security/Secret-Detection.gitlab-ci.yml
- template: Security/Dependency-Scanning.gitlab-ci.yml
- template: Security/Container-Scanning.gitlab-ci.yml
- template: DAST.gitlab-ci.yml
- template: Security/License-Scanning.gitlab-ci.yml
build:
stage: build
image: docker:24.0
services:
- docker:24.0-dind
variables:
DOCKER_TLS_CERTDIR: "/certs"
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build -t $DOCKER_IMAGE .
- docker push $DOCKER_IMAGE
rules:
- if: $CI_COMMIT_BRANCH
unit-tests:
stage: test
image: $DOCKER_IMAGE
script:
- npm ci
- npm run test:coverage
coverage: '/Lines\s*:\s*(\d+\.?\d*)%/'
artifacts:
reports:
junit: junit-report.xml
coverage_report:
coverage_format: cobertura
path: coverage/cobertura-coverage.xml
# Sobrescribir SAST para ejecutarlo en la etapa de seguridad
sast:
stage: security
variables:
SAST_EXCLUDED_PATHS: "spec,test,tests,tmp,node_modules"
SEARCH_MAX_DEPTH: 10
# Sobrescribir escaneo de contenedores
container_scanning:
stage: security
variables:
CS_IMAGE: $DOCKER_IMAGE
CS_SEVERITY_THRESHOLD: "HIGH"
# Sobrescribir escaneo de dependencias
dependency_scanning:
stage: security
# Sobrescribir detección de secretos
secret_detection:
stage: security
# Escaneo de cumplimiento de licencias
license_scanning:
stage: security
deploy-staging:
stage: deploy-staging
image: bitnami/kubectl:latest
script:
- kubectl set image deployment/app app=$DOCKER_IMAGE -n staging
- kubectl rollout status deployment/app -n staging --timeout=300s
environment:
name: staging
url: https://staging.example.com
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
# DAST se ejecuta contra el entorno de pruebas desplegado
dast:
stage: dast
variables:
DAST_WEBSITE: https://staging.example.com
DAST_FULL_SCAN_ENABLED: "true"
DAST_BROWSER_SCAN: "true"
needs:
- deploy-staging
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
deploy-production:
stage: deploy-production
image: bitnami/kubectl:latest
script:
- kubectl set image deployment/app app=$DOCKER_IMAGE -n production
- kubectl rollout status deployment/app -n production --timeout=300s
environment:
name: production
url: https://app.example.com
when: manual
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
Políticas de Aprobación de Seguridad
Configura políticas de ejecución de escaneos para exigir escaneos de seguridad obligatorios:
- Navega a Seguridad y Cumplimiento > Políticas
- Crea una "Política de Ejecución de Escaneos" que requiera SAST y detección de secretos en todas las ramas
- Crea una "Política de Aprobación de Solicitudes de Fusión" que requiera la aprobación del equipo de seguridad cuando se detecten vulnerabilidades críticas
Configuración Personalizada de Reglas SAST
Crea .gitlab/sast-ruleset.toml para personalizar el comportamiento del analizador:
[semgrep]
[[semgrep.ruleset]]
dirs = ["src"]
[[semgrep.passthrough]]
type = "url"
target = "/sgrep-rules/custom-rules.yml"
value = "https://semgrep.dev/p/owasp-top-ten"
[[semgrep.passthrough]]
type = "url"
target = "/sgrep-rules/java-rules.yml"
value = "https://semgrep.dev/p/java"
Panel de Seguridad y Gestión de Vulnerabilidades
Informe de Vulnerabilidades
GitLab consolida todos los hallazgos de los escáneres en un único Informe de Vulnerabilidades accesible en Seguridad y Cumplimiento > Informe de Vulnerabilidades. Cada vulnerabilidad incluye:
- Clasificación de gravedad (Crítico, Alto, Medio, Bajo, Informativo)
- Fuente del escáner (SAST, DAST, Contenedor, Dependencia, Secreto)
- Ubicación en el código fuente o capa de imagen
- Guía de remediación y correcciones sugeridas
- Seguimiento de estado (Detectado, Confirmado, Descartado, Resuelto)
Widget de Seguridad en Solicitudes de Fusión
Cada solicitud de fusión muestra un widget de escaneo de seguridad que muestra:
- Nuevas vulnerabilidades introducidas por la MR
- Vulnerabilidades corregidas resueltas por la MR
- Comparación con la línea base de la rama objetivo
Optimización del Pipeline
- Ejecución en paralelo: Los escáneres de seguridad se ejecutan concurrentemente en la etapa de seguridad
- Caché: Usa caché de CI para descargas de dependencias y acelerar el escaneo
- Escaneo incremental: SAST puede escanear solo archivos modificados usando
SAST_INCREMENTAL: "true" - Condiciones de fallo: Establece
allow_failure: falseen escáneres críticos para imponer puertas de calidad
Monitoreo y Métricas
| Métrica | Descripción | Objetivo |
|---|---|---|
| Cobertura de seguridad del pipeline | Porcentaje de proyectos con todos los escáneres habilitados | > 95% |
| Tiempo medio de resolución (MTTR) de vulnerabilidades críticas | Tiempo desde la detección hasta la resolución de hallazgos críticos | < 48 horas |
| Tasa de falsos positivos | Porcentaje de hallazgos descartados como falsos positivos | < 15% |
| Tasa de bloqueo de detección de secretos | Porcentaje de commits de secretos bloqueados por reglas de push | > 99% |