Как использовать команду docker scout cves для поиска уязвимостей

DockerDockerBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии (лабораторной работе) вы научитесь эффективно использовать команду docker scout cves для выявления уязвимостей в Docker-изображениях и связанных артефактах. Мы начнем с анализа уязвимостей непосредственно в Docker-изображении, показав, как скачать уязвимое изображение и использовать сканер безопасности, такой как Trivy, для поиска потенциальных проблем.

После этого вы узнаете, как анализировать уязвимости в архиве docker save и в директории OCI, демонстрируя гибкость команды docker scout cves для различных форматов. Наконец, вы научитесь экспортировать отчет об уязвимостях в файл SARIF JSON для дальнейшей обработки и отображать уязвимости с соответствующими оценками EPSS, чтобы приоритизировать усилия по устранению.


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{{"Как использовать команду docker scout cves для поиска уязвимостей"}} docker/pull -.-> lab-555202{{"Как использовать команду docker scout cves для поиска уязвимостей"}} docker/images -.-> lab-555202{{"Как использовать команду docker scout cves для поиска уязвимостей"}} docker/save -.-> lab-555202{{"Как использовать команду docker scout cves для поиска уязвимостей"}} docker/cp -.-> lab-555202{{"Как использовать команду docker scout cves для поиска уязвимостей"}} end

Анализ уязвимостей в Docker-изображении

На этом этапе мы научимся анализировать уязвимости в Docker-изображении с помощью Trivy. Trivy - это комплексный и универсальный сканер безопасности. Он может обнаруживать уязвимости в пакетах операционной системы (Alpine, RHEL, CentOS, Debian, Ubuntu и др.) и зависимостях приложений (Bundler, Composer, npm, yarn и др.). Кроме того, Trivy поддерживает различные цели сканирования, такие как контейнерные изображения, файловые системы и Git-репозитории.

Сначала давайте скачаем уязвимое Docker-изображение, которое мы будем использовать для анализа. Мы будем использовать изображение library/ubuntu:18.04, о котором известно, что оно имеет некоторые уязвимости.

docker pull library/ubuntu:18.04

Вы должны увидеть вывод, указывающий на то, что изображение скачивается.

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

Теперь, когда у нас есть изображение, нам нужно установить Trivy. Поскольку Trivy не предустановлен в среде LabEx, мы скачаем и установим его. Мы скачаем последний релиз с официального GitHub-репозитория.

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

Эта команда скачивает Debian-пакет Trivy. Вы должны увидеть вывод, похожий на следующий:

--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]

Теперь установите скачанный пакет с помощью dpkg.

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

Вы должны увидеть вывод, указывающий на процесс установки.

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) ...

После установки Trivy мы можем теперь сканировать Docker-изображение library/ubuntu:18.04 на наличие уязвимостей.

trivy image library/ubuntu:18.04

Trivy начнет сканировать изображение. Это может занять несколько моментов, так как он загружает базы данных уязвимостей и анализирует слои изображения. Вы увидите вывод, показывающий прогресс, а затем подробный отчет о найденных уязвимостях.

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                                                    │
│ ...                                               │ ...                             │ ...      │ ...               │ ...                                                       │
└───────────────────────────────────────────────────┴─────────────────────────────────┴──────────┴───────────────────┴───────────────────────────────────────────────────────────┘

Вывод содержит сводку о найденных уязвимостях, категорированных по уровню серьезности (UNKNOWN, LOW, MEDIUM, HIGH, CRITICAL). Затем он перечисляет каждую уязвимость с деталями, такими как затронутый пакет, идентификатор уязвимости (например, CVE-YYYY-XXXX), уровень серьезности, установленная версия пакета и исправленная версия, если она доступна. Этот отчет помогает вам понять безопасность вашего Docker-изображения и определить области, которые требуют устранения.

Анализ уязвимостей из tar-архива, созданного с помощью docker save

На этом этапе мы научимся анализировать уязвимости в Docker-изображении, сохраненном в виде tar-архива. Это полезно, когда вам нужно проверить изображение, которое не доступно напрямую в Docker-реестр или на локальном Docker-демоне, но у вас есть сохраненное изображение в виде файла.

Сначала нам нужно сохранить Docker-изображение library/ubuntu:18.04, которое мы скачали на предыдущем этапе, в tar-архив. Для этого можно использовать команду docker save.

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

Эта команда сохраняет изображение library/ubuntu:18.04 в файл с именем ubuntu_18.04.tar в текущей директории (~/project). Флаг -o указывает на выходной файл.

Вы должны увидеть вывод, указывающий на сохранение слоев изображения.

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

Теперь, когда у нас есть изображение, сохраненное в виде tar-архива, мы можем использовать Trivy для сканирования этого файла. Мы снова используем команду trivy image, но на этот раз укажем tar-архив в качестве цели.

trivy image --input ubuntu_18.04.tar

Флаг --input сообщает Trivy, что нужно сканировать изображение из tar-архива, а не скачивать его из реестра или сканировать локальное изображение по имени. Trivy прочитает данные изображения из файла ubuntu_18.04.tar и выполнит анализ уязвимостей, аналогично сканированию локального изображения напрямую.

Вы увидите вывод, показывающий, как Trivy загружает изображение из tar-архива, а затем процесс сканирования на уязвимости и отчет, как и на предыдущем этапе.

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                                                    │
│ ...                                               │ ...                             │ ...      │ ...               │ ...                                                       │
└───────────────────────────────────────────────────┴─────────────────────────────────┴──────────┴───────────────────┴───────────────────────────────────────────────────────────┘

Это показывает, что Trivy может анализировать Docker-изображения, даже если они не загружены в Docker-демон, путем сканирования tar-архива, созданного с помощью docker save. Это гибкий способ интегрировать сканирование на уязвимости в рабочие процессы, где изображения передаются в виде файлов.

Анализ уязвимостей из директории в формате OCI

На этом этапе мы узнаем, как анализировать уязвимости в изображении, хранящемся в формате Open Container Initiative (OCI). Спецификация формата контейнерных образов OCI определяет стандарт для упаковки контейнерных образов. Инструменты, такие как Skopeo и Buildah, можно использовать для создания и управления образами в этом формате. Trivy может напрямую сканировать образы, хранящиеся в директории OCI.

Сначала нам нужно создать директорию OCI из нашего Docker-образа library/ubuntu:18.04. Для этого мы будем использовать командную утилиту skopeo. Поскольку skopeo не предустановлен, нам нужно его установить.

sudo apt update
sudo apt install -y skopeo

Это обновит список пакетов и установит skopeo. Вы увидите вывод, показывающий процесс установки.

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

Теперь, когда skopeo установлен, мы можем скопировать Docker-образ в директорию OCI. Мы создадим директорию с именем ubuntu_oci в нашей директории ~/project и скопируем образ в нее с помощью команды skopeo copy.

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

Команда skopeo copy используется для передачи образов между различными местами хранения и форматами.

  • docker-daemon:library/ubuntu:18.04 указывает исходный образ, который представляет собой library/ubuntu:18.04, находящийся в локальном Docker-демоне.
  • oci:ubuntu_oci:18.04 указывает целевой формат и место хранения. oci: обозначает формат OCI, ubuntu_oci - это директория, где будет храниться образ OCI, а 18.04 - тег образа в этой директории OCI.

Вы увидите вывод, указывающий на процесс копирования.

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

Теперь у вас должна быть директория с именем ubuntu_oci, содержащая данные образа OCI. Вы можете вывести список содержимого этой директории, чтобы увидеть файлы структуры OCI.

ls ubuntu_oci

Вы увидите файлы и директории, такие как oci-layout, index.json и blobs.

blobs  index.json  oci-layout

Наконец, мы можем использовать Trivy для сканирования этой директории OCI на наличие уязвимостей. Мы будем использовать команду trivy image и укажем путь к директории OCI.

trivy image oci:ubuntu_oci:18.04

Trivy распознает префикс oci: и сканирует образ, находящийся в директории ubuntu_oci с тегом 18.04. Он проанализирует слои образа и отобразит отчет о найденных уязвимостях, аналогично сканированию Docker-образа напрямую.

Вы увидите вывод, показывающий, как Trivy сканирует образ OCI, а затем отчет о уязвимостях.

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                                                    │
│ ...                                               │ ...                             │ ...      │ ...               │ ...                                                       │
└───────────────────────────────────────────────────┴─────────────────────────────────┴──────────┴───────────────────┴───────────────────────────────────────────────────────────┘

Это демонстрирует способность Trivy сканировать образы, хранящиеся в формате OCI, обеспечивая гибкость в управлении и сканировании ваших контейнерных образов.

Экспорт отчета о уязвимостях в файл SARIF JSON

На этом этапе мы научимся экспортировать отчет о уязвимостях, сгенерированный Trivy, в файл SARIF JSON. SARIF (Static Analysis Results Interchange Format, Формат обмена результатами статического анализа) представляет собой стандартный формат вывода статических анализаторов. Экспорт отчетов в формате SARIF упрощает интеграцию результатов сканирования на уязвимости в другие инструменты и рабочие процессы, такие как CI/CD-пайплайны или панели мониторинга безопасности.

Мы снова выполним сканирование Docker-образа library/ubuntu:18.04, но на этот раз воспользуемся параметрами форматирования Trivy, чтобы вывести результат в формате SARIF и сохранить его в файл.

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

Разберем эту команду по частям:

  • trivy image library/ubuntu:18.04: Это стандартная команда для сканирования указанного Docker-образа.
  • --format sarif: Этот флаг сообщает Trivy, что нужно отформатировать вывод в виде SARIF JSON.
  • --output report.sarif: Этот флаг перенаправляет вывод в файл с именем report.sarif в текущей директории (~/project).

Trivy выполнит сканирование и сохранит результаты в указанный файл. Вы не увидите подробный отчет в консоли, только информацию о ходе выполнения.

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

После завершения выполнения команды в директории ~/project должен появиться файл с именем report.sarif. Вы можете проверить его наличие с помощью команды ls.

ls report.sarif

Вы должны увидеть имя файла в выводе, что подтверждает его создание.

report.sarif

Вы также можете просмотреть содержимое файла SARIF с помощью командной утилиты, такой как cat или less. Содержимое будет в формате JSON, соответствующем спецификации SARIF.

cat report.sarif

Вы увидите вывод в формате JSON, который может быть довольно длинным в зависимости от количества обнаруженных уязвимостей.

{
  "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)"
          },
          ...
        },
        ...
      ]
    }
  ]
}

Экспорт отчетов в формате SARIF представляет собой мощный способ интегрировать сканирование на уязвимости в автоматизированные процессы безопасности и использовать инструменты, поддерживающие стандарт SARIF.

Отображение уязвимостей с оценками EPSS

На этом этапе мы узнаем, как отображать уязвимости вместе с оценками по системе прогнозирования эксплуатации уязвимостей (Exploit Prediction Scoring System, EPSS) с помощью Trivy. EPSS представляет собой данные-ориентированную инициативу по оценке вероятности эксплуатации уязвимости в реальной жизни. Включение оценок EPSS в отчеты о уязвимостях может помочь приоритизировать усилия по исправлению, сосредоточившись на уязвимостях, которые с большей вероятностью будут активно эксплуатироваться.

Trivy может получать и отображать оценки EPSS для уязвимостей, если они доступны. Для этого нам нужно использовать флаг --vuln-type os,library, чтобы убедиться, что мы сканируем на наличие уязвимостей как операционной системы, так и библиотек. Trivy автоматически включит оценки EPSS в вывод, если данные для данного CVE доступны.

Повторим сканирование Docker-образа library/ubuntu:18.04, на этот раз явно указав типы уязвимостей операционной системы и библиотек.

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

Флаг --vuln-type os,library указывает типы уязвимостей, на которые нужно сканировать. По умолчанию Trivy часто сканирует на эти типы, но явное указание флага гарантирует это. Когда Trivy находит уязвимость (идентифицированную по CVE ID), для которой существуют данные EPSS, он включит оценку EPSS в отчет.

Trivy выполнит сканирование, как и раньше. Вывод будет похож на первое сканирование, но вы заметите дополнительный столбец с оценками EPSS для некоторых уязвимостей.

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  │
│ ...                                               │ ...                             │ ...      │ ...               │ ...                                                       │ ...   │
└───────────────────────────────────────────────────┴─────────────────────────────────┴──────────┴───────────────────┴───────────────────────────────────────────────────────────┴───────┘

Обратите внимание на новый столбец EPSS в выходной таблице. Значения в этом столбце представляют оценку EPSS для соответствующей уязвимости, в диапазоне от 0 до 1. Более высокая оценка EPSS указывает на более высокую вероятность эксплуатации уязвимости в ближайшие 30 дней. Эта информация ценна для приоритизации уязвимостей, которые нужно исправить в первую очередь, сосредоточившись на тех, у которых оценка EPSS выше.

Включение оценок EPSS в анализ уязвимостей позволяет выйти за рамки просто уровня серьезности и принимать более обоснованные решения о рисках и исправлении.

Резюме

В этом практическом занятии мы научились анализировать уязвимости в Docker-образе с помощью Trivy, универсального сканера безопасности. Мы загрузили уязвимый образ Ubuntu и установили Trivy для выполнения анализа. Этот первый этап был посвящен основному процессу сканирования работающего Docker-образа на предмет уязвимостей безопасности.