Harbor – реджестри образов в Kubernetes (сканирование образов)

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 не требуется никаких зависимостей:




--- 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




Проверьте установленную версию:




$ <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:




$ helm repo add harbor https://helm.goharbor.io

"harbor" has been added to your repositories




Обновите репозиторий:




$ helm repo update




Настройка чарта




Элементы конфигурации могут быть установлены с помощью флага –set во время установки или настроены путем непосредственного редактирования values.yaml.




Вы можете скачать файл values.yaml по умолчанию.




wget https://raw.githubusercontent.com/goharbor/harbor-helm/master/values.yaml

vim values.yaml




Установите чарт Harbor с пользовательскими настройками после внесения изменений.




$ 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.




Проверьте статус, чтобы подтвердить его развертывание:




$ helm status harbor




Исправление инициализации:CrashLoopBackOff в поде harbor-harbor-database на OpenShift




Некоторые образы контейнеров, такие как postgres и redis, требуют рутового доступа и имеют определенные ожидания относительно владения томами.




Нам нужно ослабить безопасность в кластере, чтобы образы не запускались как предварительно выделенный UID, не предоставляя всем доступ к привилегированному SCC:




Предоставьте всем аутентифицированным пользователям доступ к anyuid SCC:




$ oc adm policy add-scc-to-group anyuid system:authenticated




1$ oc adm policy add-scc-to-group anyuid system:authenticated




Проверьте статус ваших развертываний:




$ 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




Проверьте статус  подов:




$ 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




Посмотрите последние созданные сервисы и ингрессы:




$ kubectl get svc

NAME                          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE

harbor-harbor-chartmuseum     ClusterIP   172.30.161.108   &lt;none&gt;        80/TCP              26m

harbor-harbor-clair           ClusterIP   172.30.133.154   &lt;none&gt;        8080/TCP            26m

harbor-harbor-core            ClusterIP   172.30.29.180    &lt;none&gt;        80/TCP              26m

harbor-harbor-database        ClusterIP   172.30.199.219   &lt;none&gt;        5432/TCP            26m

harbor-harbor-jobservice      ClusterIP   172.30.86.18     &lt;none&gt;        80/TCP              26m

harbor-harbor-notary-server   ClusterIP   172.30.188.135   &lt;none&gt;        4443/TCP            26m

harbor-harbor-notary-signer   ClusterIP   172.30.165.7     &lt;none&gt;        7899/TCP            26m

harbor-harbor-portal          ClusterIP   172.30.41.233    &lt;none&gt;        80/TCP              26m

harbor-harbor-redis           ClusterIP   172.30.101.107   &lt;none&gt;        6379/TCP            26m

harbor-harbor-registry        ClusterIP   172.30.112.213   &lt;none&gt;        5000/TCP,8080/TCP   26m



$ kubectl get ing

NAME                    HOSTS                                     ADDRESS   PORTS     AGE

harbor-harbor-ingress   core.harbor.domain,notary.harbor.domain




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




$ 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




Также создан ряд pvc!




Подбирая значения указанного вами размера.




$ 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 на наличие уязвимостей




Harbor – это локальный реестр Docker, который, будучи собранным с поддержкой Clair, позволяет сканировать спушенные образы на наличие известных уязвимостей.




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




Но как использовать Harbour для сканирования этих образов?




Давайте посмотрим.




Что вам нужно




Самое главное, вам понадобится это Harbor (с поддержкой Clair).




Вам также понадобятся образа для отправки на сервер Harbor и учетную запись пользователя на сервере Harbour. 




Сертификаты




Если вы планируете передавать образы с компьютеров в вашей сети (которые не являются вашим сервером Harbour), вам необходимо скопировать сертификаты с сервера Harbour на клиенты.




Если вы следовали инструкциям по установке Harbor, возможно, вы используете самозаверенные сертификаты.




Я собираюсь предположить, что это так.




И так … вот как скопировать эти сертификаты с сервера на клиент:




  1. подключитесь по ssh (или войдите в консоль) к серверу Harbor.



  2. Получите root-доступ с помощью команды sudo -s.



  3. Перейдите в каталог сертификатов с помощью команды cd /etc/docker/certs.d/SERVER_IP (где SERVER_IP – это IP-адрес вашего сервера).



  4. Скопируйте ключ ca.cert на клиент с помощью команды scp ca.cert USER @ CLIENT_IP: / home / USER (где USER – имя пользователя на клиентском компьютере, а CLIENT_IP – IP-адрес клиентского компьютера).



  5. Скопируйте ключ ca.crt на клиент с помощью команды scp ca.crt USER @ CLIENT_IP: / home / USER (где USER – это имя пользователя на клиентском компьютере, а CLIENT_IP – это IP-адрес клиентского компьютера).



  6. Скопируйте клиентский ключ ca.key с помощью команды scp ca.key USER @ CLIENT_IP: / home / USER (где USER – это имя пользователя на клиентском компьютере, а CLIENT_IP – это IP-адрес клиентского компьютера).



  7. SSH к клиентскому компьютеру с помощью команды ssh USER @ CLIENT_IP (где USER – имя пользователя на клиентском компьютере, а CLIENT_IP – IP-адрес клиентского компьютера).



  8. Создайте новый каталог сертификатов с помощью команды sudo mkdir -p /etc/docker/certs.d/SERVER_IP (где SERVER_IP – это IP-адрес сервера Harbour).



  9. Скопируйте файлы с помощью команды sudo cp ca. * /etc/docker/certs.d/SERVER_IP (где SERVER_IP – IP-адрес сервера Harbor).




Теперь ваш клиент должен иметь возможность войти в репозиторий Harbor и отправлять образы.




Пометка образов ( теги )




Прежде чем отправить образ с клиента на сервер, сначала необходимо пометить его.




Допустим, у вас есть официальный образ Ubuntu, и вы хотите пометить его конкретным именем разработчика.




Чтобы пометить его так, чтобы его можно было перенести в реестр Harbor, команда tag будет выглядеть так:




docker tag ubuntu SERVER_IP/PROJECT_NAME/ubuntu:DEVNAME




Где:




  •  SERVER_IP – это IP-адрес сервера Harbour.



  • PROJECT_NAME – это имя проекта на сервере Harbour.



  • DEVNAME: имя разработчика, которого вы хотите пометить.




Таким образом, команда может выглядеть так:




docker tag ubuntu 192.168.1.75/test/ubuntu:jack




Пушинг образа




Сначала вы должны войти в реестр на сервере Harbor.




Для этого выполните команду:




docker login SERVER_IP




Где SERVER_IP – это IP-адрес сервера Harbor.




Вам будет предложено ввести имя пользователя и пароль пользователя на сервере Harbour.




После входа в систему вы можете спушить образ с помощью команды:




docker push 192.168.1.75/test/ubuntu:jack




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




Сканирование образа




Войдите в свой реестр Harbor и перейдите к проекту, в котором размещен недавно подтянутый образ




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




Created with GIMP




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




После выбора нажмите кнопку SCAN, чтобы начать сканирование.




Created with GIMP




Когда сканирование завершится, вы увидите полосу, представляющую результаты сканирования.




Наведите курсор на эту полосу, чтобы просмотреть отчет:




Created with GIMP




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




Created with GIMP




Прокрутите весь отчет, чтобы просмотреть все уязвимости.




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




Но важно просканировать эти уязвимости!




Источник: https://sidmid.ru/harbor-реджестри-образов-в-kubernetes-сканировани/



2023-01-02T04:57:39
DevOps