Análisis de Vulnerabilidades usando Trivy
Desarrollo del tema

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
-
Ingrese al cluster asignado con las credenciales proporcionadas.
-
Configure la variable
KUBECONFIG.export KUBECONFIG=~/devcluster/kube_config_cluster.yml -
Verifique el acceso mediante comandos.
kubectl get namespaces
Inicio de laboratorio
-
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/trivysudo 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 trivydocker 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/ -
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 -
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/DockerfileFROM 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;"] -
Se genera la imagen:
sudo docker build -t johndoe/html-example:1.0 example-trivy/ --progress=plain --no-cache -
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 │ └───────────────┴────────────────┴──────────┴────────┴───────────────────┴───────────────┴───────────────────────────────────────────────────────────┘ -
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/DockerfileFROM 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;"] -
Se genera la imagen nuevamente con las remediaciones:
sudo docker build -t johndoe/html-example:2.0 example-trivy/ --progress=plain --no-cache -
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
-
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 -
Usando trivy, escanee imágenes en aplicaciones de los namespaces
applicationsyinfrapara detectar las vulnerabilidadesCVE-2021-28831yCVE-2016-9841. Escale aquellos Deployments que contengan cualquiera de estos a 0. -
Encuentre las imagenes de los deployments del namespace applications.
kubectl -n applications get pod -oyaml | grep image: -
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 -
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 -
Una vez encontradas las vulnerabilidades, escalar a 0 el primer deployment.
kubectl -n applications scale deploy web1 --replicas 0 kubectl get pods -n applications -
Encuentre las imagenes de los deployments del namespace infra.
kubectl -n infra get pod -oyaml | grep image: -
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 -
Una vez encontradas las vulnerabilidades, escalar a 0 el deployment.
kubectl -n infra scale deploy inf-hjk --replicas 0 kubectl get pods -n infra -
Limpiamos el ambiente:
kubectl delete -f kubernetes-security-i-vuln-scan/deployments.yaml kubectl delete -f kubernetes-security-i-vuln-scan/namespaces.yaml