Harbor - частный Docker и Helm реестр с облачной OIDC аутентификацией (Docker compose)

Введение
Harbor — это реестр с открытым исходным кодом, который обеспечивает безопасность артефактов с помощью расширенных политик и управления доступом на основе ролей. В решение входиит также комплексное сканирование уязвимостей образов и проверяет их подлинность с помощью цифровых подписей. Harbor предлагает высокую степень соблюдения стандартов, высокую производительность и бесшовную интеграцию, позволяя последовательно и безопасно управлять артефактами на таких платформах, как Kubernetes и Docker.
Особенности Harbor
Реестр для облачных платформ
Harbor поддерживает как контейнерные образы, и Helm charts, что делает его идеальным реестром для облачных сред, включая контейнерные среды выполнения и платформы оркестрации.
Управление доступом на основе ролей
Harbor использует управление доступом на основе ролей (RBAC), позволяя пользователям получать доступ к различным репозиториям через ‘проекты’. Разрешения могут быть настроены для изображений или Helm charts внутри проекта.
Репликация на основе политик
- Репликация: Образы и чарты могут быть реплицированы (синхронизированы) между несколькими экземплярами реестра на основе политик с использованием фильтров (репозиторий, тег и метка).
- Автоматические повторные попытки: Harbor автоматически повторяет попытки репликации в случае ошибок.
- Сценарии использования: Эта функция поддерживает балансировку нагрузки, высокую доступность и развертывания в нескольких центрах обработки данных в гибридных и многоклаудных сценариях.
Сканирование уязвимостей
Harbor регулярно сканирует образы на наличие уязвимостей и применяет политики для предотвращения развертывания уязвимых образов.
Поддержка LDAP/AD
Harbor интегрируется с корпоративными LDAP/AD для аутентификации и управления пользователями. Группы LDAP могут быть импортированы в Harbor и назначены права на конкретные проекты.
Поддержка OIDC
Harbor поддерживает OpenID Connect (OIDC) для проверки подлинности пользователей через внешние серверы авторизации или поставщиков идентификации. Можно включить единый вход (SSO) для доступа к порталу Harbor.
Удаление изображений и сбор мусора
Системные администраторы могут запускать задания по сбору мусора для удаления нереференцированных изображений, висячих манифестов и блобов, периодически освобождая место.
Notary
Harbor поддерживает подпись контейнерных образов с использованием Docker Content Trust (воспользовавшись Notary) для гарантии подлинности и происхождения. Также можно установить политики для предотвращения развертывания неподписанных изображений.
Графический пользовательский портал
Пользователи могут легко просматривать, искать репозитории и управлять проектами через интуитивно понятный графический интерфейс Harbor.
Аудит
Все операции с репозиториями отслеживаются и записываются для целей аудита.
RESTful API
- API: Доступны RESTful API для административных задач и интеграции с внешними системами.
- Swagger UI: Встроенный Swagger UI предоставляется для исследования и тестирования API.
Простота развертывания
Harbor можно развернуть с использованием Docker Compose, Helm Charts или недавно добавленного Harbor Operator.
Развертывание инфраструктуры
В статье мы будем использовать Docker Compose в качестве платформы для инфраструктуры. В качестве основы мы используем образы от Bitnami. Кроме того, вам потребуется тенант Microsoft EntraID для OAuth-аутентификации.
Демонстрационные файлы extadmin.space можно найти здесь
Установка сервера Harbor
Создайте папку для проекта и скопируйте демонстрационные файлы из репозитория.
Убедитесь, что переменные в файлах *.env определены корректно, с особым вниманием к тому, чтобы пароли были идентичными везде, где они встречаются.
Обратите особое внимание на параметр
CORE_KEY=в core.env; он должен быть фразой длиной 16 символов.Выполните команду
docker compose up -dдля развертывания сервера Harbor и окружающей инфраструктуры.
docker-compose.core.yaml
# Copyright Broadcom, Inc. All Rights Reserved.
# SPDX-License-Identifier: APACHE-2.0
version: '2'
services:
registry:
image: docker.io/bitnami/harbor-registry:2
env_file:
- ./env/registry.env
volumes:
- registry_data:/storage
- ./config/registry/:/etc/registry/:ro
registryctl:
image: docker.io/bitnami/harbor-registryctl:2
env_file:
- ./env/registryctl.env
volumes:
- registry_data:/storage
- ./config/registry/:/etc/registry/:ro
- ./config/registryctl/config.yml:/etc/registryctl/config.yml:ro
postgresql:
image: docker.io/bitnami/postgresql:13
container_name: harbor-db
env_file:
- ./env/postgresql.env
volumes:
- postgresql_data:/bitnami/postgresql
core:
image: docker.io/bitnami/harbor-core:2
container_name: harbor-core
depends_on:
- registry
env_file:
- ./env/core.env
volumes:
- core_data:/data
- ./config/core/app.conf:/etc/core/app.conf:ro
- ./config/core/private_key.pem:/etc/core/private_key.pem:ro
portal:
image: docker.io/bitnami/harbor-portal:2
container_name: harbor-portal
depends_on:
- core
jobservice:
image: docker.io/bitnami/harbor-jobservice:2
container_name: harbor-jobservice
depends_on:
- redis
- core
env_file:
- ./env/jobservice.env
volumes:
- jobservice_data:/var/log/jobs
- ./config/jobservice/config.yml:/etc/jobservice/config.yml:ro
redis:
image: docker.io/bitnami/redis:7.4
env_file:
- ./env/redis.env
harbor-nginx:
image: docker.io/bitnami/nginx:1.27
container_name: nginx
volumes:
- ./config/proxy/nginx.conf:/opt/bitnami/nginx/conf/nginx.conf:ro
ports:
- '80:8080'
depends_on:
- postgresql
- registry
- core
- portal
volumes:
registry_data:
driver: local
core_data:
driver: local
jobservice_data:
driver: local
postgresql_data:
driver: local
networks:
harbor_net:
Внимание! Это развертывание откроет порт 80/TCP. Если вам нужно использовать другие порты, вам необходимо изменить их в
docker-compose.yaml. Кроме того, если вы хотите получить внешний доступ к вашему частному серверу Harbor, настройте ваш брандмауэр.

