Yandex Cloud
Поиск
Связаться с намиПодключиться
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Контейнеры
    • Инструменты разработчика
    • Бессерверные вычисления
    • Безопасность
    • Мониторинг и управление ресурсами
    • Машинное обучение
    • Бизнес-инструменты
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Истории успеха
    • Тарифы Yandex Cloud
    • Промоакции и free tier
    • Правила тарификации
  • Документация
  • Блог
Проект Яндекса
© 2025 ООО «Яндекс.Облако»
Практические руководства
    • Все руководства
    • Разграничение прав доступа для групп пользователей
    • Создание L7-балансировщика с профилем безопасности Smart Web Security через Ingress-контроллер Application Load Balancer
    • Централизованная публикация в интернете и защита приложений от DDoS
    • Передача логов с виртуальной машины в Cloud Logging
    • Запись логов балансировщика в PostgreSQL
    • Безопасное хранение паролей для GitLab CI в виде секретов Yandex Lockbox
    • Сервисный аккаунт с профилем OS Login для управления ВМ с помощью Ansible
    • Передача логов с Container Optimized Image в Cloud Logging
    • Добавление HTML-страницы для работы SmartCaptcha
    • Создание L7-балансировщика с профилем безопасности
    • Настройка алертов в Monitoring
    • Загрузка аудитных логов в MaxPatrol SIEM
    • Загрузка аудитных логов в SIEM Splunk
    • Загрузка аудитных логов в SIEM ArcSight
    • Шифрование для бакета Object Storage на стороне сервера
    • Шифрование секретов в HashiCorp Terraform
    • Управление ключами KMS с HashiCorp Terraform
    • Auto Unseal в HashiCorp Vault
      • GitHub
      • GitLab
      • Kubernetes
    • Передача логов кластера Managed Service for Greenplum® в Yandex Cloud Logging

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

  • Подготовьте кластер Kubernetes
  • Подготовьте облако к работе
  • Необходимые платные ресурсы
  • Загрузите файл с набором публичных ключей в публичный бакет
  • Создайте федерацию сервисных аккаунтов
  • Создайте пользовательский секрет
  • Создайте сервисный аккаунт
  • Привяжите сервисный аккаунт к Федерации
  • Настройте сценарий в Kubernetes
  • Удалите созданные ресурсы
  • Смотрите также
  1. Безопасность
  2. Интеграции федераций удостоверений сервисных аккаунтов
  3. Kubernetes

Получение значения секрета Yandex Lockbox на стороне Kubernetes

Статья создана
Yandex Cloud
Обновлена 6 марта 2025 г.
  • Подготовьте кластер Kubernetes
  • Подготовьте облако к работе
    • Необходимые платные ресурсы
    • Загрузите файл с набором публичных ключей в публичный бакет
    • Создайте федерацию сервисных аккаунтов
    • Создайте пользовательский секрет
    • Создайте сервисный аккаунт
    • Привяжите сервисный аккаунт к Федерации
  • Настройте сценарий в Kubernetes
  • Удалите созданные ресурсы
  • Смотрите также

Федерации сервисных аккаунтов (Workload Identity Federation) позволяют настроить связь между внешними системами и Yandex Cloud по протоколу OpenID Connect (OIDC). За счет этого внешние системы могут выполнять действия с ресурсами Yandex Cloud от имени сервисных аккаунтов без использования авторизованных ключей. Это более безопасный способ, минимизирующий риск утечки учетных данных и возможность несанкционированного доступа.

В этом руководстве для примера показано, как получить значение секрета Yandex Lockbox со стороны Kubernetes от имени сервисного аккаунта в Yandex Cloud. Аналогичным образом можно выполнить любое действие через Yandex Cloud CLI, API или Terraform.

Важно

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

