Получение значения секрета Yandex Lockbox на стороне Kubernetes
Федерации сервисных аккаунтов (Workload Identity Federation) позволяют настроить связь между внешними системами и Yandex Cloud по протоколу OpenID Connect
В этом руководстве для примера показано, как получить значение секрета Yandex Lockbox со стороны Kubernetes от имени сервисного аккаунта в Yandex Cloud. Аналогичным образом можно выполнить любое действие через Yandex Cloud CLI, API или Terraform
Важно
В данный момент нельзя настроить связь между федерацией сервисных аккаунтов и кластером Yandex Managed Service for Kubernetes. Поддерживается только работа с пользовательскими инсталляциями Kubernetes.
Чтобы получить значение секрета 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********" }
Удалите созданные ресурсы
Некоторые ресурсы платные. Удалите ресурсы, которые вы больше не будете использовать, чтобы не платить за них: