概述
OpenID Connect (OIDC) 允许您的 GitHub Actions 工作流访问 Google Cloud Platform (GCP) 中的资源,而无需将 GCP 凭据存储为长期存在的 GitHub 密钥。
本指南概述了如何配置 GCP 以信任 GitHub 的 OIDC 作为联合身份,并包含一个针对 google-github-actions/auth 操作的工作流示例,该操作使用令牌对 GCP 进行身份验证并访问资源。
先决条件
- 
要了解 GitHub 如何使用 OpenID Connect (OIDC) 的基本概念及其架构和优势,请参阅“关于使用 OpenID Connect 加固安全性的信息”。 
- 
在继续之前,您必须规划您的安全策略,以确保仅以可预测的方式分配访问令牌。为了控制您的云提供商如何发出访问令牌,您**必须**定义至少一个条件,以便不受信任的存储库无法为您的云资源请求访问令牌。有关更多信息,请参阅“关于使用 OpenID Connect 加固安全性的信息”。 
添加 Google Cloud 工作负载身份提供商
要在 GCP 中配置 OIDC 身份提供商,您需要执行以下配置。有关如何进行这些更改的说明,请参阅GCP 文档。
- 创建一个新的身份池。
- 配置映射并添加条件。
- 将新池连接到服务帐户。
配置身份提供商的其他指导
- 为了加强安全性,请确保您已查看“关于使用 OpenID Connect 加强安全性”。例如,请参阅“关于使用 OpenID Connect 加强安全性”。
- 要使服务帐户可用于配置,需要将其分配给roles/iam.workloadIdentityUser角色。更多信息,请参阅GCP 文档。
- 要使用的颁发者 URL:https://token.actions.githubusercontent.com
更新您的 GitHub Actions 工作流
要更新您用于 OIDC 的工作流,您需要对 YAML 文件进行两处更改
- 添加令牌的权限设置。
- 使用google-github-actions/auth操作将 OIDC 令牌 (JWT) 交换为云访问令牌。
注意
当工作流或 OIDC 策略中使用环境时,我们建议为环境添加保护规则以增强安全性。例如,您可以配置环境上的部署规则,以限制哪些分支和标签可以部署到环境或访问环境机密。更多信息,请参阅“管理部署环境”。
添加权限设置
作业或工作流运行需要一个包含id-token: write的permissions设置,以允许 GitHub 的 OIDC 提供商为每次运行创建一个 JSON Web 令牌。如果id-token的permissions未设置为write,则您将无法请求 OIDC JWT ID 令牌,但是此值并不意味着授予对任何资源的写入访问权限,而只是能够为操作或步骤获取和设置 OIDC 令牌,以启用使用短期访问令牌进行身份验证。任何实际的信任设置都是使用 OIDC声明定义的,更多信息请参阅“关于使用 OpenID Connect 加强安全性”。
id-token: write设置允许使用以下方法之一从 GitHub 的 OIDC 提供商请求 JWT
- 在运行程序上使用环境变量 (ACTIONS_ID_TOKEN_REQUEST_URL和ACTIONS_ID_TOKEN_REQUEST_TOKEN)。
- 使用 Actions 工具包中的getIDToken()。
如果您需要为工作流获取 OIDC 令牌,则可以在工作流级别设置权限。例如
permissions: id-token: write # This is required for requesting the JWT contents: read # This is required for actions/checkout
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
permissions:
  id-token: write # This is required for requesting the JWT
根据您的工作流要求,您可能需要在此处指定其他权限。
对于由与调用者工作流相同的用户、组织或企业拥有的可重用工作流,可以在调用者的上下文中访问在可重用工作流中生成的 OIDC 令牌。对于企业或组织外部的可重用工作流,应在调用者工作流级别或调用可重用工作流的特定作业中将id-token的permissions设置明确设置为write。这确保只有在需要时才允许在调用者工作流中使用在可重用工作流中生成的 OIDC 令牌。
更多信息,请参阅“重用工作流”。
请求访问令牌
google-github-actions/auth操作接收来自 GitHub OIDC 提供商的 JWT,然后从 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 中服务帐户的名称。
此操作使用工作负载身份联合将 GitHub OIDC 令牌交换为 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@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
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