Cómo usar el comando docker scout cves para encontrar vulnerabilidades

DockerDockerBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderá cómo utilizar de manera efectiva el comando docker scout cves para identificar vulnerabilidades en sus imágenes de Docker y artefactos relacionados. Comenzaremos analizando las vulnerabilidades directamente en una imagen de Docker, demostrando cómo descargar una imagen vulnerable y utilizar un escáner de seguridad como Trivy para encontrar posibles problemas.

A continuación, explorará cómo analizar las vulnerabilidades a partir de un archivo tarball de docker save y un directorio OCI, mostrando la flexibilidad del comando docker scout cves en diferentes formatos. Finalmente, aprenderá cómo exportar el informe de vulnerabilidades a un archivo JSON SARIF para su posterior procesamiento y cómo mostrar las vulnerabilidades con sus puntuaciones EPSS asociadas para priorizar los esfuerzos de remediación.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/VolumeOperationsGroup(["Volume Operations"]) docker/ContainerOperationsGroup -.-> docker/ls("List Containers") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/images("List Images") docker/ImageOperationsGroup -.-> docker/save("Save Image") docker/VolumeOperationsGroup -.-> docker/cp("Copy Data Between Host and Container") subgraph Lab Skills docker/ls -.-> lab-555202{{"Cómo usar el comando docker scout cves para encontrar vulnerabilidades"}} docker/pull -.-> lab-555202{{"Cómo usar el comando docker scout cves para encontrar vulnerabilidades"}} docker/images -.-> lab-555202{{"Cómo usar el comando docker scout cves para encontrar vulnerabilidades"}} docker/save -.-> lab-555202{{"Cómo usar el comando docker scout cves para encontrar vulnerabilidades"}} docker/cp -.-> lab-555202{{"Cómo usar el comando docker scout cves para encontrar vulnerabilidades"}} end

Analizar vulnerabilidades en una imagen de Docker

En este paso, aprenderemos cómo analizar vulnerabilidades en una imagen de Docker utilizando Trivy. Trivy es un escáner de seguridad completo y versátil. Puede detectar vulnerabilidades en paquetes del sistema operativo (Alpine, RHEL, CentOS, Debian, Ubuntu, etc.) y dependencias de aplicaciones (Bundler, Composer, npm, yarn, etc.). Además, Trivy admite varios objetivos de análisis, como imágenes de contenedores, sistemas de archivos y repositorios Git.

Primero, descarguemos una imagen de Docker vulnerable que utilizaremos para el análisis. Utilizaremos la imagen library/ubuntu:18.04, que se sabe que tiene algunas vulnerabilidades.

docker pull library/ubuntu:18.04

Debería ver una salida que indique que la imagen se está descargando.

18.04: Pulling from library/ubuntu
...
Status: Downloaded newer image for ubuntu:18.04
docker.io/library/ubuntu:18.04

Ahora que tenemos la imagen, necesitamos instalar Trivy. Dado que Trivy no está preinstalado en el entorno de LabEx, lo descargaremos e instalaremos. Descargaremos la última versión desde el repositorio oficial de GitHub.

wget https://github.com/aquasecurity/trivy/releases/download/v0.50.1/trivy_0.50.1_Linux-64bit.deb

Este comando descarga el paquete Debian de Trivy. Debería ver una salida similar a esta:

