Ai/automazione

CI/CD Segura: Checklist de 12 Puntos para GitLab y GitHub Actions (2026)

CI/CD Segura: Checklist de 12 Puntos para GitLab y GitHub Actions (2026)

Tokens de AWS con permisos de administrador en texto plano en un archivo .env commiteado a un GitHub público. Pipelines CI/CD con acceso a producción que cualquiera podía disparar. Este escenario, descubierto durante una auditoría de seguridad, no es una excepción, sino una realidad demasiado común. Las pipelines de Integración Continua y Entrega Continua (CI/CD) se han convertido en el corazón del desarrollo de software moderno, acelerando el lanzamiento y mejorando la calidad. Sin embargo, esta automatización trae consigo nuevas superficies de ataque, transformando cada pipeline en una potencial puerta trasera para el entorno de producción.

Ignorar la seguridad de las pipelines CI/CD significa exponer toda la infraestructura a riesgos significativos. Un informe de Snyk de 2024 reveló que el 68% de las organizaciones sufrió al menos un incidente de seguridad relacionado con la cadena de suministro de software en el último año. La mayoría de estos incidentes eran atribuibles a vulnerabilidades o configuraciones erróneas en las pipelines CI/CD. Como profesionales de TI, nuestra tarea no es solo implementar la automatización, sino garantizar su robustez y resiliencia contra las amenazas. Esta guía proporciona una checklist operativa de 12 puntos, enfocada en GitLab y GitHub Actions, para blindar tus pipelines y dormir más tranquilo.

Requisitos Previos / Entorno de Prueba

Para probar e implementar estas mejores prácticas, necesitarás un entorno de desarrollo con acceso a:

  • Un repositorio Git (GitHub o GitLab).
  • Un entorno CI/CD configurado (GitHub Actions o GitLab CI/CD).
  • Acceso a un Secret Manager (ej. HashiCorp Vault, AWS Secrets Manager, Azure Key Vault, Google Secret Manager) o a las funcionalidades nativas de gestión de secretos de tu plataforma CI/CD.
  • Herramientas de escaneo de seguridad para código y dependencias (ej. Snyk, Trivy, Gitleaks).
  • Herramientas para la generación de SBOM (ej. Syft) y para la firma de imágenes de contenedores (ej. Cosign).

1-2. Gestión de Secrets: Nunca en Texto Plano, Usa Vault o Secret Manager Nativos

La gestión de secretos es, probablemente, el punto más crítico en la seguridad de las pipelines CI/CD. Commitear credenciales, API key o tokens directamente en el código fuente, incluso en archivos .env o configuraciones privadas, es un error gravísimo. Estos secretos pueden terminar por error en repositorios públicos o ser expuestos durante un breach.

Acción: Utiliza un Secret Manager dedicado. Plataformas como HashiCorp Vault ofrecen una solución centralizada y robusta para la gestión de secretos. Alternativamente, tanto GitHub Actions como GitLab CI/CD ofrecen funcionalidades nativas para la gestión de secretos, que deberían ser la primera opción si no dispones de un Secret Manager externo.

Ejemplo (GitHub Actions):

Los secretos se configuran en la interfaz web del repositorio y se referencian en el workflow:

name: Desplegar Aplicación
on: [push]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Desplegar en AWS
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        run: |
          aws s3 sync ./build s3://my-secure-bucket

Acción: Implementa herramientas de análisis estático (SAST) que incluyan la detección de secretos. gitleaks es una excelente herramienta open source para este propósito. Ejecuta un escaneo regularmente en tu codebase para asegurarte de que ningún secreto haya terminado accidentalmente en el repositorio.

# Escanear secretos expuestos en el código
gitleaks detect --source . --verbose

Este comando analiza el repositorio actual en busca de patrones que coincidan con secretos conocidos, proporcionando un informe detallado.

3-4. Runners Seguros y Aislados

Los runners son las máquinas virtuales o los contenedores que ejecutan las operaciones definidas en la pipeline. Su seguridad es fundamental.

Acción: No compartas runners entre proyectos con diferentes niveles de sensibilidad o entre entornos de desarrollo y producción. Para los entornos de producción, considera el uso de runners self-hosted dedicados o runners efímeros que se crean y destruyen para cada job. Esto reduce la superficie de ataque y previene la persistencia de malware o artefactos comprometidos.

Acción: Aplica hardening a los runners. Limita el acceso a la red, deshabilita servicios no necesarios, mantén el sistema operativo y el software actualizados y utiliza un filesystem root de solo lectura donde sea posible. GitLab ofrece la posibilidad de configurar config.toml para los runners self-hosted, permitiendo un control granular sobre sus capacidades y seguridad.

5-6. Gestión de Dependencias: Lock Files, Escaneo de Vulnerabilidades y SBOM

La cadena de suministro del software es un vector de ataque cada vez más explotado. Dependencias vulnerables pueden comprometer toda la aplicación.

Acción: Utiliza lock files (ej. package-lock.json, Gemfile.lock, requirements.txt.hash) para fijar las versiones exactas de todas las dependencias. Esto garantiza que las builds sean reproducibles y previene la introducción automática de nuevas vulnerabilidades a través de actualizaciones no controladas.

Acción: Integra escáneres de vulnerabilidades de dependencias en la pipeline. Herramientas como Snyk, OWASP Dependency-Check o Trivy pueden identificar CVEs conocidas en las librerías utilizadas. Además, genera un Software Bill of Materials (SBOM) para cada build. Un SBOM proporciona un inventario completo de todos los componentes de software incluidos en tu artefacto, facilitando la gestión de vulnerabilidades y la conformidad.

