注意
GitHub Enterprise Server 目前不支持 GitHub 托管的运行器。
概述
OpenID Connect (OIDC) 允许您的 GitHub Actions 工作流程访问 Azure 中的资源,而无需将任何 Azure 凭据存储为长期 GitHub 机密。
本指南概述了如何配置 Azure 信任 GitHub 的 OIDC 作为联合标识,并包含 azure/login
操作的工作流示例,该操作使用令牌向 Azure 进行身份验证并访问资源。
先决条件
-
若要了解 GitHub 如何使用 OpenID Connect (OIDC) 及其体系结构和优势的基本概念,请参阅“OpenID Connect”。
-
在继续之前,必须规划安全策略,以确保仅以可预测的方式分配访问令牌。 要控制云提供商颁发访问令牌的方式,必须至少定义一个条件,以便不受信任的存储库无法为云资源请求访问令牌。 有关详细信息,请参阅“OpenID Connect”。
-
必须确保你的云提供商可以访问以下 OIDC 端点:
http://HOSTNAME/_services/token/.well-known/openid-configuration
http://HOSTNAME/_services/token/.well-known/jwks
注意
Microsoft Entra ID(以前称为 Azure AD)没有为这些终结点定义的固定 IP 范围。
-
确保 JSON Web 令牌 (JWT) 随附的颁发者声明的值已设置为可公开路由的 URL。 有关详细信息,请参阅“OpenID Connect”。
将联合身份验证凭证添加到 Azure
GitHub 的 OIDC 提供商与 Azure 的工作负载联合身份验证配合使用。 有关概述,请参阅“工作负载联合身份验证”中的 Microsoft 文档。
要在 Azure 中配置 OIDC 身份提供商,您需要执行以下配置。 有关进行这些更改的说明,请参阅 Azure 文档。
- 创建 Entra ID 应用程序和服务主体。
- 为 Entra ID 应用程序添加联合身份验证凭证。
- 创建用于存储 Azure 配置的 GitHub 机密。
配置身份提供商的附加指导:
- 有关安全强化,请确保已查看“OpenID Connect”。 有关示例,请参阅“OpenID Connect”。
- 对于
audience
设置,建议使用api://AzureADTokenExchange
值,但也可以在此处指定其他值。
更新 GitHub Actions 工作流程
要更新 OIDC 的工作流程,您需要对 YAML 进行两项更改:
- 为令牌添加权限设置。
- 使用操作
azure/login
将 OIDC 令牌 (JWT) 交换为云访问令牌。
注意
在工作流或 OIDC 策略中使用环境时,建议将保护规则添加到环境中以提高安全性。 例如,可以在环境中配置部署规则,以限制可以部署到环境或访问环境机密的分支和标记。 有关详细信息,请参阅“管理部署环境”。
添加权限设置
作业或工作流运行需要使用 id-token: write
的 permissions
设置,以允许 GitHub 的 OIDC 提供者为每个运行创建 JSON Web 令牌。
注意
在工作流权限中设置 id-token: write
不会授予工作流修改或写入任何资源的权限。 这只会允许工作流为某个操作或步骤请求(提取)并使用(设置)OIDC 令牌。 然后,此令牌用于通过生存期较短的访问令牌向外部服务进行身份验证。
有关所需权限、配置示例和高级方案的详细信息,请参阅 OpenID Connect 参考。
请求访问令牌
azure/login
操作从 GitHub OIDC 提供商接收 JWT,然后从 Azure 请求访问令牌。 有关详细信息,请参阅 azure/login
文档。
以下示例将 OIDC ID 令牌与 Azure 交换以接收访问令牌,然后可以使用该令牌访问云资源。
name: Run Azure Login with OIDC on: [push] permissions: id-token: write contents: read jobs: build-and-deploy: runs-on: ubuntu-latest steps: - name: 'Az CLI login' uses: azure/login@8c334a195cbb38e46038007b304988d888bf676a with: client-id: ${{ secrets.AZURE_CLIENT_ID }} tenant-id: ${{ secrets.AZURE_TENANT_ID }} subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} - name: 'Run az commands' run: | az account show az group list
name: Run Azure Login with OIDC
on: [push]
permissions:
id-token: write
contents: read
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: 'Az CLI login'
uses: azure/login@8c334a195cbb38e46038007b304988d888bf676a
with:
client-id: ${{ secrets.AZURE_CLIENT_ID }}
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
- name: 'Run az commands'
run: |
az account show
az group list