Получение значения секрета Lockbox на стороне GitHub
Федерации сервисных аккаунтов (Workload Identity Federation) позволяют настроить связь между внешними системами и Yandex Cloud по протоколу OpenID Connect
В этом руководстве для примера показано, как получить значение секрета Yandex Lockbox со стороны GitHub от имени сервисного аккаунта в Yandex Cloud. Аналогично можно выполнить любое действие через Yandex Cloud CLI, API или Terraform
Чтобы получить значение секрета Yandex Lockbox от имени аккаунта на GitHub:
Если созданные ресурсы вам больше не нужны, удалите их.
Создайте репозиторий в GitHub
Создайте
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входит плата за хранение секрета и запросы к нему (см. тарифы Yandex Lockbox).
Создайте федерацию сервисных аккаунтов
- В консоли управления
выберите каталог, в котором вы хотите создать федерацию сервисных аккаунтов. - В списке сервисов выберите Identity and Access Management.
- Перейдите на вкладку Федерации сервисных аккаунтов.
- Нажмите Создать федерацию.
- В поле Значение Issuer (iss) введите URL OIDC-провайдера
https://token.actions.githubusercontent.com
. - В поле Допустимые значения Audience (aud) введите получателя токена
https://github.com/<имя_пользователя_github>
. - В поле Адрес JWKS введите URL списка публичных ключей
https://token.actions.githubusercontent.com/.well-known/jwks
. - В поле Имя введите имя федерации, например
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) укажите идентификатор внешнего аккаунта
repo:<имя_пользователя_github>/<название_репозитория_github>:ref:refs/heads/main
. - Нажмите кнопку Привязать.
Настройте сценарий GitHub Actions
-
Склонируйте ваш репозиторий, если это еще не сделано:
git clone <URL_репозитория>
-
В локальной копии вашего репозитория создайте файл
blank.yml
в директории.github/workflows
. -
Вставьте в файл
blank.yml
следующий код, который получит значение секрета Yandex Lockbox:name: CI permissions: id-token: write # Требуется для запроса JWT-токена # Controls when the workflow will run on: # Запускает выполнение сценария при пуш или пул-реквесте в ветке "main" push: branches: [ "main" ] pull_request: branches: [ "main" ] # Позволяет запустить сценарий вручную во вкладке Actions workflow_dispatch: jobs: job: runs-on: ubuntu-latest steps: - name: Install OIDC Client from Core Package run: npm install @actions/core @actions/http-client # Получить токен задания рабочего процесса - name: Get Id Token uses: actions/github-script@v7 id: tokenid with: script: | const coredemo = require('@actions/core') let id_token = await coredemo.getIDToken() coredemo.setOutput('id_token', id_token) # Обменять токен задания рабочего процесса на IAM-токен сервисного аккаунта в Yandex Cloud - name: GetIAMToken run: | SA_ID="<идентификатор_сервисного_аккаунта>" 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=${{steps.tokenid.outputs.id_token}}&subject_token_type=urn:ietf:params:oauth:token-type:id_token" -X POST https://auth.yandex.cloud/oauth/token | jq -r '.access_token') echo "IAMToken=${IAMTOKEN}" >> $GITHUB_OUTPUT id: IAMtoken # Запросить значение секрета через API, используя IAM-токен в Yandex Cloud - name: GetLockboxPayload run: | SECRET_ID="<идентификатор_секрета>" SECRET_DATA=$(curl -sH "Authorization: Bearer ${{steps.IAMtoken.outputs.IAMTOKEN}}" https://payload.lockbox.api.cloud.yandex.net/lockbox/v1/secrets/$SECRET_ID/payload) echo "SECRET_DATA=${SECRET_DATA}" >> $GITHUB_OUTPUT id: getlockboxpayload
Где:
SA_ID
— идентификатор сервисного аккаунта;SECRET_ID
— идентификатор пользовательского секрета.
-
Сохраните файл и отправьте изменения в удаленный репозиторий:
git add . && git commit -m "Added blank.yml" && git push
После отправки кода в репозиторий начнется выполнение рабочего процесса. Результат выполнения сценария можно посмотреть в логе на вкладке
Actions
вашего репозитория:{ "entries": [ { "key": "secret", "textValue": "67cH2£?pO********" } ], "versionId": "e6q8isknpcp7********" }
Удалите созданные ресурсы
Некоторые ресурсы платные. Удалите ресурсы, которые вы больше не будете использовать, чтобы не платить за них: