Harbor – корпоративный реестр контейнеров. На текущий момент VMware использует Harbor в своих продуктах для управления контейнерами: vSphere Integrated Containers (VIC) и Pivotal Container Service (PKS), кроме этого Вы можете установить его и использовать отдельно. Так как управление через графический интерфейс не позволяет автоматизировать работу, то будем знакомиться с управлением Harbor через REST API.
Знакомство с REST API лучше начать с домашней страницы Harbor: https://goharbor.io/ и страницы на github: https://github.com/goharbor/harbor. Для изучения всех доступных функций REST API и их параметров скачайте файл https://github.com/goharbor/harbor/blob/master/docs/swagger.yaml. Swagger — это фреймворк для описания REST API. Файл swagger.yaml можно открыть в онлайн редакторе http://editor.swagger.io/ или импортировать в Postman (в данном случае рекомендую в строке “host: localhost” заменить localhost на имя Вашего сервера harbor: например “host: harbor.zabedu.ru”). На изображении справа начало списка команд, загруженных в Postmap. Всего импортировано 106 шаблонов запросов (Harbor версии 1.7.0).
Список публичных проектов
Пора сделать первый запрос. Нужен полный список проектов на сервере Harbor? В списке импортированных запросов выберите в разделе “projects” запрос “List projects”. Полный запрос выглядит так:
https://harbor.zabedu.ru/api/projects?name={{name}}&public={{public}}&owner={{owner}}&page={{page}}&page_size={{page_size}}
В фигурных скобках в Postman указываются имена переменных, нужно задать их значения перед запуском запроса. Возможен и другой способ указания переменных, перед именем переменной можно поставить двоеточие (:). Уберите из запроса все дополнительные условия, поскольку нужных значений у Вас пока нет.
https://harbor.zabedu.ru/api/projects
Пошлите запрос на сервер – Send…
[ { "project_id": 121, "owner_id": 3, "name": "zabedu", "creation_time": "2018-12-20T10:11:10Z", "update_time": "2018-12-20T10:11:10Z", "deleted": false, "owner_name": "", "togglable": false, "current_user_role_id": 0, "repo_count": 2, "metadata": { "auto_scan": "true", "enable_content_trust": "true", "prevent_vul": "true", "public": "true", "severity": "low" } } ]
Если ответ не получен, то проверьте работу сервера и его доступность по сети, для проверки можно ввести запрос в адресной строке браузера или вызвать его через curl:
$ curl -i -k -X GET "https://harbor.zabedu.ru/api/projects"
Это простой GET-запрос, без авторизации он возвращает список только публичных проектов. После добавления параметров авторизации, запрос выведет список всех доступных Вам проектов.
Авторизация
Для настройки авторизации на вкладке Authorization выберите тип Basic, укажите имя пользователя, пароль и нажмите Preview Request, к списку заголовков запроса (вкладка Headers) будут добавлены параметры авторизации.

