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-сканировани/

Was this helpful?

0 / 0