Skip to main content

在 Azure 中配置 OpenID Connect

在工作流中使用 OpenID Connect 通过Azure进行身份验证。

注意

GitHub Enterprise Server 目前不支持 GitHub 托管的运行器。

概述

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

本指南概述如何配置 Azure 信任 GitHub 的 OIDC 作为联合标识,并包含 azure/login 操作的工作流示例,该操作使用令牌向 Azure 进行身份验证并访问资源。

Prerequisites

  • 若要了解 GitHub 如何使用 OpenID Connect (OIDC) 及其体系结构和优势的基本概念,请参阅“OpenID Connect”。

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

  • 必须确保你的云提供商可以访问以下 OIDC 端点:

    • https://HOSTNAME/_services/token/.well-known/openid-configuration

    • https://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文档

  1. 创建 Entra ID 应用程序和服务主体。
  2. 为 Entra ID 应用程序添加联合身份验证凭据。
  3. 创建用于存储 Azure 配置的 GitHub 机密。

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

  • 为强化安全性,请确保已查看 OpenID Connect。 有关示例,请参阅 OpenID Connect
  • 对于 audience 设置,api://AzureADTokenExchange 是推荐值,但你也可以在此指定其他值。

更新 GitHub Actions 工作流程

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

  1. 为令牌添加权限设置。
  2. 使用 azure/login 动作将 OIDC 令牌(JWT)交换为云访问令牌。

注意

在工作流或 OIDC 策略中使用环境时,建议将保护规则添加到环境中以提高安全性。 例如,可以在环境中配置部署规则,以限制可以部署到环境或访问环境机密的分支和标记。 有关详细信息,请参阅“管理部署环境”。

添加权限设置

作业或工作流运行需要使用 id-token: writepermissions 设置,以允许 GitHub 的 OIDC 提供者为每个运行创建 JSON Web 令牌。

注意

在工作流权限中设置 id-token: write 不会授予工作流修改或写入任何资源的权限。 这只会允许工作流为某个操作或步骤请求(提取)并使用(设置)OIDC 令牌。 然后,此令牌用于通过生存期较短的访问令牌向外部服务进行身份验证。

有关所需权限、配置示例和高级方案的详细信息,请参阅 OpenID Connect 参考

请求访问令牌

azure/login 操作从 GitHub OIDC 提供商接收 JWT,然后向 Azure 请求访问令牌。 有关详细信息,请参阅 azure/login 文档。

以下示例将 OIDC ID 令牌与Azure交换,以接收访问令牌,然后可用于访问云资源。

YAML
# 此工作流使用未经 GitHub 认证的操作。
# 它们由第三方提供,并受
# 单独的服务条款、隐私政策和支持
# 文档。
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

其他阅读材料