Skip to content

Análisis de Vulnerabilidades usando Trivy

Desarrollo del tema

K8S-Trivy-Logo

Trivy es una herramienta open source que se enfoca en la detección de vulnerabilidades en paquetes a nivel del sistema operativo y en archivos de dependencias de diferentes lenguajes, acá entran imágenes de contenedores, Dockerfiles y otros artefactos relacionados con la seguridad.

Usos de la herramienta:

  • Identificar y corregir vulnerabilidades en las imágenes de contenedores antes de implementarlas en producción.

  • Integrarse en flujos de trabajo de CI/CD y DevSecOps para garantizar que las imágenes sean seguras.

  • Escanear dependencias de aplicaciones y detectar posibles riesgos.

Laboratorio: Análisis usando Trivy

Descripción

En la presente guía se creara una imagen de contenedor y se procederá con el respectivo análisis usando la herramienta Trivy.

Objetivos

  • Instalar Trivy y usarlo para analizar una imagen de contenedor.

Antes de comenzar

  • Contar con el acceso al ambiente del laboratorio.

Conexión hacia cluster

  1. Ingrese al cluster asignado con las credenciales proporcionadas.

  2. Configure la variable KUBECONFIG.

    export KUBECONFIG=~/devcluster/kube_config_cluster.yml
    
  3. Verifique el acceso mediante comandos.

    kubectl get namespaces
    

Inicio de laboratorio

  1. Instalación de Trivy, según necesidad:

    Instalación de binario Trivy

    curl -LO https://github.com/aquasecurity/trivy/releases/download/v0.41.0/trivy_0.41.0_Linux-64bit.tar.gz
    tar -xzf ./trivy_0.41.0_Linux-64bit.tar.gz
    chmod +x ./trivy
    mv ./trivy /usr/local/sbin/trivy
    
    sudo apt-get install wget apt-transport-https gnupg
    wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
    echo "deb [signed-by=/usr/share/keyrings/trivy.gpg] https://aquasecurity.github.io/trivy-repo/deb generic main" | sudo tee -a /etc/apt/sources.list.d/trivy.list
    sudo apt-get update
    sudo apt-get install trivy
    
    docker pull aquasec/trivy:0.18.3
    docker run --rm -v [YOUR_CACHE_DIR]:/root/.cache/ aquasec/trivy:0.18.3 [YOUR_IMAGE_NAME]
    
    helm repo add aquasecurity https://aquasecurity.github.io/helm-charts/
    
  2. Crearemos un Dockerfile y un archivo HTML de la siguiente manera, esto simulando que crearemos una imagen de una aplicación web:

    mkdir example-trivy; touch example-trivy/Dockerfile; touch example-trivy/index.html
    
  3. Con el editor de texto añadiremos el contenido según corresponda:

    • Se agrega el contenido del archivo HTML:
    vim example-trivy/index.html
    
    <!doctype html>
    <html>
      <head>
        <title>This is the title of the webpage!</title>
      </head>
      <body>
        <p>This is an example paragraph. Anything in the <strong>body</strong> tag will appear on the page, just like this <strong>p</strong> tag and its contents.</p>
      </body>
    </html>
    
    • Se agrega el contenido del Dockerfile:
    vim example-trivy/Dockerfile
    
    FROM alpine:3.19.1
    MAINTAINER John Doe "john_doe@gmail.com"
    RUN apk update && apk add --no-cache nginx
    COPY index.html /usr/share/nginx/html/
    EXPOSE 80
    CMD ["nginx", "-g", "daemon off;"]
    
  4. Se genera la imagen:

    sudo docker build -t johndoe/html-example:1.0 example-trivy/ --progress=plain --no-cache
    
  5. Se escanea la imagen recién creada con Trivy para buscar vulnerabilidades:

    trivy image johndoe/html-example:1.0
    
    • Se verá algo similar a lo siguiente:
    johndoe/html-example:1.0 (alpine 3.19.1)
    
    Total: 5 (UNKNOWN: 0, LOW: 2, MEDIUM: 3, HIGH: 0, CRITICAL: 0)
    
    ┌───────────────┬────────────────┬──────────┬────────┬───────────────────┬───────────────┬───────────────────────────────────────────────────────────┐
    │    Library     Vulnerability   Severity  Status  Installed Version  Fixed Version                            Title                           │
    ├───────────────┼────────────────┼──────────┼────────┼───────────────────┼───────────────┼───────────────────────────────────────────────────────────┤
    │ busybox        CVE-2023-42366  MEDIUM    fixed   1.36.1-r15         1.36.1-r16     busybox: A heap-buffer-overflow                           │
    │                                                                                    https://avd.aquasec.com/nvd/cve-2023-42366                │
    ├───────────────┤                                                                                                                               │
    │ busybox-binsh                                                                                                                                │
    │                                                                                                                                              │
    ├───────────────┼────────────────┼──────────┤        ├───────────────────┼───────────────┼───────────────────────────────────────────────────────────┤
    │ libcrypto3     CVE-2024-2511   LOW               3.1.4-r5           3.1.4-r6       openssl: Unbounded memory growth with session handling in │
    │                                                                                    TLSv1.3                                                   │
    │                                                                                    https://avd.aquasec.com/nvd/cve-2024-2511                 │
    ├───────────────┤                                                                                                                               │
    │ libssl3                                                                                                                                      │
    │                                                                                                                                              │
    │                                                                                                                                              │
    ├───────────────┼────────────────┼──────────┤        ├───────────────────┼───────────────┼───────────────────────────────────────────────────────────┤
    │ ssl_client     CVE-2023-42366  MEDIUM            1.36.1-r15         1.36.1-r16     busybox: A heap-buffer-overflow                           │
    │                                                                                    https://avd.aquasec.com/nvd/cve-2023-42366                │
    └───────────────┴────────────────┴──────────┴────────┴───────────────────┴───────────────┴───────────────────────────────────────────────────────────┘
    
  6. Con el editor de texto modificaremos el contenido según corresponda:

    • Se añaden remediaciones según el análisis de trivy en el Dockerfile:
    vim example-trivy/Dockerfile
    
    FROM alpine:3.19.1
    MAINTAINER John Doe "john_doe@gmail.com"
    RUN apk update && apk add --no-cache nginx && \
    apk fix --upgrade --no-cache busybox ssl_client libcrypto3 libssl3
    COPY index.html /usr/share/nginx/html/
    EXPOSE 80
    CMD ["nginx", "-g", "daemon off;"]
    
  7. Se genera la imagen nuevamente con las remediaciones:

    sudo docker build -t johndoe/html-example:2.0 example-trivy/ --progress=plain --no-cache
    
  8. Se escanea la imagen recién creada con Trivy para buscar vulnerabilidades:

    trivy image johndoe/html-example:2.0
    
    • Se verá algo similar a lo siguiente:
    johndoe/html-example:2.0 (alpine 3.19.1)
    
    Total: 0 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 0, CRITICAL: 0)
    

Análisis de Vulnerabilidades en Kubernetes

  1. Se crean los siguientes recursos en Kubernetes:

    git clone https://gitlab.com/itmlabs/kubernetes-security-i-vuln-scan.git
    kubectl apply -f kubernetes-security-i-vuln-scan/namespaces.yaml
    kubectl apply -f kubernetes-security-i-vuln-scan/deployments.yaml
    kubectl get pods -n applications
    kubectl get pods -n infra
    
  2. Usando trivy, escanee imágenes en aplicaciones de los namespaces applications y infra para detectar las vulnerabilidades CVE-2021-28831 y CVE-2016-9841. Escale aquellos Deployments que contengan cualquiera de estos a 0.

  3. Encuentre las imagenes de los deployments del namespace applications.

    kubectl -n applications get pod -oyaml | grep image:
    
  4. Escanee la imagen del primer deployment en busca de las vulnerabilidades.

    trivy image nginx:1.19.1-alpine-perl | grep CVE-2021-28831
    trivy image nginx:1.19.1-alpine-perl | grep CVE-2016-9841
    
  5. Escanee la imagen del segundo deployment en busca de las vulnerabilidades.

    trivy image nginx:1.20.2-alpine | grep CVE-2021-28831
    trivy image nginx:1.20.2-alpine | grep CVE-2016-9841
    
  6. Una vez encontradas las vulnerabilidades, escalar a 0 el primer deployment.

    kubectl -n applications scale deploy web1 --replicas 0
    kubectl get pods -n applications
    
  7. Encuentre las imagenes de los deployments del namespace infra.

    kubectl -n infra get pod -oyaml | grep image:
    
  8. Escanee la imagen del deployment en busca de las vulnerabilidades.

    trivy image httpd:2.4.39-alpine | grep CVE-2021-28831
    trivy image httpd:2.4.39-alpine | grep CVE-2016-9841
    
  9. Una vez encontradas las vulnerabilidades, escalar a 0 el deployment.

    kubectl -n infra scale deploy inf-hjk --replicas 0
    kubectl get pods -n infra
    
  10. Limpiamos el ambiente:

    kubectl delete -f kubernetes-security-i-vuln-scan/deployments.yaml
    kubectl delete -f kubernetes-security-i-vuln-scan/namespaces.yaml