Skip to main content

在 Google Cloud Platform 中配置 OpenID Connect

在工作流程中使用 OpenID Connect 向 Google Cloud 平台进行身份验证。

注: GitHub 托管的运行器目前在 GitHub Enterprise Server 上不受支持。 您可以在 GitHub 公共路线图 上查看有关未来支持计划的更多信息。

概览

OpenID Connect (OIDC) 允许您的 GitHub Actions 工作流程访问 Google Cloud 平台中的资源,而无需将任何 GCP 凭据存储为长期 GitHub 机密。

本指南概述了如何配置 GCP 信任 GitHub 的 OIDC 作为联合标识,并包括 google-github-actions/auth 操作的工作流程示例,该操作使用令牌向 GCP 进行身份验证和访问资源。

基本要求

  • 要了解 GitHub 如何使用 OpenID Connect (OIDC) 的基本概念及其体系结构和优势,请参阅“关于使用 OpenID Connect 进行安全强化”。

  • 在继续之前,必须规划安全策略,以确保仅以可预测的方式分配访问令牌。 要控制云提供商颁发访问令牌的方式,必须至少定义一个条件,使不受信任的存储库无法为云资源请求访问令牌。 更多信息请参阅“使用云配置 OIDC 信任”。

添加 Google Cloud 工作负载身份提供商

要在 GCP 中配置 OIDC 身份提供商,您需要执行以下配置。 有关进行这些更改的说明,请参阅 GCP 文档

  1. 创建新的身份池。
  2. 配置映射并添加条件。
  3. 将新池连接到服务帐户。

配置身份提供商的附加指导:

更新 GitHub Actions 工作流程

要更新 OIDC 的工作流程,您需要对 YAML 进行两项更改:

  1. 为令牌添加权限设置。
  2. 使用 google-github-actions/auth 操作将 OIDC 令牌 (JWT) 交换为云访问令牌。

添加权限设置

 作业或工作流程运行需要具有 id-token: writepermissions 设置。 如果将 id-tokenpermissions 设置设为 readnone,您将无法请求 OIDC JWT ID 令牌。

id-token: write 设置允许使用以下方法之一从 GitHub 的 OIDC 提供商请求 JWT:

  • 在运行器上使用环境变量(ACTIONS_ID_TOKEN_REQUEST_URLACTIONS_ID_TOKEN_REQUEST_TOKEN)。
  • 从 Actions 工具包使用 getIDToken()

如果您只需要为单个作业获取 OIDC 令牌,则可以在该作业中设置此权限。 例如:

YAML
permissions:
  id-token: write

您可能需要在此处指定其他权限,具体取决于工作流程的要求。

请求访问令牌

google-github-actions/auth 操作从 GitHub OIDC 提供商接收 JWT,然后从 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 项目的 ID。

此操作使用工作负载联合身份验证将 GitHub OIDC 令牌交换为 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@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