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.

Inicio de laboratorio

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

    VERSION=$(curl -s https://api.github.com/repos/aquasecurity/trivy/releases/latest | grep '"tag_name"' | cut -d'"' -f4 | tr -d 'v')
    
    curl -fsSL https://github.com/aquasecurity/trivy/releases/download/v${VERSION}/trivy_${VERSION}_Linux-64bit.rpm -o trivy.rpm
    
    sudo rpm -ivh trivy.rpm
    
  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.21.3
    LABEL 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 && \
        apk upgrade --no-cache musl musl-utils zlib
    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/ --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.21.3)
    
    Total: 0 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 0, CRITICAL: 0)