Yandex Cloud
Поиск
Связаться с намиПодключиться
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Контейнеры
    • Инструменты разработчика
    • Бессерверные вычисления
    • Безопасность
    • Мониторинг и управление ресурсами
    • Машинное обучение
    • Бизнес-инструменты
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Истории успеха
    • Тарифы Yandex Cloud
    • Промоакции и free tier
    • Правила тарификации
  • Документация
  • Блог
Проект Яндекса
© 2025 ООО «Яндекс.Облако»
Yandex Key Management Service
  • Начало работы
    • Все руководства
    • Шифрование секретов в Managed Service for Kubernetes
    • Подпись и проверка Docker-образов в Managed Service for Kubernetes
    • Управление ключами KMS с HashiCorp Terraform
    • Шифрование секретов в HashiCorp Terraform
    • Auto Unseal в HashiCorp Vault
    • Безопасная передача пароля в скрипт инициализации
    • Шифрование для бакета Object Storage на стороне сервера
  • Управление доступом
  • Правила тарификации
  • Справочник Terraform
  • Метрики Monitoring
  • Аудитные логи Audit Trails
  • Вопросы и ответы
  • Обучающие курсы

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

  • Необходимые платные ресурсы
  • Перед началом работы
  • Подготовьте инфраструктуру
  • Подготовьтесь к работе с кластером Managed Service for Kubernetes
  • Добавьте несколько Docker-образов в реестр Container Registry
  • Подпишите Docker-образ с помощью утилиты Cosign
  • Создайте политику для проверки подписей
  • Проверьте результат
  • Удалите созданные ресурсы
  1. Практические руководства
  2. Подпись и проверка Docker-образов в Managed Service for Kubernetes

Подпись и проверка Docker-образов Yandex Container Registry в Yandex Managed Service for Kubernetes

Статья создана
Yandex Cloud
Обновлена 26 марта 2025 г.
  • Необходимые платные ресурсы
  • Перед началом работы
    • Подготовьте инфраструктуру
    • Подготовьтесь к работе с кластером Managed Service for Kubernetes
    • Добавьте несколько Docker-образов в реестр Container Registry
  • Подпишите Docker-образ с помощью утилиты Cosign
  • Создайте политику для проверки подписей
  • Проверьте результат
  • Удалите созданные ресурсы

В этом сценарии описано, как подписать Docker-образы с помощью Cosign в Yandex Container Registry, а затем настроить проверку подписей в Yandex Managed Service for Kubernetes с помощью ключей Yandex Key Management Service.

Чтобы подписать и настроить проверку Docker-образов:

  1. Подпишите Docker-образ с помощью Cosign.
  2. Создайте политику для проверки подписей.
  3. Проверьте результат.

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

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

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

  • Плата за кластер Managed Service for Kubernetes: использование мастера и исходящий трафик (см. тарифы Managed Service for Kubernetes).
  • Плата за узлы кластера (ВМ): использование вычислительных ресурсов, операционной системы и хранилища (см. тарифы Compute Cloud).
  • Плата за публичные IP-адреса, если они назначены узлам кластера (см. тарифы Virtual Private Cloud).
  • Плата за использование хранилища Container Registry.

Перед началом работыПеред началом работы

Подготовьте инфраструктуруПодготовьте инфраструктуру

