Получение значения секрета Lockbox на стороне GitLab
Федерации сервисных аккаунтов (Workload Identity Federation) позволяют настроить связь между внешними системами и Yandex Cloud по протоколу OpenID Connect
В этом руководстве для примера показано, как получить значение секрета Yandex Lockbox со стороны GitLab от имени сервисного аккаунта в Yandex Cloud. Аналогично можно выполнить любое действие через Yandex Cloud CLI, API или Terraform
Чтобы получить значение секрета Yandex Lockbox от имени аккаунта на GitLab:
Если созданные ресурсы вам больше не нужны, удалите их.
Создайте проект GitLab
Создайте новый проект GitLab
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входит плата за хранение секрета и запросы к нему (см. тарифы Yandex Lockbox).
Создайте федерацию сервисных аккаунтов
- В консоли управления
выберите каталог, в котором вы хотите создать федерацию сервисных аккаунтов. - В списке сервисов выберите Identity and Access Management.
- Перейдите на вкладку Федерации сервисных аккаунтов.
- Нажмите Создать федерацию.
- В поле Значение Issuer (iss) введите URL OIDC-провайдера
https://gitlab.com
. - В поле Допустимые значения Audience (aud) введите получателя токена
https://gitlab.com/<название_группы>/<название_проекта_gitlab>
. - В поле Адрес JWKS введите URL списка публичных ключей
https://gitlab.com/oauth/discovery/keys
. - В поле Имя введите имя федерации, например
test-iam-federation
. - Нажмите кнопку Создать.
Примечание
Если вы используете пользовательскую инсталляцию GitLab, замените https://gitlab.com
на адрес вашей инсталляции во всех упоминаемых значениях.
Создайте пользовательский секрет
- В консоли управления
выберите каталог, в котором будет создан секрет. - В списке сервисов выберите Lockbox.
- Нажмите кнопку Создать секрет.
- В поле Имя введите имя секрета
MY_SECRET
. - Выберите Тип секрета
Пользовательский
. - В поле Ключ введите неконфиденциальный идентификатор, например
secret
. - В поле Значение введите конфиденциальные данные для хранения.
- Нажмите кнопку Создать.
Создайте сервисный аккаунт
-
Создайте сервисный аккаунт:
Консоль управления- В консоли управления
выберите каталог, в котором хотите создать сервисный аккаунт. - В списке сервисов выберите Identity and Access Management.
- Нажмите кнопку Создать сервисный аккаунт.
- Введите имя сервисного аккаунта, например
sa-lockbox
. - Нажмите кнопку Создать.
- В консоли управления
-
Назначьте сервисному аккаунту роль
lockbox.payloadViewer
на каталог:Консоль управления- На стартовой странице
консоли управления выберите каталог. - Перейдите на вкладку Права доступа.
- Найдите аккаунт
sa-lockbox
в списке и нажмите значок . - Нажмите кнопку Изменить роли.
- В открывшемся диалоге нажмите кнопку
Добавить роль и выберите рольlockbox.payloadViewer
.
- На стартовой странице
Привяжите сервисный аккаунт к федерации
- В консоли управления
выберите каталог, в котором была создан сервисный аккаунт. - В списке сервисов выберите Identity and Access Management.
- В списке выберите сервисный аккаунт
sa-lockbox
. - Перейдите на вкладку Федерации сервисных аккаунтов.
- Нажмите кнопку Привязать к федерации.
- В поле Федерация сервисных аккаунтов выберите ранее созданную федерацию.
- В поле Значение Subject (sub) укажите идентификатор внешнего аккаунта
project_path:<название_группы>/<название_проекта_gitlab>:ref_type:branch:ref:<название_ветки_репозитория>
. - Нажмите кнопку Привязать.
Настройте сценарий GitLab CI/CD
-
Склонируйте ваш репозиторий, если это еще не сделано:
git clone <URL_репозитория>
-
В локальной копии вашего репозитория создайте файл
.gitlab-ci.yml
в корневой директории. -
Вставьте в файл
.gitlab-ci.yml
следующий код, который получит значение секрета Yandex Lockbox:stages: - check_token check_token: stage: check_token image: name: ubuntu id_tokens: GITLAB_OIDC_TOKEN: aud: https://gitlab.com/<название_группы>/<название_проекта_gitlab> script: - apt update && apt install curl jq -y # Обменять токен задания рабочего процесса на IAM-токен сервисного аккаунта в Yandex Cloud - SA_ID="<идентификатор_сервисного_аккаунта>" - >- IAM_TOKEN="$(curl -s -H "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=${GITLAB_OIDC_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_ID="<идентификатор_секрета>" - >- SECRET_DATA=$(curl -sH "Authorization: Bearer ${IAM_TOKEN}" https://payload.lockbox.api.cloud.yandex.net/lockbox/v1/secrets/$SECRET_ID/payload) - echo ${SECRET_DATA} tags: - app-test
Где:
aud
— получатель токена, указанный при создании федерации сервисных аккаунтов;SA_ID
— идентификатор сервисного аккаунта;SECRET_ID
— идентификатор пользовательского секрета.
-
Сохраните файл и отправьте изменения в удаленный репозиторий:
git add . && git commit -m "Added .gitlab-ci.yml" && git push
После отправки кода в репозиторий начнется выполнение рабочего процесса.
-
В меню слева в GitLab перейдите в раздел Build → Pipelines.
-
Убедитесь, что сборка принимает статус Passed. Он означает, что сборка прошла успешно.
-
В меню слева в GitLab перейдите в раздел Build → Jobs.
-
Нажмите на последнее выполненное задание, чтобы посмотреть результат выполнения сценария в логе:
{ "entries": [ { "key": "secret", "textValue": "67cH2£?pO********" } ], "versionId": "e6q8isknpcp7********" }
Удалите созданные ресурсы
Некоторые ресурсы платные. Удалите ресурсы, которые вы больше не будете использовать, чтобы не платить за них: