概述
OpenID Connect (OIDC) 允许您的 GitHub Actions 工作流程访问 Azure 中的资源,无需将 Azure 凭据存储为长期有效的 GitHub 密钥。
本指南概述了如何配置 Azure 以信任 GitHub 的 OIDC 作为联合身份,并包含一个针对 azure/login
操作的工作流程示例,该操作使用令牌对 Azure 进行身份验证并访问资源。
先决条件
-
要了解 GitHub 如何使用 OpenID Connect (OIDC) 的基本概念及其架构和优势,请参阅“关于使用 OpenID Connect 加强安全性”。
-
在继续之前,您必须规划您的安全策略,以确保仅以可预测的方式分配访问令牌。要控制云提供商如何颁发访问令牌,您**必须**定义至少一个条件,以便不受信任的存储库无法为您的云资源请求访问令牌。有关更多信息,请参阅“关于使用 OpenID Connect 加强安全性”。
将联合凭据添加到 Azure
GitHub 的 OIDC 提供程序与 Azure 的工作负载身份联合一起使用。有关概述,请参阅 Microsoft 的文档:工作负载身份联合。
要配置 Azure 中的 OIDC 身份提供程序,您需要执行以下配置。有关进行这些更改的说明,请参阅Azure 文档。
在以下过程中,您将为 Microsoft Entra ID(以前称为 Azure AD)创建一个应用程序。
- 创建 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
的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 令牌。
有关更多信息,请参阅“重用工作流程”。
请求访问令牌
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@a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0 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@a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0
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