DevSecOps

¿Qué es DevSecOps?

Qué es DevSecOps?

Seguridad integrada en el SLDC

DevSecOps vs SecDevOps

Visiones

People, Process, Technology, Governance

¿Qué es DevOps?

DevOps

¿Qué es DevOps?

  • Development + Operations

    • Concepción > Desarrollo > Entrega
  • Procesos ágiles

    • Lean manufacturing
📙 Definiciones
Desarrollo Se refiere al proceso de crear software, donde los desarrolladores escriben y actualizan el código fuente de las aplicaciones.
Operaciones Se centran en la gestión y mantenimiento de los sistemas y la infraestructura en los que se ejecuta el software. Incluye tareas como la configuración, el monitoreo y la resolución de problemas.

¿Qué es DevOps?

Elementos clave en DevOps

  • Deployment (despliegues) frecuentes
  • Pruebas automáticas
    • TDD: Test-driven design
    • BDD: Behavior-driven design
  • CI/CD: Continuous Integration + Continuous Delivery
  • Feedback de usuarios
  • Monitorización de apps/infraestructura

¿Qué significan integración, entrega (delivery) y despliegue (deployment)?

On your marks

On your marks, get set,... go!

📙 Definiciones
Integración continua Llevar automáticamente los cambios de varios desarrolladores en el código de una aplicación a un repositorio compartido para cada nueva versión.
Entrega continua Trasladar la aplicación de software desde el entorno de desarrollo y dejarla disponible para su despliegue en un entorno de producción. Incluye pruebas, empaquetado y preparación de cada release.
Despliegue Instalación de una aplicación en su entorno de producción, ya sea en un servidor, un conjunto de servidores, un contenedor, la nube, etc.
Superhero

¿DevOps es un nuevo rol?

¿Por qué DevOps?

Ahí llevas eso

Motivación

  • Sistemas frágiles

    Falta de comunicación y herramientas

    Despliegues complejos y propensos a errores

  • Deuda técnica

  • Arquitectura poco sólida

  • Requisitos no funcionales poco solventes

📙 Definiciones
Deuda técnica Decisiones tomadas durante el desarrollo de un software que, en el corto plazo, permiten un desarrollo más rápido o una solución temporal, pero que crean problemas a largo plazo en términos de NFR
Requisitos No Funcionales (NFR) Aspectos que no están relacionados directamente con la funcionalidad de un sistema software, sino con características no directamente vinculados a sus funciones específicas (rendimiento, usabilidad, confiabilidad, seguridad, eficiencia, etc.)
Arquitectura software Estructura y diseño organizativo de un sistema de software, sobre cómo sus componentes interactúan entre sí y cómo se organizan para lograr sus objetivos de manera efectiva. Proporciona un marco conceptual para abordar aspectos de los NFR.
DevOps culture

Cultura DevOps

Definición de Donovan Brown

DevOps es la unión de personas, procesos y productos para una entrega continua de valor a los usuarios finales

  • Procesos con Agilidad
  • Personas en Colaboración
  • Productos con Herramientas

CI/CD: Continous Integration / Continuous Delivery

  • Continuous integration (CI)
  • Continuous delivery (CD)
  • Continuous deployment

Cada proceso tiene su propio pipeline

Pipeline de CI

CI pipeline

Pipeline de CD

CD pipeline

Continuous Deployment

CDEP pipeline

Ejemplo de pipeline CI/CD

name: CI Security Pipeline

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Run static analysis (SAST)
        uses: sonarsource/sonarqube-scan-action@v1.0

      - name: Dependency vulnerability scan
        uses: snyk/actions/python@master
        with:
          command: test
📙 Definiciones
Build acción de compilar y ensamblar el código fuente de una aplicación en un formato ejecutable o en un conjunto de artefactos que se pueden utilizar en un entorno de ejecución específico
Pipeline un conjunto automatizado y secuencial de procesos que permiten la ejecución de tareas específicas. Analogía de una línea de montaje de la industria de fabricación
Staging entorno de prueba que replica el entorno de producción para realizar pruebas finales (con usuarios) antes del despliegue
📙 Definiciones
Artefacto resultado del build. Pueden ser binarios ejecutables, bibliotecas, paquetes de instalación, etc., necesarios para ejecutar la aplicación
Release una versión específica y completa de una aplicación o software que se considera lista para ser distribuida y utilizada por los usuarios finales
Release Candidate (RC) release con el potencial de convertirse en la versión final o lanzamiento si no se encuentran problemas significativos durante las pruebas

Infrastructure as Code (IaC)

Buenas prácticas de IaC

  • Automatizar todo en el código
  • SCM: Source Control Manager
  • Guardar el código junto al de la aplicación
  • Código de la IaC debe ser idempotente
  • Integrar con CI/CD

Ejemplo usando terraform

  • Recurso de Amazon AWS ECS (Elastic Container Service) (sección aws_ecs_service)
  • El servicio despliega un contenedor Docker (sección aws_ecs_task_definition)
  • El contenedor Docker ejecuta un servidor nginx en el puerto 80 (configuración de container_definitions)
  • Solo el tráfico HTTPS está permitido
  • El acceso a la instancia de ECS esté restringido solo a direcciones IP específicas (sección network_configuration)
provider "aws" {
  region = "West Europe" # Cambia esto según tu región de AWS
}

resource "aws_ecs_cluster" "example_cluster" {
  name = "example-cluster"
}