# SBOM con Syft
syft myimage:latest -o spdx-json > sbom.json

Este comando crea un SBOM en formato SPDX para la imagen Docker especificada, útil para rastrear todas las dependencias.

7-8. Imágenes de Contenedores Reproducibles y Firmadas

Si tu pipeline produce imágenes de contenedores, su integridad y autenticidad son cruciales.

Acción: Asegúrate de que las builds de las imágenes de contenedores sean reproducibles (determinísticas). Esto significa que, dado el mismo Dockerfile y los mismos inputs, siempre debería generarse la misma imagen binaria. Esto es fundamental para la verificación y la auditabilidad.

Acción: Firma las imágenes de contenedores con herramientas como Cosign (parte del proyecto Sigstore). La firma digital garantiza que la imagen no ha sido manipulada después de la build y que proviene de una fuente de confianza. La verificación de la firma debería ser un gate obligatorio antes del deployment en producción.

# Firmar imagen con Cosign
cosign sign --key cosign.key myregistry/myimage:latest

# Verificar firma
cosign verify --key cosign.pub myregistry/myimage:latest

Estos comandos demuestran cómo firmar y verificar la integridad de una imagen de contenedor, un paso esencial para la seguridad de la cadena de suministro.

9-10. Permisos Mínimos (Least Privilege) en Tokens y Cuentas

El principio del least privilege es un pilar de la seguridad y se aplica de forma crítica también a las pipelines CI/CD.

Acción: Configura los tokens y las cuentas utilizados por la pipeline con los permisos mínimos indispensables para realizar su trabajo. Por ejemplo, un token de deployment no debería tener permisos para eliminar todo un bucket S3 o deshabilitar instancias EC2. Un error común es usar un token con permisos de administrador por simplicidad, pero esto crea un enorme riesgo en caso de compromiso del token.

Ejemplo (GitHub Actions: permisos mínimos):

permissions:
  contents: read
  packages: write
  # Añade solo los permisos estrictamente necesarios para el job específico

Este bloque YAML define los permisos mínimos para el workflow, limitando el acceso del token a los repositorios y a los paquetes.

Acción: Rota regularmente los secretos y los tokens. Aunque un token con permisos mínimos sea comprometido, una rotación frecuente reduce la ventana de exposición y el impacto potencial.

11-12. Audit Log y Alerting sobre Pipelines Fallidas

La visibilidad es un componente clave de la seguridad. Saber qué sucede en tus pipelines, especialmente en caso de fallo o actividades sospechosas, es fundamental.

Acción: Habilita audit logs detallados para todas las actividades de la pipeline. Estos logs deberían capturar quién ejecutó qué, cuándo y con qué resultado. Integra estos logs con tu SIEM o sistema de monitoreo centralizado para análisis y correlación.

Acción: Configura alerting proactivos para eventos críticos. Estos incluyen:

  • Fallos inesperados de la pipeline (podrían indicar un intento de manipulación o un problema de seguridad).
  • Accesos no autorizados a los runners o a los secretos.
  • Modificaciones en las configuraciones de la pipeline o en los archivos de workflow.
  • Detección de vulnerabilidades críticas por parte de los escáneres.

Una alerta temprana puede marcar la diferencia entre una pequeña anomalía y un incidente de seguridad a gran escala. En un entorno empresarial con 2.000 endpoints, un alerting eficaz en las pipelines permitió bloquear un intento de inyección de código malicioso en una imagen de contenedor antes de que llegara a producción, ahorrando horas de rollback y un potencial data breach.

Errores Comunes y Resolución de Problemas

  • Secretos commiteados por error: Utiliza git filter-repo o bfg-repo-cleaner para eliminar secretos del historial de Git, pero considera que los secretos podrían haber sido ya expuestos. La rotación inmediata es obligatoria.
  • Runners expuestos: Verifica las reglas del firewall y los grupos de seguridad para los runners self-hosted. Asegúrate de que solo los puertos necesarios estén abiertos y solo a direcciones IP autorizadas.
  • Falsos positivos en los escáneres: Configura las baselines y las excepciones para los escáneres de vulnerabilidades, pero ten cuidado de no ignorar alertas reales. Implementa un proceso de triaging para cada vulnerabilidad detectada.

Conclusiones con Puntos Clave Operativos

Mejorar la seguridad de las pipelines CI/CD no es una actividad única, sino un proceso continuo. Cada punto de esta checklist representa una oportunidad para reforzar las defensas y reducir el riesgo. La automatización no debe sacrificar la seguridad; al contrario, una pipeline bien diseñada puede integrar controles de seguridad robustos desde las primeras fases del desarrollo. Adoptar estas 12 mejores prácticas te permitirá construir un proceso de entrega de software más resiliente y fiable, protegiendo tu infraestructura y tus datos.

Lee también: Lynis Audit Linux: Guía Práctica de Hardening 2026

Actualizado: julio de 2026

Comparte este artículo:

Escrito por

Rosario Giordano

Rosario Giordano es administrador de sistemas y consultor de TI especializado en c iberseguridad y cloud, con más de 20 años de experiencia en la gestión de infraestructuras Linux empresariales. Sus áreas de especialización incluyen el hardening de SSH, plataformas Kubernetes , bases de datos PostgreSQL, virtualización con VMware/Proxmox y el cumplimiento de los marcos de seguridad NIS2 e ISO 27001.