Skip to main content

在 Azure 中配置 OpenID Connect

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

概述

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

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

先决条件

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

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

将联合凭据添加到 Azure

GitHub 的 OIDC 提供商与 Azure 的工作负载联合身份验证配合使用。 有关概述,请参阅“工作负载联合身份验证”中的 Microsoft 文档。

要在 Azure 中配置 OIDC 身份提供商,您需要执行以下配置。 有关进行这些更改的说明,请参阅 Azure 文档

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

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

更新 GitHub Actions 工作流程

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

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

添加权限设置

作业或工作流运行需要具有 id-token: writepermissions 设置。 如果 id-tokenpermissions 设置已设置为 readnone,则无法请求 OIDC JWT ID 令牌。

id-token: write 设置允许使用下列方法之一从 GitHub 的 OIDC 提供程序请求 JWT:

  • 在运行器上使用环境变量(ACTIONS_ID_TOKEN_REQUEST_URLACTIONS_ID_TOKEN_REQUEST_TOKEN)。
  • 使用“操作”工具包中的 getIDToken()

如果需要为工作流提取 OIDC 令牌,则可以在工作流级别设置权限。 例如:

YAML
permissions:
  id-token: write # This is required for requesting the JWT
  contents: read  # This is required for actions/checkout

如果只需要为单个作业提取 OIDC 令牌,则可在该作业中设置此权限。 例如:

YAML
permissions:
  id-token: write # This is required for requesting the JWT

可能需要在此处指定额外权限,具体取决于你的工作流要求。

请求访问令牌

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

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

YAML
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@v1
        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