Большинство запросов просто не будут работать без авторизации. О необходимости авторизации подскажет код ответа сервера “401 Unauthorized”.
Список репозиториев
Список репозиториев в проекте можно получить через поиск:
https://harbor.zabedu.ru/api/search?q=zabedu
Данный запрос возвращает информацию и о проекте zabedu, и о его репозиториях. Также список репозиториев можно получить и отдельным списком:
https://harbor.zabedu.ru/api/repositories?project_id=121
На входе запрос принимает id проекта, id Вы уже получили выше.
[ { "id": 125, "name": "zabedu/nginx", "project_id": 121, "description": "", "pull_count": 0, "star_count": 0, "tags_count": 2, "labels": [], "creation_time": "2018-12-24T07:46:11.62455Z", "update_time": "2018-12-24T07:46:11.62455Z" }, { "id": 126, "name": "zabedu/mysql", "project_id": 121, "description": "", "pull_count": 0, "star_count": 0, "tags_count": 1, "labels": [], "creation_time": "2018-12-24T07:53:44.408568Z", "update_time": "2018-12-24T07:53:44.408568Z" } ]
Для получения полного списка репозиториев, выполните предыдущий запрос не указывая имя проекта:
https://harbor.zabedu.ru/api/search?q=
Список тегов
Список репозиториев у Вас есть, на очереди теги:
https://harbor.zabedu.ru/api/repositories/{{repo_name}}/tags
[ { "digest": "sha256:87e9b6904b42...4b53fdd467189f", "name": "latest", "size": 44698625, "architecture": "amd64", "os": "linux", "docker_version": "17.06.2-ce", "author": "as-NGINX", "created": "2018-11-27T22:21:45.207738888Z", "config": { "labels": { "maintainer": "as-NGINX" } }, "signature": null, "scan_overview": { "image_digest": "sha256:87e9b6...53fdd467189f", "scan_status": "finished", "job_id": 389, "severity": 4, "components": { "total": 71, "summary": [ { "severity": 2, "count": 1 }, { "severity": 1, "count": 66 }, { "severity": 4, "count": 4 } ] }, "details_key": "d6bc3ea2...176d4be881d3", "creation_time": "2018-12-24T07:46:11.661298Z", "update_time": "2018-12-25T01:28:18.409452Z" }, "labels": [] } ]
Имя, наличие подписи, дата создания, размер, архитектура… Всё есть!
Список уязвимостей
В предыдущем примере в данных по каждому тегу присутствует раздел “scan_overview”. Этот раздел содержит информацию о результате работы сканера уязвимостей clair:
- “scan_status” – результат последнего сканирования;
- “severity” – максимальный для всех обнаруженных уязвимостей уровень угрозы;
- “summary” – количество пакетов по каждому уровню угроз;
- “update_time” – время последнего сканирования.
Нужно подготовить сводный отчет по результатам сканирования? Если информации о количестве обнаруженных уязвимостей недостаточно, то можно получить полный детализированный список угроз:
https://harbor.zabedu.ru/api/repositories/:repo_name/tags/:tag/vulnerability/details
Вместо :repo_name и :tag Postman подставит значения соответствующих переменных.
[ { "id": "CVE-2018-1152", "severity": 3, "package": "libjpeg-turbo", "version": "1:1.5.1-2", "description": "libjpeg-turbo 1.5.90 is vulnerable to a denial of service vulnerability caused by a divide by zero when processing a crafted BMP image.", "link": "https://security-tracker.debian.org/tracker/CVE-2018-1152" }, { "id": "CVE-2017-15232", "severity": 3, "package": "libjpeg-turbo", "version": "1:1.5.1-2", "description": "libjpeg-turbo 1.5.2 has a NULL Pointer Dereference in jdpostct.c and jquant1.c via a crafted JPEG file.", "link": "https://security-tracker.debian.org/tracker/CVE-2017-15232" } ... ]
Просмотр логов
Теперь Вы знаете какие репозитории и теги есть в Harbor и какие в них обнаружены уязвимости. Осталось выяснить: кто загрузил в реестр образ c уязвимостями?
https://harbor.zabedu.ru/api/logs?username={{username}}&repository={{repository}}&tag={{tag}}&operation={{operation}}&begin_timestamp={{begin_timestamp}}&end_timestamp={{end_timestamp}}&page={{page}}&page_size={{page_size}}
Укажите нужные Вам параметры поиска, я оставил имя репозитория, тег и операцию push:
[ { "log_id": 1416, "username": "as", "project_id": 19, "repo_name": "zabedu/nginx", "repo_tag": "latest", "guid": "", "operation": "push", "op_time": "2018-12-17T15:20:09.393893Z" }, { "log_id": 1412, "username": "as", "project_id": 19, "repo_name": "zabedu/nginx", "repo_tag": "latest", "guid": "", "operation": "push", "op_time": "2018-12-17T14:47:03.151675Z" } ... ]
Для знакомства с REST API Harbor этого вполне достаточно. В REST API реализованы все функции управления Harbor, а не только получение информации от сервера. И не забывайте делиться своими успехами!