В основе концепции Docker лежит такое понятие как образ. В терминологии Docker образ — это исполняемый файл (шаблон), в котором содержится исходный код приложения, его библиотеки и все самое необходимое для запуска контейнера. Готовые образы хранятся в реестрах. Один из самых известных и в тоже время общедоступных реестров — это Docker Hub, официальный реестр от разработчиков Docker. Однако существуют сторонние продукты, которые значительно расширяют функционал реестров, например, путем использования прав доступа и сканирования образов на наличие уязвимостей. Одним их таких продуктов является Harbor.
Harbor — это бесплатный реестр для хранения Docker образов c открытым исходным кодом, который предоставляет доступ к образам с помощью политик, а также умеет сканировать образы на наличие уязвимостей. Проект был запущен в 2016 году силами командой инженеров из компании VMware. В 2018 году Harbor перешел под контроль организации CNCF и с тех пор активно развивается — новые версии стабильно выходят по несколько раз в месяц.
Установка Harbor
Установить Harbor можно двумя способами:
При помощи онлайн-установщика — в этом случае все необходимые образы будут скачаны с Docker Hub. Данный способ подходит, только если есть доступ в интернет.
При помощи оффлайн-установщика — в этом случае все необходимые образы уже присутствуют, однако, они занимают больше места, чем при использовании онлайн-установщика. Подходит для случаев, когда нет доступа к сети.
Перед установкой необходимо проверить, чтобы на хосте присутствовало следующее ПО с необходимыми версиями:
Docker версии 17.06.0 и выше;
Docker Compose версии 1.18.0 и выше;
OpenSSL актуальной версии.
Также заранее нужно сгенерировать HTTPS сертификаты, которые необходимы для использования в репозиториях Harbor. Можно использовать как сертификаты, которые подписаны доверенным центром сертификации, так и использовать самоподписные сертификаты. Инструкция по созданию сертификатов описана в этом разделе.
Установка Harbor будет производиться на ОС Ubuntu 22.04.1 в редакции LTS и при помощи онлайн-установщика с последней актуальной версией2.6.2. Для начала необходимо скачать архив с установщиком.
wget https://github.com/goharbor/harbor/releases/download/v2.6.2/harbor-online-installer-v2.6.2.tgz
Далее разархивировать скачанный архив:
tar -xzvf harbor-online-installer-v2.6.2.tgz
Перейти в созданную директорию:
cd harbor
В директории будет присутствовать конфигурационный файл с именем harbor.yml.tmpl. Прежде чем приступить к его редактированию, необходимо переименовать его в harbor.yml:
mv harbor.yml.tmpl harbor.yml
Далее необходимо его открыть и внести следующие правки:
nano harbor.yml.tmpl
В параметре hostname задаем IP-адрес или имя хоста, на котором будет находиться веб-интерфейс Harbor.
В параметре certificate прописываем полный путь до файла с сертификатом с расширением .crt
В параметре private_key прописываем полный путь до файла с закрытым ключом с расширением .key
По желанию можно изменить такие параметры, как порты веб-интерфейса (директивы http и https с параметром port), пароль от базы данных (директива database, параметр password) и т. д. Каждый параметр в конфигурационном файле подробно описан. После того как необходимые изменения внесены, следует сохраниться и закрыть файл.
Далее в статье будет описан функционал сканирования образов при помощи сканера безопасности Trivy. Trivy уже включен в состав Harbor в виде отдельного образа и для его интеграции в Harbr необходимо включить опцию --with-trivy в команду установки (см. ниже).
После этого запускаем установочный скрипт:
sudo ./install.sh --with-trivy
Установка в среднем занимает не более 5 минут. После того как все образы будут скачаны и запущены, в терминале отобразится фраза:
Harbor has been installed and started successfully.
Также можно проверить статус запущенных контейнеров:
docker ps
Обзор функций Harbor
Чтобы попасть в веб-интерфейс Harbor, необходимо в браузере ввести имя хоста или IP-адрес сервера, который был задан в конфигурационном файле harbor.yml. Логин по умолчанию — admin, пароль — Harbor12345.
Для начала создадим нового пользователя, который будет использоваться для работы с реестром. Для этого в меню слева переходим в раздел Users, далее нажимаем на кнопку NEW USER:
В качестве параметров необходимо задать следующие:
Username — имя пользователя;
Email — адрес электронной почты;
First and last name — Имя и фамилия пользователя;
Password — придумать пароль;
Confirm Password — повторить ввод пароля.
Далее необходимо создать новый проект. Harbor использует термин «Проект» для разграничения прав доступа к репозиториям. Проекты позволяют легко управлять пользователями и их ролями. Близкий термин для проектов — это группы пользователей, подобно группам в операционных системах. Для добавления нового проекта в левом меню выберите раздел Projects и в открывшемся окне нажмите на кнопку NEW PROJECT:
В качестве параметров необходимо задать:
Project Name: имя проекта;
Access Level: если поставить галочку напротив Public, то к репозиторию смогут подключаться все пользователи, и не надо предварительно авторизоваться в нем (использовать команду docker login).
После того как проект был создан, необходимо перейти в него, добавить ранее созданного пользователя и назначить ему необходимые права. Для этого переходим в раздел Members и нажимаем на кнопку USER:
В открывшемся окне вводим имя нужного пользователя, который уже был создан ранее на этапе создания пользователя. В данном случае это пользователь с именем user1:
В параметре Role необходимо выбрать роль, которая будет присвоена пользователю. Harbor использует 5 типов ролей:
Project Admin;
Maintainer;
Developer;
Guest;
Limited Guest
Где роль Project Admin обладает максимальными правами, в то время как роль Limited Guest обладает самыми минимальными возможностями в системе. С полным списком всевозможных прав в Harbor можно ознакомиться в соответствующем разделе документации.
Посмотреть список всех пользователей с ролями репозитория можно в разделе Summary:
Если перейти в раздел Repositories, то справа можно найти кнопку PUSH COMMAND:
Если нажать на нее, то отобразится шпаргалка по команде push, т. е. описаны действия по загрузке образа в репозиторий:
Помимо образов Docker, Harbor также поддерживает загрузку образов Helm и CNAB. Попробуем загрузить какой-нибудь образ Docker в ранее созданный репозиторий с именем my_project.
Для начала требуется установить корневой самоподписной сертификат, который был сгенерирован ранее. Если этого не сделать, то при попытке выполнения команды docker login возникнет ошибка x509: certificate signed by unknown authority,которая означает, что сертификат подписан неизвестным УЦ. Если сертификат выпущен доверенным УЦ, то устанавливать корневой сертификат не нужно. Для установки корневого самоподписного сертификата необходимо выполнить следующие шаги:
1) Установить пакет ca-certificates если он не установлен в системе:
sudo apt -y install ca-certificates
2) Скопировать корневой сертификат с расширением .crt в директорию /usr/local/share/ca-certificates:
sudo cp harbor.crt /usr/local/share/ca-certificates
3) Произвести установку сертификата:
sudo update-ca-certificates
Далее необходимо авторизоваться в реестре выполнив команду:
docker login harbor-test.com
Где harbor-test.com адрес, на котором располагается Harbor. Пользователь уже должен заранее присутствовать в репозитории. В качестве примера будет использоваться образ alpine. Перед отправкой образа в репозиторий ему необходимо присвоить тег:
docker tag alpine:latest harbor-test.com/my_project/alpine:alpine_new
После того как тег присвоен, можно выполнять push, т.е. отправлять образ в репозиторий:
docker push harbor-test.com/my_project/alpine_new
Перейдем в веб-интерфейс репозитория и убедимся, что образ успешно загрузился:
Как видно на скриншотах выше, был создан репозиторий с именем alpine, в котором присутствует артефакт с именем alpine_new. Также можно посмотреть подробную информацию о загруженном образе:
Сканирование образов на наличие уязвимостей при помощи сканера Trivy
В Harbor присутствует возможность сканировать образы на наличие уязвимостей. В качестве сканеров безопасности поддерживаются Trivy и Clair. Так как на этапе установки был установлен именно Trivy, то рассмотрим именно его.
Trivy представляет собой сканер безопасности, который умеет искать уязвимости не только в образах Docker, но также и в файловых системах, git репозиториях, в кластерах Kubernetes. Для поиска уязвимостей Trivy использует собственную БД под названием trivy-db. Проект разрабатывается и поддерживается компанией Aqua Security. Trivy проект с открытым исходным кодом.
В веб-интерфейсе Harbor в меню слева присутствует отдельный раздел под названием Interrogation Services, в котором собраны все сторонние подключенные сервисы. В данном разделе можно найти всю подробную информацию о подключенном сервисе:
Для того чтобы просканировать образ, необходимо перейти в раздел Projects, далее выбрать нужный проект и образ, который должен быть просканирован. Чтобы запустить сканирование, поставьте галочку слева — напротив нужного образа и нажмите на кнопку SCAN:
Начнется процесс сканирования. Если в образе не найдены уязвимости, то отобразится зеленая строка с надписью No vulnerability:
Если уязвимости были найдены, то в пункте Vulnerabilities отобразится их общее количество. Если навести курсор мыши на строку с количеством найденных уязвимостей, то отобразится мини-график, на котором будут подсчитаны уязвимости по типу критичности. В Trivy используются 4 типа критичности уязвимостей в образах — Critical, High, Medium, Low:
Если нажать на хэш-функцию образа, то будет отображен подробный отчет о каждой найденной уязвимости:
При переходе по ссылке из имени уязвимости, откроется сайт aqua vulnerability database, где можно найти еще более подробное описание уязвимости, а также способы её устранения:
Harbor представляет собой более продвинутый и более функциональный реестр — по сравнению с такими реестрами, как Docker Hub и Quay. Помимо организации доступа к репозиториям, Harbor поставляется со сканером безопасности, что немаловажно. Также стоит отметить, что Harbor полностью бесплатный и все функции уже доступны сразу.
НЛО прилетело и оставило здесь промокод для читателей нашего блога:
— 15% на все тарифы VDS (кроме тарифа Прогрев) — HABRFIRSTVDS.
Комментарии (3)
Abyss777
06.01.2023 08:34Какое посоветуете хранилище под реестр в кластере?
Перенес стандартныйregistry
на GlusterFS и push стал неприлично долгим.creker
07.01.2023 13:59Мы всегда развёртываем на S3. Архитектурно ложится идеально и решения намного проще, чем полноценные кластерные файловые системы. Достаточно поднять какойнить minio и отказоустойчивый регистри готов. В дефолтном registry нужно только отключить redirect, чтобы все корректно работало.
WondeRu
На всякий случай: Docker Hub тоже имеет сканер Snyk для проверки на уязвимости. Мне там не нравится то, что нельзя в ci/cd (gitlab) утащить результаты сканирования, например, свалить билд, если нашли критикалы. как с этим обстоят дела в Harbor?