概览
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 文档。
- 创建新的身份池。
- 配置映射并添加条件。
- 将新池连接到服务帐户。
配置身份提供商的附加指导:
- 为强化安全,请确保您已查看“使用云配置 OIDC 信任”。 有关示例,请参阅“在云提供商中配置主题”。
- 要使服务帐户可用于配置,需要将其分配给
roles/iam.workloadIdentityUser
角色。 更多信息请参阅 GCP 文档。 - 要使用的颁发者 URL:
https://token.actions.githubusercontent.com
更新 GitHub Actions 工作流程
要更新 OIDC 的工作流程,您需要对 YAML 进行两项更改:
- 为令牌添加权限设置。
- 使用
google-github-actions/auth
操作将 OIDC 令牌 (JWT) 交换为云访问令牌。
添加权限设置
The job or workflow run requires a permissions
setting with id-token: write
. You won't be able to request the OIDC JWT ID token if the permissions
setting for id-token
is set to read
or none
.
The id-token: write
setting allows the JWT to be requested from GitHub's OIDC provider using one of these approaches:
- Using environment variables on the runner (
ACTIONS_ID_TOKEN_REQUEST_URL
andACTIONS_ID_TOKEN_REQUEST_TOKEN
). - Using
getIDToken()
from the Actions toolkit.
如果您只需要为单个作业获取 OIDC 令牌,则可以在该作业中设置此权限。 例如:
permissions:
id-token: write
You may need to specify additional permissions here, depending on your workflow's requirements.
请求访问令牌
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 访问令牌。
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