--2023-10-27 08:00:00--  https://github.com/aquasecurity/trivy/releases/download/v0.50.1/trivy_0.50.1_Linux-64bit.deb
Resolving github.com (github.com)... 140.82.113.4
Connecting to github.com (github.com)|140.82.113.4|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://objects.githubusercontent.com/github-production-release-asset-2e65be/140000000/...?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=... [following]
--2023-10-27 08:00:00--  https://objects.githubusercontent.com/github-production-release-asset-2e65be/140000000/...
Resolving objects.githubusercontent.com (objects.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ...
Connecting to objects.githubusercontent.com (objects.githubusercontent.com)|185.199.108.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 50000000 (48M) [application/octet-stream]
Saving to: ‘trivy_0.50.1_Linux-64bit.deb’

trivy_0.50.1_Linux-64bit.deb 100%[=================================================>]  47.68M  --.-MB/s    in 0.5s

2023-10-27 08:00:01 (95.3 MB/s) - ‘trivy_0.50.1_Linux-64bit.deb’ saved [50000000/50000000]

Ahora, instale el paquete descargado utilizando dpkg.

sudo dpkg -i trivy_0.50.1_Linux-64bit.deb

Debería ver una salida que indique el proceso de instalación.

Selecting previously unselected package trivy.
(Reading database ... 100000 files and directories currently installed.)
Preparing to unpack trivy_0.50.1_Linux-64bit.deb ...
Unpacking trivy (0.50.1) ...
Setting up trivy (0.50.1) ...

Con Trivy instalado, ahora podemos escanear la imagen de Docker library/ubuntu:18.04 en busca de vulnerabilidades.

trivy image library/ubuntu:18.04

Trivy comenzará a escanear la imagen. Esto puede tomar unos momentos mientras descarga las bases de datos de vulnerabilidades y analiza las capas de la imagen. Verá una salida que muestra el progreso y luego un informe detallado de las vulnerabilidades encontradas.

2023-10-27T08:00:05.000+0000    INFO    Need to update DB
2023-10-27T08:00:05.000+0000    INFO    Downloading DB...
...
2023-10-27T08:00:10.000+0000    INFO    Detected OS: ubuntu
2023-10-27T08:00:10.000+0000    INFO    Detecting Ubuntu vulnerabilities...
...
library/ubuntu:18.04 (ubuntu 18.04)
===================================
Total: 100 (UNKNOWN: 0, LOW: 50, MEDIUM: 30, HIGH: 15, CRITICAL: 5)

┌───────────────────────────────────────────────────┬─────────────────────────────────┬──────────┬───────────────────┬───────────────────────────────────────────────────────────┐
│                 Library/Package                   │              Vulnerability              │ Severity │ Installed Version │                       Fixed Version                       │
├───────────────────────────────────────────────────┼─────────────────────────────────┼──────────┼───────────────────┼───────────────────────────────────────────────────────────┤
│ apt                                               │ CVE-YYYY-XXXX                   │ HIGH     │ 1.6.12            │ 1.6.14                                                    │
│ ...                                               │ ...                             │ ...      │ ...               │ ...                                                       │
└───────────────────────────────────────────────────┴─────────────────────────────────┴──────────┴───────────────────┴───────────────────────────────────────────────────────────┘

La salida proporciona un resumen del total de vulnerabilidades encontradas, categorizadas por gravedad (DESCONOCIDO, BAJA, MEDIA, ALTA, CRÍTICA). Luego enumera cada vulnerabilidad con detalles como el paquete afectado, el ID de la vulnerabilidad (por ejemplo, CVE-YYYY-XXXX), el nivel de gravedad, la versión instalada del paquete y la versión corregida si está disponible. Este informe le ayuda a entender la postura de seguridad de su imagen de Docker e identificar áreas que necesitan remediación.

Analizar vulnerabilidades desde un archivo tarball de docker save

En este paso, aprenderemos cómo analizar vulnerabilidades de una imagen de Docker guardada como un archivo tarball. Esto es útil cuando necesitas escanear una imagen que no está directamente disponible en un registro de Docker o en el demonio de Docker local, pero tienes la imagen guardada como un archivo.

Primero, necesitamos guardar la imagen de Docker library/ubuntu:18.04 que descargamos en el paso anterior en un archivo tarball. Podemos usar el comando docker save para esto.

docker save library/ubuntu:18.04 -o ubuntu_18.04.tar

Este comando guarda la imagen library/ubuntu:18.04 en un archivo llamado ubuntu_18.04.tar en tu directorio actual (~/project). La bandera -o especifica el archivo de salida.

Deberías ver una salida que indique que las capas de la imagen se están guardando.

The image 'library/ubuntu:18.04' is being saved to a tar file.
...

Ahora que tenemos la imagen guardada como un tarball, podemos usar Trivy para escanear este archivo. Usaremos el comando trivy image nuevamente, pero esta vez especificaremos el archivo tarball como el objetivo.

trivy image --input ubuntu_18.04.tar

La bandera --input le dice a Trivy que escanee una imagen desde un archivo tarball en lugar de descargarla de un registro o escanear una imagen local por nombre. Trivy leerá los datos de la imagen del archivo ubuntu_18.04.tar y realizará el análisis de vulnerabilidades, similar a escanear directamente una imagen local.

Verás una salida que muestra a Trivy cargando la imagen desde el tarball y luego el proceso de escaneo de vulnerabilidades y el informe, al igual que en el paso anterior.

2023-10-27T08:05:00.000+0000    INFO    Loading image from ubuntu_18.04.tar...
2023-10-27T08:05:05.000+0000    INFO    Detected OS: ubuntu
2023-10-27T08:05:05.000+0000    INFO    Detecting Ubuntu vulnerabilities...
...
ubuntu_18.04.tar (ubuntu 18.04)
==============================
Total: 100 (UNKNOWN: 0, LOW: 50, MEDIUM: 30, HIGH: 15, CRITICAL: 5)

┌───────────────────────────────────────────────────┬─────────────────────────────────┬──────────┬───────────────────┬───────────────────────────────────────────────────────────┐
│                 Library/Package                   │              Vulnerability              │ Severity │ Installed Version │                       Fixed Version                       │
├───────────────────────────────────────────────────┼─────────────────────────────────┼──────────┼───────────────────┼───────────────────────────────────────────────────────────┤
│ apt                                               │ CVE-YYYY-XXXX                   │ HIGH     │ 1.6.12            │ 1.6.14                                                    │
│ ...                                               │ ...                             │ ...      │ ...               │ ...                                                       │
└───────────────────────────────────────────────────┴─────────────────────────────────┴──────────┴───────────────────┴───────────────────────────────────────────────────────────┘

Esto demuestra cómo Trivy puede analizar imágenes de Docker incluso cuando no están cargadas en el demonio de Docker, al escanear el tarball creado con docker save. Esta es una forma flexible de integrar el escaneo de vulnerabilidades en flujos de trabajo donde las imágenes se transfieren como archivos.

Analizar vulnerabilidades desde un directorio OCI

En este paso, exploraremos cómo analizar vulnerabilidades de una imagen almacenada en el formato de diseño de la Open Container Initiative (OCI, Iniciativa de Contenedores Abiertos). La Especificación del Formato de Imagen OCI define un estándar para empaquetar imágenes de contenedores. Herramientas como Skopeo y Buildah se pueden utilizar para crear y gestionar imágenes en este formato. Trivy puede escanear directamente imágenes almacenadas en un directorio OCI.

Primero, necesitamos crear un directorio OCI a partir de nuestra imagen de Docker library/ubuntu:18.04. Utilizaremos la utilidad de línea de comandos skopeo para esto. Dado que skopeo no está preinstalado, necesitamos instalarlo.

sudo apt update
sudo apt install -y skopeo

Esto actualizará la lista de paquetes e instalará skopeo. Verás una salida que muestra el proceso de instalación.

Hit:1 http://archive.ubuntu.com/ubuntu bionic InRelease
...
Setting up skopeo (1.2.3-3) ...

Ahora que skopeo está instalado, podemos copiar la imagen de Docker a un directorio OCI. Crearemos un directorio llamado ubuntu_oci en nuestro directorio ~/project y copiaremos la imagen en él utilizando skopeo copy.

mkdir ubuntu_oci
skopeo copy docker-daemon:library/ubuntu:18.04 oci:ubuntu_oci:18.04

El comando skopeo copy se utiliza para transferir imágenes entre diferentes ubicaciones de almacenamiento y formatos.

  • docker-daemon:library/ubuntu:18.04 especifica la imagen de origen, que es library/ubuntu:18.04 ubicada en el demonio de Docker local.
  • oci:ubuntu_oci:18.04 especifica el formato y la ubicación de destino. oci: indica el formato OCI, ubuntu_oci es el directorio donde se almacenará la imagen OCI y 18.04 es la etiqueta (tag) de la imagen dentro de ese directorio OCI.

Verás una salida que indica el proceso de copiado.

Getting image source signatures
Copying blob sha256:...
...
Copying config sha256:...
Writing manifest to image destination
Storing signatures

Ahora deberías tener un directorio llamado ubuntu_oci que contiene los datos de la imagen OCI. Puedes listar el contenido de este directorio para ver los archivos de diseño OCI.

ls ubuntu_oci

Verás archivos y directorios como oci-layout, index.json y blobs.

blobs  index.json  oci-layout

Finalmente, podemos usar Trivy para escanear este directorio OCI en busca de vulnerabilidades. Usaremos el comando trivy image y especificaremos la ruta del directorio OCI.

trivy image oci:ubuntu_oci:18.04

Trivy reconocerá el prefijo oci: y escaneará la imagen ubicada en el directorio ubuntu_oci con la etiqueta 18.04. Analizará las capas de la imagen e informará cualquier vulnerabilidad encontrada, similar a escanear directamente una imagen de Docker.

Verás una salida que muestra a Trivy escaneando la imagen OCI y luego el informe de vulnerabilidades.

2023-10-27T08:10:00.000+0000    INFO    Detected OS: ubuntu
2023-10-27T08:10:00.000+0000    INFO    Detecting Ubuntu vulnerabilities...
...
oci:ubuntu_oci:18.04 (ubuntu 18.04)
==================================
Total: 100 (UNKNOWN: 0, LOW: 50, MEDIUM: 30, HIGH: 15, CRITICAL: 5)

┌───────────────────────────────────────────────────┬─────────────────────────────────┬──────────┬───────────────────┬───────────────────────────────────────────────────────────┐
│                 Library/Package                   │              Vulnerability              │ Severity │ Installed Version │                       Fixed Version                       │
├───────────────────────────────────────────────────┼─────────────────────────────────┼──────────┼───────────────────┼───────────────────────────────────────────────────────────┤
│ apt                                               │ CVE-YYYY-XXXX                   │ HIGH     │ 1.6.12            │ 1.6.14                                                    │
│ ...                                               │ ...                             │ ...      │ ...               │ ...                                                       │
└───────────────────────────────────────────────────┴─────────────────────────────────┴──────────┴───────────────────┴───────────────────────────────────────────────────────────┘

Esto demuestra la capacidad de Trivy para escanear imágenes almacenadas en el formato OCI, brindando flexibilidad en cómo se gestionan y escanean las imágenes de contenedores.

Exportar el informe de vulnerabilidades a un archivo JSON SARIF

En este paso, aprenderemos cómo exportar el informe de vulnerabilidades generado por Trivy a un archivo JSON SARIF. SARIF (Formato de Intercambio de Resultados de Análisis Estático) es un formato estándar para la salida de herramientas de análisis estático. Exportar informes en formato SARIF facilita la integración de los resultados del escaneo de vulnerabilidades en otras herramientas y flujos de trabajo, como pipelines de CI/CD o paneles de seguridad.

Volveremos a escanear la imagen de Docker library/ubuntu:18.04, pero esta vez usaremos las opciones de formato de Trivy para mostrar el resultado en formato SARIF y guardarlo en un archivo.

trivy image --format sarif --output report.sarif library/ubuntu:18.04

Desglosemos este comando:

  • trivy image library/ubuntu:18.04: Este es el comando estándar para escanear la imagen de Docker especificada.
  • --format sarif: Esta bandera le dice a Trivy que formatee la salida como JSON SARIF.
  • --output report.sarif: Esta bandera redirige la salida a un archivo llamado report.sarif en tu directorio actual (~/project).

Trivy realizará el escaneo y guardará los resultados en el archivo especificado. No verás el informe detallado impreso en la consola, solo información de progreso.

2023-10-27T08:15:00.000+0000    INFO    Detected OS: ubuntu
2023-10-27T08:15:00.000+0000    INFO    Detecting Ubuntu vulnerabilities...
...

Después de que el comando termine, deberías tener un archivo llamado report.sarif en tu directorio ~/project. Puedes verificar su existencia usando el comando ls.

ls report.sarif

Deberías ver el nombre del archivo impreso, lo que confirma que el archivo se ha creado.

report.sarif

También puedes ver el contenido del archivo SARIF usando una herramienta de línea de comandos como cat o less. El contenido estará en formato JSON, siguiendo la especificación SARIF.

cat report.sarif

Verás la salida JSON, que puede ser bastante larga dependiendo del número de vulnerabilidades encontradas.

{
  "version": "2.1.0",
  "$schema": "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json",
  "runs": [
    {
      "tool": {
        "driver": {
          "name": "Trivy",
          "version": "0.50.1",
          ...
        }
      },
      "results": [
        {
          "ruleId": "CVE-YYYY-XXXX",
          "level": "error",
          "message": {
            "text": "apt: CVE-YYYY-XXXX (HIGH)"
          },
          ...
        },
        ...
      ]
    }
  ]
}

Exportar informes en formato SARIF es una forma poderosa de integrar el escaneo de vulnerabilidades en flujos de trabajo de seguridad automatizados y aprovechar herramientas que entiendan el estándar SARIF.

Mostrar vulnerabilidades con puntuaciones EPSS

En este paso, aprenderemos cómo mostrar las vulnerabilidades junto con sus puntuaciones del Sistema de Puntuación de Predicción de Explotación (Exploit Prediction Scoring System, EPSS) utilizando Trivy. EPSS es un esfuerzo basado en datos para estimar la probabilidad de que una vulnerabilidad sea explotada en el mundo real. Incluir las puntuaciones EPSS en los informes de vulnerabilidades puede ayudar a priorizar los esfuerzos de remediación centrándose en las vulnerabilidades que tienen más probabilidades de ser explotadas activamente.

Trivy puede obtener y mostrar las puntuaciones EPSS de las vulnerabilidades si están disponibles. Para hacer esto, necesitamos usar la bandera --vuln-type os,library para asegurarnos de que estamos escaneando tanto las vulnerabilidades del sistema operativo como las de las bibliotecas, y Trivy incluirá automáticamente las puntuaciones EPSS en la salida si los datos están disponibles para una determinada CVE.

Volvamos a escanear la imagen de Docker library/ubuntu:18.04, esta vez solicitando explícitamente los tipos de vulnerabilidades del sistema operativo y de las bibliotecas.

trivy image --vuln-type os,library library/ubuntu:18.04

La bandera --vuln-type os,library especifica los tipos de vulnerabilidades a escanear. Por defecto, Trivy a menudo escanea estos tipos, pero incluir explícitamente la bandera lo asegura. Cuando Trivy encuentra una vulnerabilidad (identificada por un ID de CVE) para la cual existen datos EPSS, incluirá la puntuación EPSS en el informe.

Trivy realizará el escaneo como antes. La salida será similar al primer escaneo, pero notarás una columna adicional para las puntuaciones EPSS de algunas vulnerabilidades.

2023-10-27T08:20:00.000+0000    INFO    Detected OS: ubuntu
2023-10-27T08:20:00.000+0000    INFO    Detecting Ubuntu vulnerabilities...
...
library/ubuntu:18.04 (ubuntu 18.04)
===================================
Total: 100 (UNKNOWN: 0, LOW: 50, MEDIUM: 30, HIGH: 15, CRITICAL: 5)

┌───────────────────────────────────────────────────┬─────────────────────────────────┬──────────┬───────────────────┬───────────────────────────────────────────────────────────┬───────┐
│                 Library/Package                   │              Vulnerability              │ Severity │ Installed Version │                       Fixed Version                       │ EPSS  │
├───────────────────────────────────────────────────┼─────────────────────────────────┼──────────┼───────────────────┼───────────────────────────────────────────────────────────┼───────┤
│ apt                                               │ CVE-YYYY-XXXX                   │ HIGH     │ 1.6.12            │ 1.6.14                                                    │ 0.95  │
│ ...                                               │ ...                             │ ...      │ ...               │ ...                                                       │ ...   │
└───────────────────────────────────────────────────┴─────────────────────────────────┴──────────┴───────────────────┴───────────────────────────────────────────────────────────┴───────┘

Observa la nueva columna EPSS en la tabla de salida. Los valores en esta columna representan la puntuación EPSS de la vulnerabilidad correspondiente, que va de 0 a 1. Una puntuación EPSS más alta indica una mayor probabilidad de que la vulnerabilidad sea explotada en los próximos 30 días. Esta información es valiosa para priorizar qué vulnerabilidades abordar primero, centrándose en aquellas con puntuaciones EPSS más altas.

Al incluir las puntuaciones EPSS en tu análisis de vulnerabilidades, puedes ir más allá de los niveles de gravedad y tomar decisiones más informadas sobre el riesgo y la remediación.

Resumen

En este laboratorio, aprendimos cómo analizar las vulnerabilidades en una imagen de Docker utilizando Trivy, un escáner de seguridad versátil. Descargamos una imagen vulnerable de Ubuntu e instalamos Trivy para realizar el análisis. Este primer paso se centró en el proceso fundamental de escanear una imagen de Docker en ejecución en busca de debilidades de seguridad.