Anchore – сканер безопасности для образов контейнеров

Thank you for reading this post, don't forget to subscribe! 
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
  • DockerCompose
  • Jenkins
  • Поль­зо­ва­тель sudo

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

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

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

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

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

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

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

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

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

Затем загру­зи­те config.yaml в ката­лог ~/anchore/config
Файл config.yaml – это файл кон­фи­гу­ра­ции с основ­ны­ми настрой­ка­ми, необ­хо­ди­мы­ми для рабо­ты служ­бы меха­низ­ма привязки.
Он име­ет несколь­ко пара­мет­ров, вклю­чая пара­мет­ры по умол­ча­нию, уро­вень жур­на­ла, порт про­слу­ши­ва­ния, имя поль­зо­ва­те­ля, пароль и дру­гие пара­мет­ры, кото­рые мож­но настро­ить в соот­вет­ствии с кон­крет­ны­ми требованиями.
Это хоро­шая прак­ти­ка без­опас­но­сти, а имен­но изме­нить пароль, и вы може­те сде­лать это, отре­дак­ти­ро­вав файл config.yaml.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Эта коман­да загру­зит и уста­но­вит фай­лы для AnchoreCLI.
После уста­нов­ки нам нуж­но полу­чить исход­ный файл .profile, исполь­зуя команду
Что­бы про­ве­рить успеш­ность уста­нов­ки и вер­сию Anchorecli, исполь­зуй­те команду
Что­бы про­ве­рить состо­я­ние систе­мы anchore-CLI, исполь­зуй­те команду
Обра­ти­те вни­ма­ние, что вы долж­ны пере­дать URL-адрес Anchore, имя поль­зо­ва­те­ля и пароль.

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

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

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

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


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

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

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

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

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

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

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

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

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

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

Доба­вить боль­ше образов

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

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

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

Вывод

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

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

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

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

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

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

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

Вывод

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

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

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

Образ openjdk: 8-jre-alpine нару­ша­ет ука­зан­ный иден­ти­фи­ка­тор поли­ти­ки (ID поли­ти­ки: 2c53a13c-1765-11e8-82ef-23527761d060) и поэто­му воз­вра­ща­ет ста­тус Fail.

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

Резуль­та­ты пока­зы­ва­ют ста­тус 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, кото­рый содер­жит неко­то­рые уязвимости.

Нажми­те Save

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

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

Нажми­те Build Now

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

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

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

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

В подроб­ных отче­тах ука­зы­ва­ет­ся, был ли ана­лиз неудач­ным или успеш­ным, и предо­став­ля­ет­ся несколь­ко отче­тов, пока­зы­ва­ю­щих уяз­ви­мо­сти, пре­ду­пре­жде­ния и дру­гие дан­ные, в зави­си­мо­сти от конфигурации.
По умол­ча­нию пла­гин настро­ен на сбой сбор­ки (Stop) при нали­чии уязвимостей.
Ниже при­ве­де­ны скрин­шо­ты отче­тов о поли­ти­ке и безопасности.
Ниже при­ве­ден скрин­шот резуль­та­тов ана­ли­за без­опас­но­сти для уяз­ви­мо­го образа.