Настройка Harbor
Сначала перейдите на сервер Harbor и войдите в систему под учетной записью admin, используя bitnami в качестве пароля.


Настройка OAuth-аутентификации
В дополнение к внутренней аутентификации, Harbor поддерживает различные виды внешней аутентификации, такие как LDAP или OIDC и т. д. В данной статье мы настраиваем OAuth2 OpenID Connect + Microsoft EntraID. Вам потребуется тенант Microsoft EntraID как минимум с бесплатной лицензией. Используя текущий метод, вам не потребуется ни внешний домен, ни публичный IP-адрес.
Сторона Harbor
- Перейдите в раздел Configuration в меню Administration и выберите OIDC из списка Auth Method.

Обратите внимание на Redirect URI внизу страницы.
Сторона Azure
- После входа в Microsoft EntraID создайте новую регистрацию приложения.

- Заполните поля Name и Redirect URI (http://localhost/c/oidc/callback).

Создайте новый клиентский секрет для приложения.
В зарегистрированном приложении в Token configuration добавьте групповые утверждения следующим образом.

- Создайте группу или группы, которые вы хотите сопоставить с вашим сервисом Harbor, и скопируйте их ObjectID.

Сторона Harbor (снова)
- Вернитесь на ваш локальный сервер Harbor и заполните необходимые поля, как показано на изображении ниже, и нажмите Save.

- Перейдите в Administration->Group и нажмите кнопку +New Group.

Заполните ObjectID группы и выберите роль.

Опыт входа пользователя
Для входа на сервер Harbor через SSO используйте кнопку Login with Microsoft EntraID.
Удостоверьтесь, что пользователь является членом вышеупомянутой AD группы

После успешного входа в учетную запись Microsoft завершите регистрацию в Harbor.


Перейдите в проект и нажмите Push command, чтобы получить информацию.

Для авторизации через Docker CLI используйте клиентский секрет, который можно найти в User Profile.

