Thank you for reading this post, don't forget to subscribe!
Harbor – это облачный реестр с открытым исходным кодом, который хранит, подписывает и сканирует образы контейнеров на наличие уязвимостей.
Это руководство покажет вам как установить Harbor Image Registry в Kubernetes / OpenShift с помощью чарта Helm.
Вот некоторые из интересных особенностей реестра образов Harbour:
Особенности Harbour
- Поддержка Multi-tenant
- Поддержка анализа безопасности и уязвимостей
- Расширяемый API и веб-интерфейс
- Подписание и проверка контента
- Репликация образов в нескольких экземплярах Harbour
- Интеграция и контроль доступа на основе ролей
Helm – это инструмент интерфейса командной строки (CLI), созданный для упрощения развертывания приложений и сервисов в кластерах Kubernetes / OpenShift
Helm использует формат упаковки, называемый чартами.
Чарт Helm – это набор файлов, описывающих ресурсы Kubernetes.
Шаг 1: Установка Helm 3 на Linux / macOS
Helm имеет бинарник, что означает, что для его установки на вашем компьютере Linux / macOS не требуется никаких зависимостей:
1 2 3 4 5 6 7 |
--- Linux --- sudo curl -L https://mirror.openshift.com/pub/openshift-v4/clients/helm/latest/helm-linux-amd64 -o /usr/local/bin/helm sudo chmod +x /usr/local/bin/helm --- macOS --- sudo curl -L https://mirror.openshift.com/pub/openshift-v4/clients/helm/latest/helm-darwin-amd64 -o /usr/local/bin/helm sudo chmod +x /usr/local/bin/helm |
Проверьте установленную версию:
1 2 |
$ <strong>helm version</strong> version.BuildInfo{Version:"<strong>v3.1</strong>+unreleased", GitCommit:"7ebdbb86fca32c77f2fce166f7f9e58ebf7e9946", GitTreeState:"clean", GoVersion:"go1.13.4"} |
Шаг 2: Установите чарт Harbor в Kubernetes / OpenShift кластере
Чарт – это пакет Helm.
Он содержит все определения ресурсов, необходимые для запуска приложения, инструмента или службы внутри кластера Kubernetes.
Добавьте репозиторий Harbour Helm:
1 2 |
$ helm repo add harbor https://helm.goharbor.io "harbor" has been added to your repositories |
1 |
$ helm repo update |
Настройка чарта
Элементы конфигурации могут быть установлены с помощью флага –set во время установки или настроены путем непосредственного редактирования values.yaml.
Вы можете скачать файл values.yaml по умолчанию.
1 2 |
wget https://raw.githubusercontent.com/goharbor/harbor-helm/master/values.yaml vim values.yaml |
1 2 3 4 5 6 7 8 9 10 11 |
$ helm install harbor harbor/harbor -f values.yaml -n harbor NAME: harbor LAST DEPLOYED: Wed Apr 1 19:20:07 2020 NAMESPACE: harbor STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: Please wait for several minutes for Harbor deployment to complete. Then you should be able to visit the Harbor portal at https://hbr.apps.hqocp.safaricom.net. For more details, please visit https://github.com/goharbor/harbor. |
Проверьте статус, чтобы подтвердить его развертывание:
1 |
$ helm status harbor |
Исправление инициализации:CrashLoopBackOff в поде harbor-harbor-database на OpenShift
Некоторые образы контейнеров, такие как postgres и redis, требуют рутового доступа и имеют определенные ожидания относительно владения томами.
Нам нужно ослабить безопасность в кластере, чтобы образы не запускались как предварительно выделенный UID, не предоставляя всем доступ к привилегированному SCC:
Предоставьте всем аутентифицированным пользователям доступ к anyuid SCC:
1 |
$ oc adm policy add-scc-to-group anyuid system:authenticated |
Проверьте статус ваших развертываний:
1 2 3 4 5 6 7 8 9 10 |
$ kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE harbor-harbor-chartmuseum 1/1 1 1 24m harbor-harbor-clair 1/1 1 1 24m harbor-harbor-core 1/1 1 1 24m harbor-harbor-jobservice 1/1 1 1 24m harbor-harbor-notary-server 1/1 1 1 24m harbor-harbor-notary-signer 1/1 1 1 24m harbor-harbor-portal 1/1 1 1 24m harbor-harbor-registry 1/1 1 1 24m |
Проверьте статус подов:
1 2 3 4 5 6 7 8 9 10 11 12 |
$ kubectl get pods NAME READY STATUS RESTARTS AGE harbor-harbor-chartmuseum-58f8647f95-mtmmf 1/1 Running 0 5m16s harbor-harbor-clair-654dcfd8bf-77qs6 2/2 Running 0 5m16s harbor-harbor-core-5cb85989d6-r7s84 1/1 Running 0 5m16s harbor-harbor-database-0 1/1 Running 0 5m33s harbor-harbor-jobservice-fc54cf784-lv864 1/1 Running 0 5m16s harbor-harbor-notary-server-65d8fb7c77-xgxvg 1/1 Running 0 5m16s harbor-harbor-notary-signer-66c9db4cf4-5bwvh 1/1 Running 0 5m16s harbor-harbor-portal-5cbc6d5897-r5wzh 1/1 Running 0 25m harbor-harbor-redis-0 1/1 Running 0 5m16s harbor-harbor-registry-7ff65976f4-sgnnd 2/2 Running 0 5m16s |
Посмотрите последние созданные сервисы и ингрессы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE harbor-harbor-chartmuseum ClusterIP 172.30.161.108 <none> 80/TCP 26m harbor-harbor-clair ClusterIP 172.30.133.154 <none> 8080/TCP 26m harbor-harbor-core ClusterIP 172.30.29.180 <none> 80/TCP 26m harbor-harbor-database ClusterIP 172.30.199.219 <none> 5432/TCP 26m harbor-harbor-jobservice ClusterIP 172.30.86.18 <none> 80/TCP 26m harbor-harbor-notary-server ClusterIP 172.30.188.135 <none> 4443/TCP 26m harbor-harbor-notary-signer ClusterIP 172.30.165.7 <none> 7899/TCP 26m harbor-harbor-portal ClusterIP 172.30.41.233 <none> 80/TCP 26m harbor-harbor-redis ClusterIP 172.30.101.107 <none> 6379/TCP 26m harbor-harbor-registry ClusterIP 172.30.112.213 <none> 5000/TCP,8080/TCP 26m $ kubectl get ing NAME HOSTS ADDRESS PORTS AGE harbor-harbor-ingress core.harbor.domain,notary.harbor.domain |
Поскольку я на самом деле делаю это развертывание в OpenShift, у меня будут созданы определенные маршруты.
1 2 3 4 5 6 7 8 9 |
$ kubectl get route NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD harbor-harbor-ingress-7f9vg notary.harbor.domain / harbor-harbor-notary-server 4443 edge/Redirect None harbor-harbor-ingress-9pvvz core.harbor.domain / harbor-harbor-portal 8080 edge/Redirect None harbor-harbor-ingress-d7mcn core.harbor.domain /c/ harbor-harbor-core 8080 edge/Redirect None harbor-harbor-ingress-gn5w6 core.harbor.domain /chartrepo/ harbor-harbor-core 8080 edge/Redirect None harbor-harbor-ingress-jf48l core.harbor.domain /service/ harbor-harbor-core 8080 edge/Redirect None harbor-harbor-ingress-lhbx4 core.harbor.domain /api/ harbor-harbor-core 8080 edge/Redirect None harbor-harbor-ingress-vtt8v core.harbor.domain /v2/ harbor-harbor-core 8080 edge/Redirect None |
1 2 3 4 5 6 7 |
$ kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE data-harbor-harbor-redis-0 Bound pvc-1de4a5b2-d55a-48cc-b8b6-1b258214260c 1Gi RWO ocs-storagecluster-cephfs 29m database-data-harbor-harbor-database-0 Bound pvc-9754adde-e2bd-40ee-b18b-d72eacfdfc12 1Gi RWO ocs-storagecluster-cephfs 29m harbor-harbor-chartmuseum Bound pvc-3944fce8-ecee-4bec-b0f6-cc5da3b30572 5Gi RWO ocs-storagecluster-cephfs 29m harbor-harbor-jobservice Bound pvc-5ecf0be4-002c-4628-8dcc-283e996175bc 1Gi RWO ocs-storagecluster-cephfs 29m harbor-harbor-registry Bound pvc-072358e9-06f2-4384-b7d6-88e97eb29499 5Gi RWO ocs-storagecluster-cephfs 29m |
Шаг 3: Доступ к панели управления Harbour
Используйте внешний домен, настроенный во время установки, для доступа к панели мониторинга реестра контейнера Harbour.
Креды по умолчанию:
Username: admin
Password: Harbor12345
использовать Harbor для сканирования образов Docker на наличие уязвимостей
Что вам нужно
Сертификаты
Если вы планируете передавать образы с компьютеров в вашей сети (которые не являются вашим сервером Harbour), вам необходимо скопировать сертификаты с сервера Harbour на клиенты.
Если вы следовали инструкциям по установке Harbor, возможно, вы используете самозаверенные сертификаты.
Я собираюсь предположить, что это так.
И так … вот как скопировать эти сертификаты с сервера на клиент:
- подключитесь по ssh (или войдите в консоль) к серверу Harbor.
- Получите root-доступ с помощью команды sudo -s.
- Перейдите в каталог сертификатов с помощью команды cd /etc/docker/certs.d/SERVER_IP (где SERVER_IP – это IP-адрес вашего сервера).
- Скопируйте ключ ca.cert на клиент с помощью команды scp ca.cert USER @ CLIENT_IP: / home / USER (где USER – имя пользователя на клиентском компьютере, а CLIENT_IP – IP-адрес клиентского компьютера).
- Скопируйте ключ ca.crt на клиент с помощью команды scp ca.crt USER @ CLIENT_IP: / home / USER (где USER – это имя пользователя на клиентском компьютере, а CLIENT_IP – это IP-адрес клиентского компьютера).
- Скопируйте клиентский ключ ca.key с помощью команды scp ca.key USER @ CLIENT_IP: / home / USER (где USER – это имя пользователя на клиентском компьютере, а CLIENT_IP – это IP-адрес клиентского компьютера).
- SSH к клиентскому компьютеру с помощью команды ssh USER @ CLIENT_IP (где USER – имя пользователя на клиентском компьютере, а CLIENT_IP – IP-адрес клиентского компьютера).
- Создайте новый каталог сертификатов с помощью команды sudo mkdir -p /etc/docker/certs.d/SERVER_IP (где SERVER_IP – это IP-адрес сервера Harbour).
- Скопируйте файлы с помощью команды sudo cp ca. * /etc/docker/certs.d/SERVER_IP (где SERVER_IP – IP-адрес сервера Harbor).
Пометка образов ( теги )
Прежде чем отправить образ с клиента на сервер, сначала необходимо пометить его.
Допустим, у вас есть официальный образ Ubuntu, и вы хотите пометить его конкретным именем разработчика.
Чтобы пометить его так, чтобы его можно было перенести в реестр Harbor, команда tag будет выглядеть так:
1 |
docker tag ubuntu SERVER_IP/PROJECT_NAME/ubuntu:DEVNAME |
- SERVER_IP – это IP-адрес сервера Harbour.
- PROJECT_NAME – это имя проекта на сервере Harbour.
- DEVNAME: имя разработчика, которого вы хотите пометить.
Таким образом, команда может выглядеть так:
1 2 3 |
docker tag ubuntu 192.168.1.75/test/ubuntu:jack |
Пушинг образа
Для этого выполните команду:
1 |
docker login SERVER_IP |
Где SERVER_IP – это IP-адрес сервера Harbor.
Вам будет предложено ввести имя пользователя и пароль пользователя на сервере Harbour.
После входа в систему вы можете спушить образ с помощью команды:
1 |
docker push 192.168.1.75/test/ubuntu:jack |
Сканирование образа
Войдите в свой реестр Harbor и перейдите к проекту, в котором размещен недавно подтянутый образ
Вы должны увидеть образ в списке:

Щелкните на новый образ и в появившемся окне установите флажок, связанный с тегом образа.
После выбора нажмите кнопку SCAN, чтобы начать сканирование.


Если вы нажмете на имя тега, вы увидите полный отчет, в котором представлены полные результаты, включая CVE для каждой уязвимости:

Прокрутите весь отчет, чтобы просмотреть все уязвимости.
Если вы обнаружите, что образ содержит слишком много общих уязвимостей или достаточно средних или высоких уязвимостей, я предлагаю не использовать его.
Но важно просканировать эти уязвимости!