Автоматическое сканирование Docker-образа при загрузке с помощью Terraform
Примечание
Автоматическое сканирование Docker-образов на наличие уязвимостей при загрузке в Yandex Container Registry можно включить в настройках сканера уязвимостей без создания функций и триггеров Yandex Cloud Functions.
Чтобы настроить автоматическое сканирование Docker-образов на наличие уязвимостей при загрузке в Yandex Container Registry с помощью Terraform:
- Подготовьте облако к работе.
- Подготовьте окружение.
- Создайте инфраструктуру.
- Загрузите Docker-образ.
- Проверьте результат.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входят:
- плата за хранение Docker-образа в реестре, сканер уязвимостей и исходящий трафик (см. тарифы Yandex Container Registry);
- плата за вызовы функций (см. тарифы Yandex Cloud Functions).
Подготовьте окружение
- Установите и настройте Docker.
Создайте инфраструктуру
Terraform
Terraform распространяется под лицензией Business Source License
Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform
Чтобы создать инфраструктуру для автоматического сканирования Docker-образа при загрузке с помощью Terraform:
-
Укажите источник для установки провайдера Yandex Cloud (раздел Настройте провайдер, шаг 1).
-
Подготовьте файлы с описанием инфраструктуры:
Готовая конфигурацияВручную-
Клонируйте репозиторий с конфигурационными файлами.
git clone https://github.com/yandex-cloud-examples/yc-cr-image-scanning
-
Перейдите в директорию с репозиторием. В ней должны появиться файлы:
image-auto-scan.tf
— конфигурация создаваемой инфраструктуры.image-auto-scan.auto.tfvars
— файл с пользовательскими данными.function.zip
— zip-архив с кодом функции.
-
Создайте папку для конфигурационных файлов.
-
Создайте в папке конфигурационный файл
image-auto-scan.tf
:image-auto-scan.tf
# Объявление переменных для пользовательских параметров variable "zone" { type = string } variable "folder_id" { type = string } # Добавление прочих переменных locals { sa_scanner_name = "scanner" sa_invoker_name = "invoker" registry_name = "my-registry" function_name = "scan-on-push" trigger_name = "trigger-for-reg" } # Настройка провайдера terraform { required_providers { yandex = { source = "yandex-cloud/yandex" version = ">= 0.47.0" } } } provider "yandex" { folder_id = var.folder_id } # Создание сервисных аккаунтов resource "yandex_iam_service_account" "scanner" { name = local.sa_scanner_name description = "SA for Container Registry" folder_id = var.folder_id } resource "yandex_iam_service_account" "invoker" { name = local.sa_invoker_name description = "SA for Cloud Functions" folder_id = var.folder_id } # Назначение ролей сервисным аккаунтам resource "yandex_resourcemanager_folder_iam_member" "sa-role-scanner" { folder_id = var.folder_id role = "container-registry.images.scanner" member = "serviceAccount:${yandex_iam_service_account.scanner.id}" } resource "yandex_resourcemanager_folder_iam_member" "sa-role-invoker" { folder_id = var.folder_id role = "functions.functionInvoker" member = "serviceAccount:${yandex_iam_service_account.invoker.id}" } # Создание реестра Container Registry resource "yandex_container_registry" "my-reg" { name = local.registry_name folder_id = var.folder_id } # Создание функции resource "yandex_function" "test-function" { name = local.function_name user_hash = "my-first-function" runtime = "bash" entrypoint = "handler.sh" memory = "128" execution_timeout = "60" service_account_id = yandex_iam_service_account.scanner.id content { zip_filename = "function.zip" } } # Создание триггера resource "yandex_function_trigger" "my-trigger" { name = local.trigger_name function { id = yandex_function.test-function.id service_account_id = yandex_iam_service_account.invoker.id } container_registry { registry_id = yandex_container_registry.my-reg.id create_image_tag = true batch_cutoff = "10" batch_size = "1" } }
-
Создайте файл с пользовательскими данными
image-auto-scan.auto.tfvars
:image-auto-scan.auto.tfvars
zone = "<зона_доступности>" folder_id = "<идентификатор_каталога>"
-
Подготовьте zip-архив с кодом функции.
-
Создайте файл
handler.sh
и скопируйте в него следующий код:handler.sh
Важно
DATA=$(cat | jq -sr '.[0].messages[0].details') ID=$(echo $DATA | jq -r '.image_id') NAME=$(echo $DATA | jq -r '.repository_name') TAG=$(echo $DATA | jq -r '.tag') yc container image scan --id ${ID} --async 1>&2
-
Создайте zip-архив
function.zip
с файломhandler.sh
.
-
Более подробную информацию о параметрах используемых ресурсов в Terraform см. в документации провайдера:
-
-
В файле
image-auto-scan.auto.tfvars
задайте пользовательские параметры:zone
— зона доступности, в которой будет создана инфраструктура.folder_id
— идентификатор каталога, в котором будет создана инфраструктура.
-
Создайте ресурсы:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validate
Если конфигурация является корректной, появится сообщение:
Success! The configuration is valid.
-
Выполните команду:
terraform plan
В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply
-
Подтвердите изменения: введите в терминале слово
yes
и нажмите Enter.
-
Загрузите Docker-образ
-
Запустите Docker Desktop.
-
Аутентифицируйтесь в реестре от своего имени с помощью:
Docker Credential helperOAuth-токенаIAM-токена-
Сконфигурируйте Docker для использования
docker-credential-yc
:yc container registry configure-docker
Результат:
Credential helper is configured in '/home/<user>/.docker/config.json'
Настройки сохраняются в профиле текущего пользователя.
Важно
Credential helper работает только при использовании Docker без
sudo
. О том, как настроить запуск Docker от имени текущего пользователя без использованияsudo
читайте в официальной документации Docker . -
Проверьте, что Docker сконфигурирован.
В конфигурационном файле
/home/<user>/.docker/config.json
должна появиться строка:"cr.yandex": "yc"
-
Docker готов к использованию, например, для загрузки Docker-образов. При этом выполнять команду
docker login
не надо.
-
Если у вас еще нет OAuth-токена, получите его по ссылке
. -
Выполните команду:
echo <OAuth-токен> | docker login --username oauth --password-stdin cr.yandex
Результат:
Login Succeeded
Примечание
У IAM-токена короткое время жизни — не более 12 часов. Поэтому такой способ подойдет для приложений, которые будут запрашивать IAM-токен автоматически.
-
-
Скачайте Docker-образ с Docker Hub
:docker pull ubuntu:20.04
Результат:
20.04: Pulling from library/ubuntu Digest: sha256:cf31af331f38d1d7158470e095b132acd126a7180a54f263d386da88******** Status: Image is up to date for ubuntu:20.04 docker.io/library/ubuntu:20.04
-
Присвойте тег Docker-образу:
docker tag ubuntu:20.04 cr.yandex/<идентификатор_реестра>/ubuntu:20.04
-
Загрузите Docker-образ в Container Registry:
docker push cr.yandex/<идентификатор_реестра>/ubuntu:20.04
Результат:
The push refers to repository [cr.yandex/crpu20rpdc2f********/ubuntu] 2f140462f3bc: Layer already exists 63c99163f472: Layer already exists ccdbb80308cc: Layer already exists 20.04: digest: sha256:86ac87f73641c920fb42cc9612d4fb57b5626b56ea2a19b894d0673f******** size: 943
Проверьте результат
-
Просмотрите логи функции
scan-on-push
и убедитесь, что она выполнилась.Консоль управленияCLI- В консоли управления
выберите сервис Cloud Functions. - Перейдите в раздел Функции и выберите функцию
scan-on-push
. - В открывшемся окне перейдите в раздел Логи и укажите период. По умолчанию задан период за 1 час.
Чтобы узнать имя или уникальный идентификатор функции, получите список функций в каталоге.
Посмотрите журнал выполнения функции:
yc serverless function logs scan-on-push
Результат:
2021-05-18 09:27:43 START RequestID: 34dc9533-ed6e-4468-b9f2-2aa0******** Version: b09i2s85a0c1******** 2021-05-18 09:27:43 END RequestID: 34dc9533-ed6e-4468-b9f2-2aa0******** 2021-05-18 09:27:43 REPORT RequestID: 34dc9533-ed6e-4468-b9f2-2aa0******** Duration: 538.610 ms Billed Duration: 538.700 ms Memory Size: 128 MB Max Memory Used: 13 MB 2021-05-18 09:29:25 START RequestID: 5b6a3779-dcc8-44ec-8ee2-2e7f******** Version: b09i2s85a0c1******** 2021-05-18 09:29:26 END RequestID: 5b6a3779-dcc8-44ec-8ee2-2e7f******** 2021-05-18 09:29:26 REPORT RequestID: 5b6a3779-dcc8-44ec-8ee2-2e7f******** Duration: 554.904 ms Billed Duration: 555.000 ms Memory Size: 128 MB Max Memory Used: 13 MB ...
- В консоли управления
-
Проверьте, что при загрузке Docker-образа запустилось новое сканирование.
Консоль управленияCLI- В консоли управления
выберите каталог, которому принадлежит реестр, содержащий Docker-образ. - Выберите сервис Container Registry.
- Выберите реестр, в который загрузили Docker-образ.
- Откройте репозиторий, в котором находится Docker-образ.
- Выберите нужный Docker-образ и проверьте значение параметра Дата последнего сканирования.
Чтобы посмотреть запуски сканирования по Docker-образу, выполните команду:
yc container image list-scan-results --repository-name=<идентификатор_реестра>/<имя_Docker-образа>
Результат:
+----------------------+----------------------+---------------------+--------+--------------------------------+ | ID | IMAGE | SCANNED AT | STATUS | VULNERABILITIES | +----------------------+----------------------+---------------------+--------+--------------------------------+ | crpu20rpdc2f******** | crpqmsqp5mtb******** | 2021-05-18 14:34:02 | READY | medium:6, low:13, negligible:3 | +----------------------+----------------------+---------------------+--------+--------------------------------+
- В консоли управления
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы:
-
Откройте конфигурационный файл
image-auto-scan.tf
и удалите описание создаваемой инфраструктуры из файла. -
Примените изменения:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validate
Если конфигурация является корректной, появится сообщение:
Success! The configuration is valid.
-
Выполните команду:
terraform plan
В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply
-
Подтвердите изменения: введите в терминале слово
yes
и нажмите Enter.
-