Получение значения секрета Yandex Lockbox на стороне пользовательской инсталляции Kubernetes
Федерации сервисных аккаунтов (Workload Identity Federation) позволяют настроить связь между внешними системами и Yandex Cloud по протоколу OpenID Connect
В этом руководстве для примера показано, как получить значение секрета Yandex Lockbox со стороны Kubernetes от имени сервисного аккаунта в Yandex Cloud. Аналогичным образом можно выполнить любое действие через Yandex Cloud CLI, API или Terraform.
Примечание
В руководстве представлен пример интеграции пользовательской инсталляции Kubernetes с федерацией сервисных аккаунтов. Руководство по интеграции Managed Service for Kubernetes см. на странице Доступ к API Yandex Cloud из кластера Managed Service for Kubernetes с помощью федерации сервисных аккаунтов Identity and Access Management.
Чтобы получить значение секрета Yandex Lockbox от имени аккаунта в Kubernetes:
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте кластер Kubernetes
-
Создайте новый кластер Kubernetes или используйте существующий.
Убедитесь, что ваш кластер соответствует следующим требованиям:
- Вы используете Kubernetes версии 1.20 или новее.
Более ранние версии Kubernetes используют другой формат токеновServiceAccount, который не совместим с инструкциями в этом руководстве. - Вы настроили
kube-apiserverтак, чтобы он поддерживал проекцию токеновServiceAccount .
Примечание
Это руководство подходит как для публично доступных, так и для приватных кластеров Kubernetes.
- Вы используете Kubernetes версии 1.20 или новее.
-
Создайте манифест
service-account.yamlсо следующим содержимым:apiVersion: v1 kind: ServiceAccount metadata: name: wlif -
Примените манифест:
kubectl apply -f service-account.yaml -
Чтобы проверить созданный ресурс
ServiceAccountвыполните команду:kubectl describe serviceaccount wlifРезультат:
Name: wlif Namespace: defaultЗначения полей
NameиNamespaceпонадобятся для дальнейшей настройки интеграции на стороне Yandex Cloud. -
Создайте манифест
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. -
Примените манифест:
kubectl apply -f pod.yaml -
Убедитесь, что созданный под имеет статус
RUNNING:kubectl get pod test-wlifРезультат:
NAME READY STATUS RESTARTS AGE test-wlif 1/1 Running 0 1m -
Получите
URL Issuerвашего Kubernetes кластера:kubectl get --raw /.well-known/openid-configuration | jq -r .issuer -
Создайте файл с набором публичных ключей (JWKS):
kubectl get --raw /openid/v1/jwks > cluster-jwks.json
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVEилиTRIAL_ACTIVE. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входят:
- Плата за хранение секрета и запросы к нему (см. тарифы Yandex Lockbox);
- Плата за хранение данных в бакете и операции с ними (см. тарифы Object Storage).
Загрузите файл с набором публичных ключей в публичный бакет
-
Создайте публичный бакет:
Консоль управления- В консоли управления
выберите каталог, в котором хотите создать бакет. - Выберите сервис Object Storage.
- На панели сверху нажмите кнопку Создать бакет.
- На странице создания бакета:
-
Введите имя бакета в соответствии с правилами именования.
-
В поле Чтение объектов выберите
Для всех. -
Нажмите кнопку Создать бакет для завершения операции.
-
- В консоли управления
-
Загрузите созданный ранее файл
cluster-jwks.jsonв бакет:Консоль управления- Перейдите в созданный бакет.
- На панели слева выберите
Объекты. - Нажмите Загрузить объекты.
- На верхней панели нажмите
Загрузить. - В появившемся окне выберите файл
cluster-jwks.jsonи нажмите Открыть. - Нажмите Загрузить.
- Обновите страницу.
-
Получите ссылку на загруженный файл:
Консоль управления- Нажмите на имя файла.
- Нажмите Получить ссылку в правом верхнем углу.
- Скопируйте полученную ссылку.
Создайте федерацию сервисных аккаунтов
- В консоли управления
выберите каталог, в котором вы хотите создать федерацию сервисных аккаунтов. - В списке сервисов выберите Identity and Access Management.
- На панели слева выберите
Федерации сервисных аккаунтов. - Нажмите Создать федерацию.
- В поле Значение Issuer (iss) введите
URL Issuerвашего Kubernetes кластера, полученный ранее, напримерhttps://kubernetes.default.svc.cluster.local. - В поле Допустимые значения Audience (aud) введите получателя токена, указанного при создании пода, например
ycaud. - В поле Адрес JWKS введите ссылку на файл
cluster-jwks.jsonв бакете. - В поле Имя введите имя федерации, например
test-iam-federation. - Нажмите кнопку Создать.
Создайте пользовательский секрет
- В консоли управления
выберите каталог, в котором будет создан секрет. - В списке сервисов выберите Lockbox.
- Нажмите кнопку Создать секрет.
- В поле Имя введите имя секрета
MY_SECRET. - Выберите Тип секрета
Пользовательский. - В поле Ключ введите неконфиденциальный идентификатор, например
secret. - В поле Значение введите конфиденциальные данные для хранения.
- Нажмите кнопку Создать.
Создайте сервисный аккаунт
-
Создайте сервисный аккаунт:
Консоль управления- В консоли управления
выберите каталог, в котором хотите создать сервисный аккаунт. - В списке сервисов выберите Identity and Access Management.
- Нажмите кнопку Создать сервисный аккаунт.
- Введите имя сервисного аккаунта, например
sa-lockbox. - Нажмите кнопку Создать.
- В консоли управления
-
Назначьте сервисному аккаунту роль
lockbox.payloadViewerна каталог:Консоль управления- На стартовой странице
консоли управления выберите каталог. - Перейдите на вкладку Права доступа.
- Найдите аккаунт
sa-lockboxв списке и нажмите значок . - Нажмите кнопку Изменить роли.
- В открывшемся диалоге нажмите кнопку
Добавить роль и выберите рольlockbox.payloadViewer.
- На стартовой странице
Привяжите сервисный аккаунт к Федерации
-
В консоли управления
выберите каталог, в котором был создан сервисный аккаунт. -
В списке сервисов выберите Identity and Access Management.
-
В списке выберите сервисный аккаунт
sa-lockbox. -
Перейдите на вкладку Федерации сервисных аккаунтов.
-
Нажмите кнопку Привязать к федерации.
-
В поле Федерация сервисных аккаунтов выберите ранее созданную федерацию.
-
В поле Значение Subject (sub) укажите идентификатор внешнего аккаунта
system:serviceaccount:<пространство_имен>:<имя_аккаунта>.Где:
пространство_имен— значение поляNamespaceв выводе командыkubectl describe serviceaccount <имя_аккаунта>, напримерdefault;имя_аккаунта— название созданного аккаунта, напримерwlif.
-
Нажмите кнопку Привязать.
Настройте сценарий в Kubernetes
-
Заполните переменные:
SA_ID="<идентификатор_сервисного_аккаунта>" SECRET_ID="<идентификатор_секрета>"Где:
SA_ID— идентификатор сервисного аккаунта;SECRET_ID— идентификатор пользовательского секрета.
-
Получите токен сервисного аккаунта Kubernetes:
SA_TOKEN=`kubectl exec -it test-wlif -- cat /var/run/secrets/tokens/sa-token` -
Обменяйте токен сервисного аккаунта 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') -
Запросите значение секрета через 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********" }
Удалите созданные ресурсы
Некоторые ресурсы платные. Удалите ресурсы, которые вы больше не будете использовать, чтобы не платить за них: