Dev.to Security 🔐 Cybersecurity 👁 0 📖 5 min read

Implementación de DevSecOps con Bearer SAST y GitHub Actions: De la Detección a la Remediación

Autor: Saúl Jose Alvarado Urbano Autor: Ana Cecilia Esteban Ramos Repositorio: github.com/saulalvarado1/Bearer_Articulo API en Vivo: bearer-articulo.onrender.com Resumen (Abstract) En el desarrollo de softw

Implementación de DevSecOps con Bearer SAST y GitHub Actions: De la Detección a la Remediación

Autor: Saúl Jose Alvarado Urbano
Autor: Ana Cecilia Esteban Ramos
Repositorio: github.com/saulalvarado1/Bearer_Articulo

API en Vivo: bearer-articulo.onrender.com

Resumen (Abstract)

En el desarrollo de software moderno, la seguridad ya no puede ser una fase tardía o una auditoría aislada antes del lanzamiento a producción. El paradigma Shift-Left propone integrar la seguridad desde las primeras etapas del ciclo de vida del desarrollo de software (SSDLC).

En este artículo técnico presentamos la implementación práctica de un flujo DevSecOps completo para una API REST construida con Node.js y Express. Configuramos un pipeline de Integración Continua (CI) en GitHub Actions utilizando Bearer CLI, una herramienta avanzada de Análisis Estático de Seguridad de Aplicaciones (SAST) especializada en la detección de fallas OWASP Top 10 y riesgos de privacidad/fuga de datos (PII). Demostramos cómo el pipeline bloquea automáticamente código vulnerable ante una fuga de credenciales en logs (CWE-134 / Insecure Logging), y cómo se aplica la remediación para alcanzar un despliegue seguro.

1. Arquitectura y Stack Tecnológico

El flujo implementado conecta las herramientas de desarrollo, análisis estático y automatización:

[ Desarrollador ] 
       │  (git push)
       ▼
[ GitHub Repository ] 
       │  (Trigger Workflow)
       ▼
[ GitHub Actions Runner ]
       │
       ├─► 1. Checkout de Código
       ├─► 2. Escaneo SAST con Bearer CLI
       │      ├── ¿Hay vulnerabilidades HIGH / CRITICAL?
       │      ├── [SÍ] ──► ❌ PIPELINE FALLA (Bloqueo de despliegue)
       │      └── [NO] ──► ✅ PIPELINE EXITOSO
       ▼
[ Despliegue en la Nube (Render / Cloud SaaS) ]

Componentes:

  • Backend: Node.js & Express (API modular y ligera).
  • Herramienta SAST: Bearer CLI (Motor de análisis de flujo de datos sensibles y patrones de vulnerabilidad).
  • Orquestador CI/CD: GitHub Actions (Automatización de pruebas y compuertas de calidad).
  • Entorno Cloud: Render (Plataforma como Servicio - PaaS para despliegue continuo).

2.Configuración del Pipeline de Seguridad (CI)

Para automatizar la verificación de seguridad en cada cambio de código, definimos el flujo en el archivo .github/workflows/bearer-scan.yml:

yaml
name: Bearer SAST Scan & Security Pipeline

on:
  push:
    branches: [ "main", "master" ]
  pull_request:
    branches: [ "main", "master" ]

jobs:
  security_scan:
    name: Bearer SAST Security Analysis
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v4

      - name: Run Bearer CLI Scanner
        uses: bearer/bearer-action@v2
        with:
          # Falla el pipeline si encuentra vulnerabilidades de severidad alta o crítica
          severity: "high,critical"
          # Escanea todo el repositorio
          diff: false

¿Por qué Bearer?

A diferencia de los linters tradicionales o analizadores puramente sintácticos, Bearer rastrea el flujo de datos (dataflow) desde las fuentes de entrada (sources) hasta los puntos de salida (sinks). Esto le permite identificar con precisión si información personal identificable (PII), secretos o credenciales están siendo expuestos o mal manejados.

3. Caso Práctico: Introducción Intencional de una Vulnerabilidad

En el endpoint de autenticación (/api/login), se simuló un error común pero crítico en el desarrollo de software: el registro no sanitizado de credenciales de usuario para fines de depuración (debugging).

Código vulnerable original (server.js):

app.post('/api/login', (req, res) => {
  const { email, password } = req.body;

  if (!email || !password) {
    return res.status(400).json({ error: 'Email y contraseña requeridos' });
  }

  // ALERTA SAST: Imprimir contraseñas y PII en logs estándar (CWE-134 / CWE-532)
  console.log(`[AUTH-LOG] Intento de login para usuario: ${email} con credencial: ${password}`);

  const user = users.find(u => u.email === email);
  if (user && password === 'admin123') {
    return res.json({
      message: 'Autenticación exitosa',
      token: 'jwt-simulated-token-bearer-demo',
      user: { id: user.id, email: user.email, name: user.name }
    });
  }

  return res.status(401).json({ error: 'Credenciales inválidas' });
});

4. Detección y Bloqueo en GitHub Actions (Compuerta de Calidad)

Detección de vulnerabilidad Bearer SAST

Al realizar el push hacia el repositorio remoto, el runner de GitHub Actions ejecutó el escaneo de Bearer.

Resultado del Análisis:

Bearer detectó la vulnerabilidad de severidad HIGH y finalizó el proceso con código de salida 1, deteniendo inmediatamente la integración:

HIGH: Unsanitized user input in format string [CWE-134]
https://docs.bearer.com/reference/rules/javascript_lang_format_string_using_user_input

File: server.js:54
54  console.log(`[AUTH-LOG] Intento de login para usuario: ${email} con credencial: ${password}`);

87 checks, 1 findings
CRITICAL: 0
HIGH: 1 (CWE-134)
Error: Process completed with exit code 1.

Impacto de Seguridad: Registrar credenciales en texto claro (password) y datos no sanitizados en los flujos de salida del servidor viola normas de cumplimiento como GDPR, HIPAA y PCI-DSS, además de exponer los datos en sistemas centralizados de agregación de logs (CloudWatch, Datadog, ELK).

5. Fase de Remediación (Fix)

Para resolver el problema sin comprometer la trazabilidad de eventos del sistema, aplicamos el principio de Mínimo Privilegio en Logs:

  1. Eliminar completamente el registro de contraseñas u otros datos sensibles.
  2. Evitar concatenaciones de cadenas no sanitizadas con datos directos provenientes del cliente.
  3. Registrar únicamente el evento de autenticación genérico.

Código corregido (server.js):

app.post('/api/login', (req, res) => {
  const { email, password } = req.body;

  if (!email || !password) {
    return res.status(400).json({ error: 'Email y contraseña requeridos' });
  }

  // PRÁCTICA SEGURA: Registro de eventos sin exponer datos sensibles ni formatos dinámicos
  console.log('[AUTH-LOG] Intento de login');

  const user = users.find(u => u.email === email);
  if (user && password === 'admin123') {
    return res.json({
      message: 'Autenticación exitosa',
      token: 'jwt-simulated-token-bearer-demo',
      user: { id: user.id, email: user.email, name: user.name }
    });
  }

  return res.status(401).json({ error: 'Credenciales inválidas' });
});

6. Verificación de Seguridad y Aprobación del Pipeline

El equipo subió la remediación mediante el commit:
fix: remove sensitive login data from logs

Resultado del nuevo escaneo:

  • Checks ejecutados: 87
  • Hallazgos Críticos: 0
  • Hallazgos Altos: 0
  • Estado del Pipeline: SUCCESS (Verde ✅)

Pipeline exitoso en GitHub Actions

Al no encontrarse infracciones de severidad alta o crítica, el pipeline aprueba los artefactos y autoriza el paso al despliegue continuo en la nube pública.

7. Lecciones Aprendidas y Buenas Prácticas DevSecOps

  1. La seguridad como código (Security as Code): Definir políticas de escaneo en archivos versionables (.yml) garantiza consistencia y auditoría en cada contribución.
  2. Retroalimentación temprana: Detectar vulnerabilidades en el momento del pull request reduce drásticamente el costo temporal y financiero de mitigar incidentes en producción.
  3. Equilibrio entre seguridad y velocidad: Configurar filtros de severidad (high,critical) previene falsos positivos que puedan frenar innecesariamente el ritmo de entrega del equipo de ingeniería.
  4. Protección de PII: Las herramientas modernas de SAST deben comprender el contexto de privacidad y no limitarse únicamente a inyecciones SQL o XSS tradicionales.

Recursos y Enlaces

📰 Read the original article on Dev.to Security

Originally published by Dev.to Security. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.