Обзор
OpenID Connect (OIDC) позволяет рабочим процессам GitHub Actions получать доступ к ресурсам в Google Cloud Platform (GCP) без необходимости хранить учетные данные GCP в виде долгосрочных секретов GitHub.
В этом руководстве представлен обзор настройки GCP для доверия OIDC GitHub в качестве федеративного удостоверения, а также есть пример рабочего процесса для действия google-github-actions/auth, использующего токены для аутентификации в GCP и доступа к ресурсам.
Предварительные требования
-
Основные понятия о том, как GitHub использует OpenID Connect (OIDC), а также его архитектуру и преимущества, см. в разделе About security hardening with OpenID Connect.
-
Прежде чем продолжить, необходимо спланировать стратегию безопасности, чтобы обеспечить выдачу маркеров доступа только предсказуемым способом. Чтобы управлять тем, как поставщик облачных служб выдает маркеры доступа, необходимо определить по крайней мере одно условие, запретив недоверенным репозиториям запрашивать маркеры доступа к облачным ресурсам. Дополнительные сведения см. в разделе About security hardening with OpenID Connect.
Добавление поставщика удостоверений для облачной рабочей нагрузки Google
Чтобы настроить поставщик удостоверений OIDC в GCP, необходимо выполнить описанную ниже настройку. Инструкции по внесению этих изменений см. в документации GCP.
- Создайте пул удостоверений.
- Настройте сопоставление и добавьте условия.
- Подключение новый пул к учетной записи службы.
Дополнительное руководство по настройке поставщика удостоверений:
- Для усиления безопасности убедитесь, что ознакомились с разделом Настройки отношения доверия OIDC с облаком. Пример см. в разделе Настройка субъекта в поставщике облачных служб.
- Чтобы учетная запись службы была доступна для настройки, ей необходимо назначить роль
roles/iam.workloadIdentityUser. Дополнительные сведения см. в документации по GCP. - URL-адрес издателя:
https://token.actions.githubusercontent.com
Обновление рабочего процесса GitHub Actions
Чтобы обновить рабочие процессы для OIDC, необходимо внести два изменения в YAML:
- Добавьте параметры разрешений для маркера.
- Используйте действие
google-github-actions/authдля обмена маркера OIDC (JWT) на маркер доступа к облаку.
Добавление параметров разрешений
Для выполнения задания или рабочего процесса требуется параметр permissions с id-token: write. Вы не сможете запросить маркер идентификатора JWT OIDC, если permissions для параметра id-token задано read или none.
Этот параметр id-token: write позволяет запрашивать JWT у поставщика OIDC GitHub, применяя один из следующих способов:
- использование переменных среды в средстве выполнения (
ACTIONS_ID_TOKEN_REQUEST_URLиACTIONS_ID_TOKEN_REQUEST_TOKEN); - использование
getIDToken()из набора средств Actions.
Если необходимо получить токен OIDC для рабочего процесса, разрешение можно установить на уровне рабочего процесса. Пример:
permissions:
id-token: write # This is required for requesting the JWT
contents: read # This is required for actions/checkoutЕсли необходимо получить маркер OIDC только для одного задания, такое разрешение можно установить в этом задании. Пример:
permissions:
id-token: write # This is required for requesting the JWTВ зависимости от требований рабочего процесса, возможно, будет необходимо указать здесь дополнительные разрешения.
Запрос маркера доступа
Действие google-github-actions/auth получает JWT от поставщика OIDC GitHub, а затем запрашивает маркер доступа из GCP. Дополнительные сведения см. в документации по GCP.
В этом примере есть задание Get_OIDC_ID_token, которое использует действия для запроса списка служб из GCP.
<example-workload-identity-provider>— замените на путь к поставщику удостоверений в GCP. Напримерprojects/<example-project-id>/locations/global/workloadIdentityPools/<name-of-pool/providers/<name-of-provider>.<example-service-account>— замените на имя учетной записи службы в GCP.<project-id>— замените на идентификатор проекта GCP.
Это действие обменивает токен OIDC GitHub на маркер доступа Google Cloud с помощью федерации удостоверений рабочей нагрузки.
name: List services in GCP
on:
pull_request:
branches:
- main
permissions:
id-token: write
jobs:
Get_OIDC_ID_token:
runs-on: ubuntu-latest
steps:
- id: 'auth'
name: 'Authenticate to GCP'
uses: 'google-github-actions/auth@v0.3.1'
with:
create_credentials_file: 'true'
workload_identity_provider: '<example-workload-identity-provider>'
service_account: '<example-service-account>'
- id: 'gcloud'
name: 'gcloud'
run: |-
gcloud auth login --brief --cred-file="${{ steps.auth.outputs.credentials_file_path }}"
gcloud services list