Чтобы получить значение секрета Yandex Lockbox от имени аккаунта в Kubernetes:

  1. Подготовьте кластер Kubernetes.
  2. Подготовьте облако к работе.
  3. Настройте сценарий в Kubernetes.

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

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

  1. Создайте новый кластер Kubernetes или используйте существующий.

    Убедитесь, что ваш кластер соответствует следующим требованиям:

    • Вы используете Kubernetes версии 1.20 или новее.
      Более ранние версии Kubernetes используют другой формат токенов ServiceAccount, который не совместим с инструкциями в этом руководстве.
    • Вы настроили kube-apiserver так, чтобы он поддерживал проекцию токенов ServiceAccount.

    Примечание

    Это руководство подходит как для публично доступных, так и для приватных кластеров Kubernetes.

  2. Создайте манифест service-account.yaml со следующим содержимым:

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: wlif
    
  3. Примените манифест:

    kubectl apply -f service-account.yaml
    
  4. Чтобы проверить созданный ресурс ServiceAccount выполните команду:

    kubectl describe serviceaccount wlif
    

    Результат:

    Name:                wlif
    Namespace:           default
    

    Значения полей Name и Namespace понадобятся для дальнейшей настройки интеграции на стороне Yandex Cloud.

  5. Создайте манифест pod.yaml со следующим содержимым:

    apiVersion: v1
    kind: Pod
    metadata:
      name: test-wlif
    spec:
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - mountPath: /var/run/secrets/tokens
          name: sa-token
      serviceAccountName: wlif
      volumes:
      - name: sa-token
        projected:
          sources:
          - serviceAccountToken:
              path: sa-token
              expirationSeconds: 7200
              audience: ycaud
    

    В поле audience укажите получателя токена, например ycaud.

  6. Примените манифест:

    kubectl apply -f pod.yaml
    
  7. Убедитесь, что созданный под имеет статус RUNNING:

    kubectl get pod test-wlif
    

    Результат:

    NAME        READY   STATUS    RESTARTS   AGE
    test-wlif   1/1     Running   0          1m
    
  8. Получите URL Issuer вашего Kubernetes кластера:

    kubectl get --raw /.well-known/openid-configuration | jq -r .issuer
    
  9. Создайте файл с набором публичных ключей (JWKS):

    kubectl get --raw /openid/v1/jwks > cluster-jwks.json
    

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

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

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

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

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

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

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

  1. Плата за хранение секрета и запросы к нему (см. тарифы Yandex Lockbox);
  2. Плата за хранение данных в бакете и операции с ними (см. тарифы Object Storage).

Загрузите файл с набором публичных ключей в публичный бакетЗагрузите файл с набором публичных ключей в публичный бакет

  1. Создайте публичный бакет:

    Консоль управления
    1. В консоли управления выберите каталог, в котором хотите создать бакет.
    2. Выберите сервис Object Storage.
    3. На панели сверху нажмите кнопку Создать бакет.
    4. На странице создания бакета:
      1. Введите имя бакета в соответствии с правилами именования.

      2. В поле Доступ на чтение объектов выберите Публичный.

      3. Нажмите кнопку Создать бакет для завершения операции.

  2. Загрузите созданный ранее файл cluster-jwks.json в бакет:

    Консоль управления
    1. Перейдите в созданный бакет.
    2. На панели слева выберите Объекты.
    3. Нажмите Загрузить объекты.
    4. На верхней панели нажмите Загрузить.
    5. В появившемся окне выберите файл cluster-jwks.json и нажмите Открыть.
    6. Нажмите Загрузить.
    7. Обновите страницу.
  3. Получите ссылку на загруженный файл:

    Консоль управления
    1. Нажмите на имя файла.
    2. Нажмите Получить ссылку в правом верхнем углу.
    3. Скопируйте полученную ссылку.

Создайте федерацию сервисных аккаунтовСоздайте федерацию сервисных аккаунтов

Консоль управления
  1. В консоли управления выберите каталог, в котором вы хотите создать федерацию сервисных аккаунтов.
  2. В списке сервисов выберите Identity and Access Management.
  3. На панели слева выберите Федерации сервисных аккаунтов.
  4. Нажмите Создать федерацию.
  5. В поле Значение Issuer (iss) введите URL Issuer вашего Kubernetes кластера, полученный ранее, например https://kubernetes.default.svc.cluster.local.
  6. В поле Допустимые значения Audience (aud) введите получателя токена, указанного при создании пода, например ycaud.
  7. В поле Адрес JWKS введите ссылку на файл cluster-jwks.json в бакете.
  8. В поле Имя введите имя федерации, например test-iam-federation.
  9. Нажмите кнопку Создать.

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

