Skip to main content

Настройка OpenID Connect в Google Cloud Platform

Использование OpenID Connect в рабочих процессах для проверки подлинности на платформе Google Cloud Platform.

Обзор

OpenID Connect (OIDC) позволяет рабочим процессам GitHub Actions получать доступ к ресурсам в Google Cloud Platform (GCP) без необходимости хранить учетные данные GCP в виде долгосрочных секретов GitHub.

В этом руководстве представлен обзор настройки GCP для доверия OIDC GitHub в качестве федеративного удостоверения, а также есть пример рабочего процесса для действия google-github-actions/auth, использующего токены для аутентификации в GCP и доступа к ресурсам.

Необходимые компоненты

  • Основные понятия о том, как GitHub использует OpenID Connect (OIDC) и его архитектуру и преимущества, см. в разделе "Сведения об усилении защиты с помощью OpenID Connect".

  • Прежде чем продолжить, необходимо спланировать стратегию безопасности, чтобы обеспечить выдачу маркеров доступа только предсказуемым способом. Чтобы управлять тем, как поставщик облачных служб выдает маркеры доступа, необходимо определить по крайней мере одно условие, запретив недоверенным репозиториям запрашивать маркеры доступа к облачным ресурсам. Дополнительные сведения см. в разделе Сведения об усилении защиты с помощью OpenID Connect.

  • Если вы используете это руководство по GHE.com, понять, что необходимо заменить определенные значения в следующей документации. См. раздел "Сведения об усилении защиты с помощью OpenID Connect".

Добавление поставщика удостоверений для облачной рабочей нагрузки Google

Чтобы настроить поставщик удостоверений OIDC в GCP, необходимо выполнить описанную ниже настройку. Инструкции по внесению этих изменений см. в документации GCP.

  1. Создайте пул удостоверений.
  2. Настройте сопоставление и добавьте условия.
  3. Подключение новый пул к учетной записи службы.

Дополнительное руководство по настройке поставщика удостоверений:

Обновление рабочего процесса GitHub Actions

Чтобы обновить рабочие процессы для OIDC, необходимо внести два изменения в YAML:

  1. Добавьте параметры разрешений для маркера.
  2. Используйте действие google-github-actions/auth для обмена маркера OIDC (JWT) на маркер доступа к облаку.

Примечание. Если среды используются в рабочих процессах или политиках OIDC, рекомендуется добавить правила защиты в среду для дополнительной безопасности. Например, можно настроить правила развертывания в среде, чтобы ограничить, какие ветви и теги могут развертываться в среде или получить доступ к секретам среды. Дополнительные сведения см. в разделе Управление средами для развертывания.

Добавление параметров разрешений

Для выполнения задания или рабочего процесса требуется permissions параметр, позволяющий id-token: write GitHubпоставщика OIDC для создания веб-маркера JSON для каждого запуска. Вы не сможете запросить маркер идентификатора JWT OIDC, если permissions оно id-token не задано write, однако это значение не подразумевает предоставление доступа на запись к любым ресурсам, только возможность получить и задать маркер OIDC для действия или шага, чтобы включить проверку подлинности с помощью маркера доступа с коротким сроком действия. Любой фактический параметр доверия определяется с помощью утверждений OIDC, дополнительные сведения см. в разделе "Сведения об усилении защиты с помощью OpenID Connect".

Этот параметр id-token: write позволяет запрашивать JWT у поставщика OIDC GitHub, применяя один из следующих способов:

  • использование переменных среды в средстве выполнения (ACTIONS_ID_TOKEN_REQUEST_URL и ACTIONS_ID_TOKEN_REQUEST_TOKEN);
  • использование getIDToken() из набора средств Actions.

Если необходимо получить токен OIDC для рабочего процесса, разрешение можно установить на уровне рабочего процесса. Например:

YAML
permissions:
  id-token: write # This is required for requesting the JWT
  contents: read  # This is required for actions/checkout

Если необходимо получить токен OIDC только для одного задания, такое разрешение можно установить в этом задании. Например:

YAML
permissions:
  id-token: write # This is required for requesting the JWT

Вам может потребоваться указать дополнительные разрешения в зависимости от требований рабочего процесса.

Для повторно используемых рабочих процессов, принадлежащих одному и тому же пользователю, организации или предприятиям, что и рабочий процесс вызывающего объекта, маркер OIDC, созданный в повторно используемый рабочий процесс, можно получить из контекста вызывающего объекта. Для повторно используемых рабочих процессов за пределами организации или предприятия параметр id-token должен быть явно задан write на уровне рабочего процесса вызывающего объекта или permissions в конкретном задании, которое вызывает повторно используемый рабочий процесс. Это гарантирует, что маркер OIDC, созданный в повторно используемом рабочем процессе, может использоваться только в рабочих процессах вызывающего объекта.

Дополнительные сведения см. в разделе Повторное использование рабочих процессов.

Запрос маркера доступа

Действие google-github-actions/auth получает JWT от поставщика OIDC GitHub, а затем запрашивает маркер доступа из GCP. Дополнительные сведения см. в документации по GCP.

В этом примере есть задание Get_OIDC_ID_token, которое использует действия для запроса списка служб из GCP.

  • WORKLOAD-IDENTITY-PROVIDER — замените на путь к поставщику удостоверений в GCP. Например: projects/example-project-id/locations/global/workloadIdentityPools/name-of-pool/providers/name-of-provider
  • SERVICE-ACCOUNT — замените на имя учетной записи службы в GCP.

Это действие обменивает токен OIDC GitHub на маркер доступа Google Cloud с помощью федерации удостоверений рабочей нагрузки.

YAML
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@f1e2d3c4b5a6f7e8d9c0b1a2c3d4e5f6a7b8c9d0'
      with:
          create_credentials_file: 'true'
          workload_identity_provider: 'WORKLOAD-IDENTITY-PROVIDER'
          service_account: 'SERVICE-ACCOUNT'
    - id: 'gcloud'
      name: 'gcloud'
      run: |-
        gcloud auth login --brief --cred-file="${{ steps.auth.outputs.credentials_file_path }}"
        gcloud services list

Дополнительные материалы