К основному контенту

🐳 Как установить и использовать Anchore — сканер безопасности для образов контейнеров?

Anchore Engine — это инструмент с открытым исходным кодом для сканирования и анализа образов контейнеров на предмет уязвимостей и проблем политик. Он доступен в виде образа контейнера Docker, который может работать на платформе оркестрации, или в виде отдельной установки. Это полезный инструмент безопасности, который позволяет разработчикам и командам QA тестировать, идентифицировать и устранять уязвимости в образах, которые они используют для создания приложений. В этой статье мы рассмотрим, как установить и использовать сканер уязвимостей и образов Anchore. Как правило, существует несколько способов реализации. Тем не менее, я сосредоточусь на следующих двух:
  • Использование параметра командной строки AnchoreCLI
  • Плагин Jenkins Anchore Container Image Scanner для графического интерфейса
Мы покажем вам, как установить, настроить и запустить движок, настроить и использовать инструмент командной строки AnchoreCLI, а также плагин Jenkins. Для каждого из двух методов вы узнаете, как добавлять образа на сканирование, выполнять сканирование и просматривать отчеты. В конце статьи вы узнаете следующие три вещи.
  • Установка и настройка Anchore Engine
  • Установка, настройка и использование Anchore CLI
  • Настройка и использование плагина Anchore Container Image Scanner в Jenkins

Предпосылки

Ниже приведены требования для этого урока;

  • Локальная или виртуальная машина с Ubuntu 18.04 и следующими;
  • Docker
  • Docker—Compose
  • Jenkins
  • Пользователь sudo

Шаг 1: — Настройте рабочие каталоги и загрузите файлы конфигурации.

Создайте рабочий каталог для ваших файлов Anchore.

В этом каталоге вы создадите два подкаталога, один для конфигурации и один для базы данных.

Создайте домашний каталог для файлов Anchore

mkdir anchore
Перейдите в новый каталог и создайте подкаталоги конфигурации и базы данных.
cd anchore mkdir config mkdir db

Скачайте файлы конфигурации

Как только каталоги будут готовы, мы загрузим два файла конфигурации (docker-compose.yaml и config.yaml) из проекта Github.

Чтобы скачать docker-compose.yaml

Перейдите в домашний каталог anchore и используйте команду

curl https://raw.githubusercontent.com/anchore/anchore-engine/master/scripts/docker-compose/docker-compose.yaml > docker-compose.yaml
Затем загрузите config.yaml в каталог ~/anchore/config
curl https://raw.githubusercontent.com/anchore/anchore-engine/master/scripts/docker-compose/config.yaml -o ~/anchore/config/config.yaml
Файл config.yaml — это файл конфигурации с основными настройками, необходимыми для работы службы механизма привязки. Он имеет несколько параметров, включая параметры по умолчанию, уровень журнала, порт прослушивания, имя пользователя, пароль и другие параметры, которые можно настроить в соответствии с конкретными требованиями. Это хорошая практика безопасности, а именно изменить пароль, и вы можете сделать это, отредактировав файл config.yaml.

Однако в этом уроке мы будем использовать настройки по умолчанию.

Чтобы продолжить с учетными данными по умолчанию (имя пользователя — admin и пароль — foobar), перейдите к шагу 2.

Шаг 2: — Установите и запустите Anchore Engine

Вы будете использовать Docker compose для установки и запуска Anchore Engine и базы данных.

Из домашнего каталога Anchore запустите.

docker-compose up -d

Это автоматически вытянет образ Anchore, а затем создаст Anchore engine и базу данных в домашнем каталоге и каталогах ~/anchore/database/ соответственно.

По завершении команда запустит Anchore.

После успешной установки и запуска anchore engine вы можете сканировать образ с помощью командной строки AnchoreCLI.

Однако сначала вам нужно установить утилиту командной строки AnchoreCLI, как показано ниже.

Установка, настройка AnchoreCLI

На этом этапе вы узнаете, как установить и настроить инструмент командной строки AnchoreCLI.

Шаг 3: — Установите AnchoreCLI

В этом руководстве мы сначала установим утилиту python-pip, которая затем будет использоваться для установки AnchoreCLI из исходного кода.

Чтобы установить Python pip. Перейдите в домашний каталог Anchore и запустите

sudo apt-get update sudo apt-get install python-pip sudo pip install --upgrade setuptools

Установите AnchoreCLI, используя python-pip

pip install anchorecli
Эта команда загрузит и установит файлы для AnchoreCLI. После установки нам нужно получить исходный файл .profile, используя команду
source ~/.profile
Чтобы проверить успешность установки и версию Anchorecli, используйте команду
anchore-cli --version
Чтобы проверить состояние системы anchore-CLI, используйте команду
anchore-cli --url http://localhost:8228/v1 --u admin --p foobar system status
Обратите внимание, что вы должны передать URL-адрес Anchore, имя пользователя и пароль.

Определите параметры Anchore Engine

По умолчанию AnchoreCLI пытается получить доступ к Anchore Engine без аутентификации. Однако это не будет работать, и вам необходимо предоставить учетные данные Anchore Engine для каждой команды. Это включает передачу имени пользователя, пароля и параметров URL с каждой командой Anchore CLI.

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

Чтобы передать URL, запустите

ANCHORE_CLI_URL=http://localhost:8228/v1

Это определяет URL-адрес вместе с портом 8228, который он использует.

Установите имя пользователя и пароль, используя значения по умолчанию; в противном случае замените их новыми значениями, установленными на шаге 1.

ANCHORE_CLI_USER=admin ANCHORE_CLI_PASS=foobar

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

Чтобы установить текущую оболочку и другие процессы, которые запускаются из нее, мы используем команду export

export ANCHORE_CLI_URL export ANCHORE_CLI_USER export ANCHORE_CLI_PASS
После определения параметров установка AchoreCLI завершена, и вы готовы к сканированию образов.

Шаг 4: — Добавление и анализ образов

Теперь, когда у нас запущен Anchore Engine и настроен интерфейс командной строки, вы узнаете, как добавлять и анализировать образа на предмет проблем безопасности.

В этом уроке мы проанализируем два изображения. -openjdk:8-jre-alpin и debian:latest without

Анализ образов

Для продолжения нам нужно сначала добавить образ:

anchore-cli image add openjdk:8-jre-alpine
anchore-cli image add docker.io/library/debian:latest
Добавить больше образов
anchore-cli image add openjdk:10-jdk anchore-cli image add openjdk:11-jdk

После добавления образов в Anchore Engine анализ начинается сразу.

Если загружено несколько образов, они помещаются в очередь и анализируются по одному.

Вы можете проверить прогресс и увидеть список загруженных образов вместе с их статусом анализа.

anchore-cli image list

Вывод

:~/anchore$ anchore-cli image list Full Tag Image DigestAnalysis Status docker.io/openjdk:10-jdk sha256:923d074ef1f4f0dceef68d9bad8be19c918d9ca8180a26b037e00576f24c2cb4analyzed docker.io/openjdk:11-jdk sha256:9923c0853475007397ed5c91438c12262476d99372d4cd4d7d44d05e9af5c077analyzed docker.io/openjdk:8-jre-alpine sha256:b2ad93b079b1495488cc01375de799c402d45086015a120c105ea00e1be0fd52analyzed

Шаг 5: — Получить и просмотреть результаты анализа

После завершения анализа вы можете проверить результаты и просмотреть результаты сканирования уязвимостей, проверок политик и других проблем, выявленных Анкором.

Чтобы проверить результаты сканирования уязвимостей на openjdk: 8-jre-alpine:

anchore-cli image vuln openjdk:8-jre-alpine all  anchore-cli image vuln openjdk:8-jre-alpine all VulnerabilityIDPackage SeverityFixCVE Refs Vulnerability URL CVE-2018-1000654 libtasn1-4.13-r0High4.14-r0http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-1000654 CVE-2019-12900 libbz2-1.0.6-r6 High1.0.6-r7 http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-12900 CVE-2019-14697 musl-1.1.20-r4High1.1.20-r5http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-14697 CVE-2019-14697 musl-utils-1.1.20-r4High1.1.20-r5http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-14697 CVE-2019-8457sqlite-libs-3.26.0-r3 High3.28.0-r0http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-8457 CVE-2018-14498 libjpeg-turbo-1.5.3-r4Medium1.5.3-r5 http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-14498

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

Для нашего образа openjdk: 8-jre-alpine анализ показывает, что у него пять сильных уязвимостей и довольно много средних и незначительных уязвимостей. (некоторые не показаны выше).

Чтобы просмотреть результаты уязвимостей для стабильного образаdebian:latest

Запустите команду

anchore-cli image vuln docker.io/library/debian:latest all

Вывод

anchore-cli image vuln debian:latest all VulnerabilityIDPackage Severity Fix CVE RefsVulnerability URL CVE-2005-2541 tar-1.30+dfsg-6Negligible Nonehttps://security-tracker.debian.org/tracker/CVE-2005-2541 CVE-2019-1010022libc-bin-2.28-10 Negligible Nonehttps://security-tracker.debian.org/tracker/CVE-2019-1010022 CVE-2019-1010022libc6-2.28-10Negligible Nonehttps://security-tracker.debian.org/tracker/CVE-2019-1010022 CVE-2019-1010023libc-bin-2.28-10 Negligible Nonehttps://security-tracker.debian.org/tracker/CVE-2019-1010023 CVE-2019-1010023libc6-2.28-10Negligible Nonehttps://security-tracker.debian.org/tracker/CVE-2019-1010023 CVE-2019-1010024libc-bin-2.28-10 Negligible Nonehttps://security-tracker.debian.org/tracker/CVE-2019-1010024

Как видно из отчета, образ debian: latest имеет незначительные уязвимости и не имеет исправлений.

Чтобы увидеть результаты оценки политики для нестабильного образа openjdk: 8-jre-alpine:

anchore-cli evaluate check openjdk:8-jre-alpine

Вывод — результаты показывают ошибку

 anchore-cli evaluate check openjdk:8-jre-alpine Image Digest: sha256:b2ad93b079b1495488cc01375de799c402d45086015a120c105ea00e1be0fd52 Full Tag: docker.io/openjdk:8-jre-alpine Status: fail Last Eval: 2019-09-20T12:03:32Z Policy ID: 2c53a13c-1765-11e8-82ef-23527761d060
Образ openjdk: 8-jre-alpine нарушает указанный идентификатор политики (ID политики: 2c53a13c-1765-11e8-82ef-23527761d060) и поэтому возвращает статус Fail.

Теперь, когда мы увидели, как Anchore Engine реагирует на обнаружение нарушения политики, пришло время проверить, как он работает с нашим стабильным образом debian: latest.

anchore-cli evaluate check docker.io/library/debian:latest --detail user1@Imagescan:~/anchore$ anchore-cli evaluate check docker.io/library/debian:latest --detail Image Digest: sha256:d3351d5bb795302c8207de4db9e0b6eb23bcbfd9cae5a90b89ca01f49d0f792d Full Tag: docker.io/library/debian:latest Image ID: c2c03a296d2329a4f3ab72a7bf38b78a8a80108204d326b0139d6af700e152d1 Status: pass Last Eval: 2019-09-20T12:00:06Z Policy ID: 2c53a13c-1765-11e8-82ef-23527761d060 Final Action: warn Final Action Reason: policy_evaluation GateTriggerDetail Status dockerfileinstructionDockerfile directive 'HEALTHCHECK' not found, matching condition 'not_exists' checkwarn
Результаты показывают статус Pass и Final Action of Warn из-за несоответствия информации директиве Dockerfile. Это не дает сбоя, но может потребовать проверки и решения проблемы.

Настройка и использование модуля Anchore Container Image Scanner в Jenkins

Шаг 6: — Добавьте и настройте плагин Anchore Container Image Scanner в Jenkins

На этом этапе мы интегрируем Anchor Engine с сервером Jenkins.

Jenkins — это сервер с открытым исходным кодом на основе Java, предназначенный для автоматизации широкого спектра повторяющихся задач в цикле разработки программного обеспечения.

Плагин Anchore доступен в Jenkins, но не установлен по умолчанию.

Войдите в Jenkins, используя веб-браузер

http://your_server_ip_or_domain:8080 Введите имя пользователя и пароль. Перейдите в Jenkins menu -> Manage Jenkins — > Manage Plugins На вкладке «Available » прокрутите вниз до «Build Tools » и выберите «Anchore Container Image Scanner». Нажмите «Install without restart ».

После успешной установки плагина Anchore Container Image Scanner следующим шагом является настройка учетных данных.

Перейдите в меню, далее Manage Jenkins Откройте Configure system -> Anchore configuration -> Engine Mode Введите данные (URL-адрес , имя пользователя и пароль, а также порт 8228 — порт по умолчанию для Anchore engine). URL – http://your_server_IP:8228/v1 Введите имя пользователя = admin
Введите пароль = foobar или новый пароль, если вы изменили его в шаге 3 (выше) Нажмите Save

Шаг 8: — Добавление и сканирование образов

НажмитеNew item на панели инструментов Jenkins в верхнем левом меню.

Откроется экран с несколькими вариантами.

Введите желаемое имя для вашего тестового проекта в поле Enter the item name

В этом проекте мы будем использовать пайплайн сборки Выберите Pipeline и нажмите Ok.

Теперь вы готовы к сканированию наших образов. В нашем случае мы будем использовать образа, уже имеющиеся в реджистри Docker, который доступен для Anchore Engine. Для этого вы добавите pipeline скрипт, который укажет нужный образ для сканирования.

Шаг 9: — Добавить скрипт Pipeline

Прокрутите вниз до раздела Pipeline и добавьте скрипт, чтобы указать необходимыый образ для сканирования.

Мы начнем с openjdk: 8-jre-alpine, который содержит некоторые уязвимости.

node { def imageLine = 'openjdk:8-jre-alpine'` writeFile file: 'anchore_images', text: imageLine` anchore name: 'anchore_images'` }
Нажмите Save

Шаг 10: — Запустите сборку и просмотрите отчеты о проверке.

Из меню Дженкинс

Нажмите Build Now

Это запустит процесс сборки, который займет несколько минут в зависимости от размера образа. После завершения под историей сборки появится номер и цветная кнопка. Это будет красный цвет для варианта Fail или синий для Pass. Нажатие на кнопку покажет больше результатов.

Шаг 11: — Просмотр результатов

Нажмите на Build # для просмотра более подробной информации

Откроется окно «Console Output », указывающее на сбой — Anchore Report (FAIL)