Yandex Cloud
Поиск
Связаться с намиПодключиться
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Контейнеры
    • Инструменты разработчика
    • Бессерверные вычисления
    • Безопасность
    • Мониторинг и управление ресурсами
    • Машинное обучение
    • Бизнес-инструменты
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Истории успеха
    • Тарифы Yandex Cloud
    • Промоакции и free tier
    • Правила тарификации
  • Документация
  • Блог
Проект Яндекса
© 2025 ООО «Яндекс.Облако»
Yandex Container Registry
  • Начало работы
  • Yandex Container Solution
  • Управление доступом
  • Правила тарификации
  • Справочник Terraform
  • Метрики Monitoring
  • Аудитные логи Audit Trails
  • Решение проблем
  • Вопросы и ответы
  • Обучающие курсы

В этой статье:

  • Подготовьте облако к работе
  • Необходимые платные ресурсы
  • Подготовьте окружение
  • Создайте инфраструктуру
  • Загрузите Docker-образ
  • Проверьте результат
  • Как удалить созданные ресурсы

Автоматическое сканирование Docker-образа при загрузке с помощью Terraform

Статья создана
Yandex Cloud
Улучшена
kvendingoldo
Обновлена 21 марта 2025 г.
  • Подготовьте облако к работе
    • Необходимые платные ресурсы
  • Подготовьте окружение
  • Создайте инфраструктуру
  • Загрузите Docker-образ
  • Проверьте результат
  • Как удалить созданные ресурсы

Примечание

Автоматическое сканирование Docker-образов на наличие уязвимостей при загрузке в Yandex Container Registry можно включить в настройках сканера уязвимостей без создания функций и триггеров Yandex Cloud Functions.

Чтобы настроить автоматическое сканирование Docker-образов на наличие уязвимостей при загрузке в Yandex Container Registry с помощью Terraform:

  1. Подготовьте облако к работе.
  2. Подготовьте окружение.
  3. Создайте инфраструктуру.
  4. Загрузите Docker-образ.
  5. Проверьте результат.

Если созданные ресурсы вам больше не нужны, удалите их.

Подготовьте облако к работеПодготовьте облако к работе

Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:

  1. Перейдите в консоль управления, затем войдите в Yandex Cloud или зарегистрируйтесь.
  2. На странице Yandex Cloud Billing убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе ACTIVE или TRIAL_ACTIVE. Если платежного аккаунта нет, создайте его и привяжите к нему облако.

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

Подробнее об облаках и каталогах.

Необходимые платные ресурсыНеобходимые платные ресурсы

В стоимость поддержки инфраструктуры входят:

  • плата за хранение Docker-образа в реестре, сканер уязвимостей и исходящий трафик (см. тарифы Yandex Container Registry);
  • плата за вызовы функций (см. тарифы Yandex Cloud Functions).

Подготовьте окружениеПодготовьте окружение

  1. Установите и настройте Docker.

Создайте инфраструктуруСоздайте инфраструктуру

Terraform позволяет быстро создать облачную инфраструктуру в Yandex Cloud и управлять ею с помощью файлов конфигураций. В файлах конфигураций хранится описание инфраструктуры на языке HCL (HashiCorp Configuration Language). При изменении файлов конфигураций Terraform автоматически определяет, какая часть вашей конфигурации уже развернута, что следует добавить или удалить.

Terraform распространяется под лицензией Business Source License, а провайдер Yandex Cloud для Terraform — под лицензией MPL-2.0.

Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform или в зеркале.

Чтобы создать инфраструктуру для автоматического сканирования Docker-образа при загрузке с помощью Terraform:

  1. Установите Terraform и получите данные для аутентификации.

  2. Укажите источник для установки провайдера Yandex Cloud (раздел Настройте провайдер, шаг 1).

  3. Подготовьте файлы с описанием инфраструктуры:

    Готовая конфигурация
    Вручную
    1. Клонируйте репозиторий с конфигурационными файлами.

      git clone https://github.com/yandex-cloud-examples/yc-cr-image-scanning
      
    2. Перейдите в директорию с репозиторием. В ней должны появиться файлы:

      • image-auto-scan.tf — конфигурация создаваемой инфраструктуры.
      • image-auto-scan.auto.tfvars — файл с пользовательскими данными.
      • function.zip — zip-архив с кодом функции.
    1. Создайте папку для конфигурационных файлов.

    2. Создайте в папке конфигурационный файл 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"
        }
      }
      
    3. Создайте файл с пользовательскими данными image-auto-scan.auto.tfvars:

      image-auto-scan.auto.tfvars
      zone      = "<зона_доступности>"
      folder_id = "<идентификатор_каталога>"
      
    4. Подготовьте zip-архив с кодом функции.

      1. Создайте файл handler.sh и скопируйте в него следующий код:

        handler.sh

        Важно

        Если вы создаете файл в Windows, убедитесь, что переносы строк имеют формат Unix: \n, а не \r\n. Заменить переносы можно в текстовом редакторе, например Notepad++, или с помощью утилиты dos2unix или Tofrodos.

        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
        
      2. Создайте zip-архив function.zip с файлом handler.sh.

    Более подробную информацию о параметрах используемых ресурсов в Terraform см. в документации провайдера:

    • Сервисный аккаунт — yandex_iam_service_account.
    • Назначение прав доступа к каталогу — yandex_resourcemanager_folder_iam_member.
    • Реестр — yandex_container_registry.
    • Функция — yandex_function.
    • Триггер — yandex_function_trigger.
  4. В файле image-auto-scan.auto.tfvars задайте пользовательские параметры:

    • zone — зона доступности, в которой будет создана инфраструктура.
    • folder_id — идентификатор каталога, в котором будет создана инфраструктура.
  5. Создайте ресурсы:

    1. В терминале перейдите в папку, где вы отредактировали конфигурационный файл.

    2. Проверьте корректность конфигурационного файла с помощью команды:

      terraform validate
      

      Если конфигурация является корректной, появится сообщение:

      Success! The configuration is valid.
      
    3. Выполните команду:

      terraform plan
      

      В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.

    4. Примените изменения конфигурации:

      terraform apply
      
    5. Подтвердите изменения: введите в терминале слово yes и нажмите Enter.

Загрузите Docker-образЗагрузите Docker-образ

  1. Запустите Docker Desktop.

  2. Аутентифицируйтесь в реестре от своего имени с помощью:

    Docker Credential helper
    OAuth-токена
    IAM-токена
    1. Сконфигурируйте 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.

    2. Проверьте, что Docker сконфигурирован.

      В конфигурационном файле /home/<user>/.docker/config.json должна появиться строка:

      "cr.yandex": "yc"
      
    3. Docker готов к использованию, например, для загрузки Docker-образов. При этом выполнять команду docker login не надо.

    1. Если у вас еще нет OAuth-токена, получите его по ссылке.

    2. Выполните команду:

      echo <OAuth-токен> | docker login --username oauth --password-stdin cr.yandex
      

      Результат:

      Login Succeeded
      

    Примечание

    У IAM-токена короткое время жизни — не более 12 часов. Поэтому такой способ подойдет для приложений, которые будут запрашивать IAM-токен автоматически.

    1. Получите IAM-токен.

    2. Выполните команду:

      yc iam create-token | docker login --username iam --password-stdin cr.yandex
      

      Результат:

      Login Succeeded
      
  3. Скачайте 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
    
  4. Присвойте тег Docker-образу:

    docker tag ubuntu:20.04 cr.yandex/<идентификатор_реестра>/ubuntu:20.04
    
  5. Загрузите 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
    

Проверьте результатПроверьте результат

  1. Просмотрите логи функции scan-on-push и убедитесь, что она выполнилась.

    Консоль управления
    CLI
    1. В консоли управления выберите сервис Cloud Functions.
    2. Перейдите в раздел Функции и выберите функцию scan-on-push.
    3. В открывшемся окне перейдите в раздел Логи и укажите период. По умолчанию задан период за 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
    ...
    
  2. Проверьте, что при загрузке Docker-образа запустилось новое сканирование.

    Консоль управления
    CLI
    1. В консоли управления выберите каталог, которому принадлежит реестр, содержащий Docker-образ.
    2. Выберите сервис Container Registry.
    3. Выберите реестр, в который загрузили Docker-образ.
    4. Откройте репозиторий, в котором находится Docker-образ.
    5. Выберите нужный 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 |
    +----------------------+----------------------+---------------------+--------+--------------------------------+
    

Как удалить созданные ресурсыКак удалить созданные ресурсы

Чтобы перестать платить за созданные ресурсы:

  1. Откройте конфигурационный файл image-auto-scan.tf и удалите описание создаваемой инфраструктуры из файла.

  2. Примените изменения:

    1. В терминале перейдите в папку, где вы отредактировали конфигурационный файл.

    2. Проверьте корректность конфигурационного файла с помощью команды:

      terraform validate
      

      Если конфигурация является корректной, появится сообщение:

      Success! The configuration is valid.
      
    3. Выполните команду:

      terraform plan
      

      В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.

    4. Примените изменения конфигурации:

      terraform apply
      
    5. Подтвердите изменения: введите в терминале слово yes и нажмите Enter.

См. такжеСм. также

  • Автоматическое сканирование Docker-образа при загрузке с помощью консоли управления, CLI и API

Была ли статья полезна?

Проект Яндекса
© 2025 ООО «Яндекс.Облако»