resource "aws_ecs_task_definition" "example_task" {
  family                   = "example-task"
  network_mode             = "bridge"
  requires_compatibilities = ["EC2"]
...
...
  container_definitions = <<EOF
[
  {
    "name": "example-container",
    "image": "nginx:latest",
    "portMappings": [
      {
        "containerPort": 80,
        "hostPort": 80
      }
    ]
  }
]
EOF
}
...
...
resource "aws_ecs_service" "example_service" {
  name            = "example-service"
  cluster         = aws_ecs_cluster.example_cluster.id
  task_definition = aws_ecs_task_definition.example_task.arn
  launch_type     = "EC2"
  desired_count   = 1

  network_configuration {
    # Coloca las ID de tus subredes aquí
    subnets         = ["subnet-xxxxxxxxxxxxxx", "subnet-yyyyyyyyyyyyyy"]
    # Coloca la ID de tu grupo de seguridad aquí
    security_groups = ["sg-xxxxxxxxxxxxxxxxx"]                           
  }
}

Ejemplo de configuración insegura (Terraform)

resource "aws_s3_bucket" "data" {
  bucket = "example-bucket"
  acl    = "public-read"   # ❌ Exposición innecesaria
}

Configuración más segura:

resource "aws_s3_bucket" "data" {
  bucket = "example-bucket"
  acl    = "private"
  versioning {
    enabled = true
  }
}

Provisioning (aprovisionamiento)

Ejemplo con Docker

Dockerfile:

FROM ubuntu
RUN apt-get update
RUN apt-get install -y nginx
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
EXPOSE 80

Ejemplo de provisioning inseguro (Dockerfile)

FROM ubuntu:latest
RUN apt-get update && apt-get install -y python3
COPY . /app
CMD ["python3", "/app/server.py"]

Configuración más segura:

FROM python:3.11-slim
WORKDIR /app
COPY . /app
RUN pip install --no-cache-dir -r requirements.txt
CMD ["python", "server.py"]

Detectar vulnerabilidades:

docker scan myapp:latest
# o con Trivy:
trivy image myapp:latest

Gestión segura de dependencias

Riesgo:

pip install requests==2.18.0

Escaneo y actualización:

pip install safety
safety check

Salida:

→ requests (<=2.19.1)
   CVE-2018-18074 - Session credential leakage
   fixed in: 2.20.0
📙 Definiciones
IaC práctica en la que la infraestructura de sistemas, redes y otros recursos tecnológicos se gestiona y aprovisiona utilizando código y archivos de configuración en lugar de realizar configuraciones manuales o a través de interfaces gráficas
Provisioning proceso de preparar y configurar de manera automática los recursos de infraestructura necesarios para ejecutar una aplicación o servicio

CI/CD pipeline tools para DevSecOps

  • SAST: Static Application Security Testing
  • SCA: Software Composition Analysis (or Dependency Analysis)
  • DAST: Dynamic AST
  • IAST: Interactive AST
  • IaC/Container Vulnerability Scanning

SAST

Papel de SAST en el SDLC

Tratar los síntomas: pensar en la seguridad después de que el software se ha construido no es lo más correcto

Tratar la causa: pensar pronto en la seguridad, durante las actividades dedicadas al desarrollo y construcción del software

Aquí es donde el SAST hace su función para la seguridad

¿Por qué preocuparnos tanto si la IA ya sabe programar?

Ejemplo con Copilot

  1. Abrir código fuente Python con VSCode
    • server-side-request.py
    • temporary-file-creation.py
    • cryptographic-key-generation.py
  2. Comprobar las reglas SounarSource:
    • RSPEC-5144: Server-side requests should not be vulnerable to forging attacks
    • RSPEC-5445: Insecure temporary file creation methods should not be used
    • RSPEC-4426: Cryptographic key generation should be based on strong parameters
  3. Probar copilot...

Importancia del SAST

  • La IA aprende a programar metiendo bugs
  • El código con que se entrega a los modelos de ML para generar código es código no está libre de problemas de seguridad
  • Hay que analizar todo el código generado y que el programador tenga siempre la última palabra

Copilot y su código inseguro o cómo la IA aprende a programar (también) metiendo Bugs

SonarQube

SonarQube

Herramienta automática de revisión de código

  • Análisis estático de métricas de calidad

  • Clean code

  • Refactoring

Análisis para detectar...

  • Bugs
  • Security hotspots
  • Vulnerabilidades
  • Code smells
  • Duplicación de código
  • Etc.

Bug vs vulnerability vs code smell: Deprecated!

Security hotspot

Código sensible que no impacta necesariamente en la seguridad

Vulnerabilidad

Problema que impacta en la seguridad y debe ser arreglado

Security hotspot

Código sensible que no impacta necesariamente en la seguridad

Vulnerabilidad

Problema que impacta en la seguridad y debe ser arreglado

Clean code

SonarQube clean code

  • Clean code attributes
  • Software qualities
  • Issues

SCA

Software Composition Analysis (SCA)

  • Proceso automático que identifica y analiza las dependencias de un proyecto

  • Busca y repara vulnerabilidades existentes en las dependencias (componentes) de un proyecto

  • Monitoriza continuamente las dependencias y permite corregirlas rápidamente cuando se descubren nuevas vulnerabilidades

Snyk.io

Snyk.io

Deep SAST

Deep SAST

  • Vulnerabilidades taint (contaminación)
  • Frameworks y bibliotecas
  • Dependencias transitivas
  • SCA no es suficiente: solo vulnerabilidades en BD públicas

Hidden Security Vulnerabilities

Deep SAST issue 1

SQL injection

Deep SAST issue 2

Deserialization