Вручную
Terraform
  1. Создайте сервисные аккаунты:

    • Сервисный аккаунт для ресурсов с ролями k8s.clusters.agent и vpc.publicAdmin на каталог, в котором создается кластер Managed Service for Kubernetes. От его имени будут создаваться ресурсы, необходимые кластеру Managed Service for Kubernetes.
    • Сервисный аккаунт для узлов с ролью container-registry.images.puller на каталог с реестром Docker-образов. От его имени узлы будут скачивать из реестра необходимые Docker-образы.

    Вы можете использовать один и тот же сервисный аккаунт для обеих операций.

  2. Создайте группы безопасности для кластера Managed Service for Kubernetes и входящих в него групп узлов.

    Важно

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

  3. Создайте кластер Managed Service for Kubernetes и группу узлов. При создании кластера укажите ранее созданные сервисные аккаунты для ресурсов и узлов и группы безопасности.

  4. Создайте реестр Container Registry.

  1. Если у вас еще нет Terraform, установите его.

  2. Получите данные для аутентификации. Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.

  3. Настройте и инициализируйте провайдер. Чтобы не создавать конфигурационный файл с настройками провайдера вручную, скачайте его.

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

  5. Скачайте в ту же рабочую директорию файл конфигурации k8s-validate-cr-image.tf.

    В этом файле описаны:

    • Сеть.

    • Подсеть.

    • Реестр Container Registry.

    • Кластер Managed Service for Kubernetes.

    • Сервисный аккаунт, необходимый для работы кластера и группы узлов Managed Service for Kubernetes.

    • Группы безопасности, которые содержат необходимые правила для кластера Managed Service for Kubernetes и входящих в него групп узлов.

      Важно

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

  6. Укажите в файле k8s-validate-cr-image.tf:

    • Идентификатор каталога.
    • Версию Kubernetes для кластера и групп узлов Managed Service for Kubernetes.
    • CIDR кластера Managed Service for Kubernetes.
    • Имя сервисного аккаунта кластера.
    • Имя реестра Container Registry.
  7. Проверьте корректность файлов конфигурации Terraform с помощью команды:

    terraform validate
    

    Если в файлах конфигурации есть ошибки, Terraform на них укажет.

  8. Создайте необходимую инфраструктуру:

    1. Выполните команду для просмотра планируемых изменений:

      terraform plan
      

      Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.

    2. Если вас устраивают планируемые изменения, внесите их:

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

        terraform apply
        
      2. Подтвердите изменение ресурсов.

      3. Дождитесь завершения операции.

    В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления.

Подготовьтесь к работе с кластером Managed Service for KubernetesПодготовьтесь к работе с кластером Managed Service for Kubernetes

  1. Установите kubectl и настройте его на работу с созданным кластером.

  2. Установите менеджер пакетов Kubernetes Helm.

Добавьте несколько Docker-образов в реестр Container RegistryДобавьте несколько Docker-образов в реестр Container Registry

  1. Настройте Docker и аутентифицируйтесь в Container Registry.
  2. Создайте несколько Docker-образов. Один из образов в дальнейшем будет подписан с помощью Cosign, остальные образы будут неподписанными.
  3. Загрузите Docker-образы в реестр Container Registry.

Подпишите Docker-образ с помощью утилиты CosignПодпишите Docker-образ с помощью утилиты Cosign

Подпись образа на асимметричных ключах Key Management Service
Подпись образа на локальных ключах
  1. Установите специальную сборку Cosign для вашей операционной системы:

    • Linux amd64
    • MacOS Darwin amd64
    • MacOS Darwin arm64
    • Windows
  2. Получите IAM-токен и сохраните его в переменную среды $YC_IAM_TOKEN:

    • Bash:

      export YC_IAM_TOKEN=$(yc iam create-token)
      
    • PowerShell:

      $env:YC_IAM_TOKEN = $(yc iam create-token)
      
  3. Авторизуйтесь в Container Registry:

    • Bash:

      docker login \
        --username iam \
        --password $YC_IAM_TOKEN \
        cr.yandex
      
    • PowerShell:

      docker login `
        --username iam `
        --password $Env:YC_IAM_TOKEN `
        cr.yandex
      

    Результат:

    WARNING! Using --password via the CLI is insecure. Use --password-stdin.
    Login Succeeded
    

    Примечание

    Чтобы не использовать Credential helper при аутентификации, удалите в конфигурационном файле ${HOME}/.docker/config.json из блока credHelpers строку домена cr.yandex.

  4. Создайте и сохраните в Key Management Service ключевую пару электронной подписи:

    cosign generate-key-pair \
      --kms yckms:///folder/<идентификатор_каталога>/keyname/<имя_ключевой_пары>
    

    Где:

    • <идентификатор_каталога> — идентификатор каталога, в котором будет сохранена создаваемая ключевая пара.
    • <имя_ключевой_пары> — имя создаваемой ключевой пары подписи.

    Результат:

    client.go:183: Using IAM Token from 'YC_IAM_TOKEN' environment variable as credentials
    client.go:310: generated yckms KEY_ID: '<идентификатор_ключевой_пары>'
    Public key written to cosign.pub
    

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

    Идентификатор ключевой пары подписи всегда можно получить в консоли управления или с помощью команды CLI.

  5. Подпишите образ в Container Registry:

    cosign sign \
      --key yckms:///<идентификатор_ключевой_пары> \
      cr.yandex/<идентификатор_реестра>/<имя_Docker-образа>:<тег> \
      --tlog-upload=false
    

    Где:

    • <идентификатор_ключевой_пары> — идентификатор ключевой пары подписи, полученный на предыдущем шаге.
    • <идентификатор_реестра> — идентификатор реестра Container Registry, в котором находится подписываемый образ.
    • <имя_Docker-образа> — имя подписываемого Docker-образа в реестре Container Registry.
    • <тег> — тег версии образа, которую требуется подписать.

    Результат:

    Pushing signature to: cr.yandex/<идентификатор_реестра>/<имя_Docker-образа>
    

    В реестре Container Registry должен появиться второй объект с тегом sha256-....sig и хэшем cr.yandex/<идентификатор_реестра>/<имя_Docker-образа>@sha256:....

  6. Вручную проверьте, что подпись Docker-образа корректна:

    cosign verify \
      --key yckms:///<идентификатор_ключевой_пары> \
      cr.yandex/<идентификатор_реестра>/<имя_Docker-образа>:<тег> \
      --insecure-ignore-tlog
    

    Где:

    • <идентификатор_ключевой_пары> — полученный ранее идентификатор ключевой пары подписи.
    • <идентификатор_реестра> — идентификатор реестра Container Registry, в котором находится образ.
    • <имя_Docker-образа> — имя Docker-образа в реестре Container Registry.
    • <тег> — тег версии образа, для которой требуется проверить подпись.

    Результат:

    Verification for cr.yandex/<идентификатор_реестра>/<имя_Docker-образа>:<тег> --
    The following checks were performed on each of these signatures:
    - The cosign claims were validated
    - The signatures were verified against the specified public key
    
    [{"critical":{"identity":{"docker-reference":"cr.yandex/<идентификатор_реестра>/<имя_Docker-образа>"},"image":{"docker-manifest-digest":"sha256:..."},"type":"cosign container image signature"},"optional":null}]
    
  1. Установите Cosign.

  2. Создайте пару ключей с помощью Cosign:

    cosign generate-key-pair
    

    Задайте и дважды введите пароль для закрытого ключа.

    Результат:

    Enter password for private key:
    Enter password for private key again:
    Private key written to cosign.key
    Public key written to cosign.pub
    
  3. Подпишите Docker-образ в реестре Container Registry:

    cosign sign \
        --key cosign.key \
        cr.yandex/<идентификатор_реестра>/<имя_Docker-образа>:<тег>
    

    Подписанный образ будет использоваться при проверке результата.

    Укажите пароль закрытого ключа. Результат:

    Enter password for private key:
    Pushing signature to: cr.yandex/<идентификатор_реестра>/<имя_Docker-образа>
    

    В реестре Container Registry должен появиться второй объект с тегом sha256-....sig и хэшем cr.yandex/<идентификатор_реестра>/<имя_Docker-образа>@sha256:....

  4. Вручную проверьте, что подпись Docker-образа корректна:

    cosign verify \
      --key cosign.pub \
      cr.yandex/<идентификатор_реестра>/<имя_Docker-образа>:<тег>
    

    Результат:

    Verification for cr.yandex/<идентификатор_реестра>/<имя_Docker-образа>:<тег> --
    The following checks were performed on each of these signatures:
    - The cosign claims were validated
    - The signatures were verified against the specified public key
    
    [{"critical":{"identity":{"docker-reference":"cr.yandex/<идентификатор_реестра>/<имя_Docker-образа>"},"image":{"docker-manifest-digest":"sha256:..."},"type":"cosign container image signature"},"optional":null}]
    

Создайте политику для проверки подписейСоздайте политику для проверки подписей

  1. Создайте авторизованный ключ для сервисного аккаунта с ролью container-registry.images.puller и запишите его в файл:

    yc iam key create \
      --service-account-name=<имя_сервисного_аккаунта> \
      --output authorized-key.json
    

    Где --service-account-name — имя сервисного аккаунта с ролью container-registry.images.puller.

  2. Установите приложение Kyverno в кластер Managed Service for Kubernetes. Оно необходимо для создания политики, которой проверяются подписи Docker-образов.

    1. Добавьте репозиторий kyverno:

      helm repo add kyverno https://kyverno.github.io/kyverno/
      

      Результат:

      "kyverno" has been added to your repositories
      
    2. Установите приложение Kyverno в пространство имен kyverno:

      helm install kyverno kyverno/kyverno \
        --namespace kyverno \
        --create-namespace \
        --set replicaCount=1 \
        --set imagePullSecrets.regcred.registry=cr.yandex \
        --set imagePullSecrets.regcred.username=json_key \
        --set-file imagePullSecrets.regcred.password=./authorized-key.json
      

      Результат:

      NAME: kyverno
      LAST DEPLOYED: Thu Sep 8 10:43:00 2022
      NAMESPACE: kyverno
      STATUS: deployed
      ...
      
  3. Создайте политику:

    1. Сохраните спецификацию для создания объекта ClusterPolicy в YAML-файл с названием policy.yaml:

      apiVersion: kyverno.io/v1
      kind: ClusterPolicy
      metadata:
        name: check-image
      spec:
        validationFailureAction: enforce
        background: false
        webhookTimeoutSeconds: 30
        failurePolicy: Fail
        rules:
          - name: check-image
            match:
              any:
              - resources:
                  kinds:
                    - Pod
            verifyImages:
            - imageReferences:
              - "cr.yandex/<идентификатор_реестра>/*"
              attestors:
              - count: 1
                entries:
                - keys:
                    publicKeys: |-
                      <содержимое_cosign.pub>
      
      Пример заполненного файла policy.yaml.
      apiVersion: kyverno.io/v1
      kind: ClusterPolicy
      metadata:
        name: check-image
      spec:
        validationFailureAction: enforce
        background: false
        webhookTimeoutSeconds: 30
        failurePolicy: Fail
        rules:
          - name: check-image
            match:
              any:
              - resources:
                  kinds:
                    - Pod
            verifyImages:
            - imageReferences:
              - "cr.yandex/crpd2f2bnrlb********/*"
              attestors:
              - count: 1
                entries:
                - keys:
                    publicKeys: |-
                      -----BEGIN PUBLIC KEY-----
                      MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE1jTu/9rJZZvUFi4bGhlvgMQdIY97
                      7NuGl2zzpV7olAyIu/WiywxI7Fny5tk6JmNPIFvSAtys3c08gfEc********
                      -----END PUBLIC KEY-----
      

      Примечание

      По умолчанию при создании политики выполняется запрос проверки подписи в хранилище неизменяемых записей Transparency Log. Вы можете отключить его — для этого добавьте в элемент keys спецификации политики параметр rekor: ignoreTlog: true. Подробнее см. в документации Kyverno.

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

      kubectl apply -f ./policy.yaml
      

      Результат:

      clusterpolicy.kyverno.io/check-image configured
      
  4. (Опционально) Установите Policy Reporter в кластер Managed Service for Kubernetes, чтобы получить возможность сохранять и обрабатывать результаты срабатывания политики.

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

  • Создайте под из подписанного Docker-образа:

    kubectl run pod --image=cr.yandex/<идентификатор_реестра>/<имя_Docker-образа>:<тег>
    

    Результат:

    pod/pod created
    
  • Создайте под из неподписанного Docker-образа:

    kubectl run pod2 --image=cr.yandex/<идентификатор_реестра>/<имя_неподписанного_Docker-образа>:<тег>
    

    Результат:

    Error from server: admission webhook "mutate.kyverno.svc-fail" denied the request:
    
    resource Pod/default/pod2 was blocked due to the following policies
    
    check-image:
      check-image: 
        failed to verify signature for cr.yandex/crpsere9njsa********/alpine:2.0: .attestors[0].entries[0].keys: no matching signatures:
    

Удалите созданные ресурсыУдалите созданные ресурсы

Некоторые ресурсы платные. Чтобы за них не списывалась плата, удалите ресурсы, которые вы больше не будете использовать:

Вручную
Terraform
  1. Удалите кластер Managed Service for Kubernetes.
  2. Если вы зарезервировали для кластера публичный статический IP-адрес, удалите его.
  3. Удалите сервисные аккаунты.
  4. Удалите все Docker-образы из реестра Container Registry.
  5. Удалите реестр Container Registry.
  1. В терминале перейдите в директорию с планом инфраструктуры.

    Важно

    Убедитесь, что в директории нет Terraform-манифестов с ресурсами, которые вы хотите сохранить. Terraform удаляет все ресурсы, которые были созданы с помощью манифестов в текущей директории.

  2. Удалите ресурсы:

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

      terraform destroy
      
    2. Подтвердите удаление ресурсов и дождитесь завершения операции.

    Все ресурсы, которые были описаны в Terraform-манифестах, будут удалены.

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

Предыдущая
Шифрование секретов в Managed Service for Kubernetes
Следующая
Управление ключами KMS с HashiCorp Terraform
Проект Яндекса
© 2025 ООО «Яндекс.Облако»