Консоль управления
  1. В консоли управления выберите каталог, в котором будет создан секрет.
  2. В списке сервисов выберите Lockbox.
  3. Нажмите кнопку Создать секрет.
  4. В поле Имя введите имя секрета MY_SECRET.
  5. Выберите Тип секрета Пользовательский.
  6. В поле Ключ введите неконфиденциальный идентификатор, например secret.
  7. В поле Значение введите конфиденциальные данные для хранения.
  8. Нажмите кнопку Создать.

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

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

    Консоль управления
    1. В консоли управления выберите каталог, в котором хотите создать сервисный аккаунт.
    2. В списке сервисов выберите Identity and Access Management.
    3. Нажмите кнопку Создать сервисный аккаунт.
    4. Введите имя сервисного аккаунта, например sa-lockbox.
    5. Нажмите кнопку Создать.
  2. Назначьте сервисному аккаунту роль lockbox.payloadViewer на каталог:

    Консоль управления
    1. На стартовой странице консоли управления выберите каталог.
    2. Перейдите на вкладку Права доступа.
    3. Найдите аккаунт sa-lockbox в списке и нажмите значок .
    4. Нажмите кнопку Изменить роли.
    5. В открывшемся диалоге нажмите кнопку Добавить роль и выберите роль lockbox.payloadViewer.

Привяжите сервисный аккаунт к ФедерацииПривяжите сервисный аккаунт к Федерации

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

  2. В списке сервисов выберите Identity and Access Management.

  3. В списке выберите сервисный аккаунт sa-lockbox.

  4. Перейдите на вкладку Федерации сервисных аккаунтов.

  5. Нажмите кнопку Привязать к федерации.

  6. В поле Федерация сервисных аккаунтов выберите ранее созданную федерацию.

  7. В поле Значение Subject (sub) укажите идентификатор внешнего аккаунта system:serviceaccount:<пространство_имен>:<имя_аккаунта>.

    Где:

    • пространство_имен — значение поля Namespace в выводе команды kubectl describe serviceaccount <имя_аккаунта>, например default;
    • имя_аккаунта — название созданного аккаунта, например wlif.
  8. Нажмите кнопку Привязать.

Настройте сценарий в KubernetesНастройте сценарий в Kubernetes

  1. Заполните переменные:

    SA_ID="<идентификатор_сервисного_аккаунта>"
    SECRET_ID="<идентификатор_секрета>"
    

    Где:

    • SA_ID — идентификатор сервисного аккаунта;
    • SECRET_ID — идентификатор пользовательского секрета.
  2. Получите токен сервисного аккаунта Kubernetes:

    SA_TOKEN=`kubectl exec -it test-wlif -- cat /var/run/secrets/tokens/sa-token`
    
  3. Обменяйте токен сервисного аккаунта Kubernetes на IAM-токен сервисного аккаунта в Yandex Cloud:

    IAMTOKEN=$(curl -sH "Content-Type: application/x-www-form-urlencoded" -d "grant_type=urn:ietf:params:oauth:grant-type:token-exchange&requested_token_type=urn:ietf:params:oauth:token-type:access_token&audience=$SA_ID&subject_token=$SA_TOKEN&subject_token_type=urn:ietf:params:oauth:token-type:id_token" -X POST https://auth.yandex.cloud/oauth/token | jq -r '.access_token')
    
  4. Запросите значение секрета через API, используя IAM-токен в Yandex Cloud:

    SECRET_DATA=$(curl -sH "Authorization: Bearer ${IAMTOKEN}" https://payload.lockbox.api.cloud.yandex.net/lockbox/v1/secrets/$SECRET_ID/payload)
    echo ${SECRET_DATA}
    

    Результат:

    { "entries": [ { "key": "secret", "textValue": "67cH2£?pO********" } ], "versionId": "e6q8isknpcp7********" }
    

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

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

  • секрет Yandex Lockbox;
  • бакет Object Storage;
  • сервисный аккаунт.

Смотрите такжеСмотрите также

  • Получение значения секрета Yandex Lockbox на стороне GitLab;
  • Получение значения секрета Yandex Lockbox на стороне GitHub.

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

Предыдущая
GitLab
Следующая
Передача логов кластера Managed Service for Greenplum® в Yandex Cloud Logging
Проект Яндекса
© 2025 ООО «Яндекс.Облако»