使用脚本通过工作负荷标识服务连接自动执行 Azure 资源管理器

Azure DevOps Services

了解如何使用脚本在 Azure Pipelines 中创建具有工作负荷标识的 Azure 资源管理器服务连接。 脚本在设置服务连接时确保一致性、效率和可重复性,从而减少人为错误的风险。 它们节省时间,尤其是在创建多个连接或部署到不同环境时。 这些脚本还可以集成到自动化过程中,以扩展和更好地管理大型部署。

将脚本用作自动化过程的一部分,通过确保服务连接使用正确的权限和配置,帮助强制实施安全策略和符合性要求。 它还充当设置过程的文档。

先决条件

产品 要求
Azure DevOps - Azure DevOps 组织和项目。 创建 组织项目 (如果尚未创建)。
天蓝色 一个 Azure 订阅
权限:
     - 若要在 Azure 中创建角色分配:必须具有 用户访问管理员基于角色的访问控制管理员 权限或更高版本。 通过这些角色,可以管理创建标识所需的访问权限和分配角色。 有关详细信息,请参阅 Azure 内置角色
进入 权限:
     - 若要在 Microsoft Entra 中创建应用注册:应启用 应用注册委派 ,或者应具有 应用程序开发人员 角色。 有关详细信息,请参阅 Microsoft Entra 内置角色
与其在 Entra 中创建应用注册,不如在 Azure 中创建托管标识。

流程

约束

  • 在自动化中, "creationMode": "Manual" 应在创建需要Microsoft Entra 标识的服务连接时使用。 必须具有重要的Microsoft Entra 特权才能让 Azure DevOps 代表调用方创建所有对象,因此 Azure DevOps 不支持对非用户主体使用 "creationMode": "Automatic" 。 相反,端到端自动化应单独创建每个对象(标识、服务连接、凭据、角色分配)。
  • 工作负载身份联合定义身份和服务连接之间的双向关系。 因此,需要按特定顺序创建对象,并且只能在创建服务连接后创建联合凭据。

命令执行顺序

此表概述了每个对象的创建命令之间交换的关键属性。 输出上的依赖关系决定了执行顺序。

步骤 输入 输出
在 Microsoft Entra 或 Azure 中创建标识 tenantId appIdprincipalId
在 Azure DevOps 中创建服务连接 appId workloadIdentityFederationIssuerworkloadIdentityFederationSubject
在 Microsoft Entra 或 Azure 中创建联合凭据 appIdworkloadIdentityFederationIssuerworkloadIdentityFederationSubject
在 Azure 中创建角色分配 principalId

1.使用 Azure CLI 登录

以下命令使用 Azure CLI。 登录到目标租户:

az login --tenant TENANT_ID

使用 Azure CLI 向 Azure 进行身份验证中了解详细信息。

2. 创建标识

使用托管标识或应用注册创建标识。

使用 az identity create 创建托管标识。

az identity create --name MyIdentity --resource-group MyResourceGroup --query '{clientId:clientId,principalId:principalId}'

示例输出:

{
  "clientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
  "principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222"
}

托管标识在 Microsoft Entra 中创建服务主体。 服务主体的对象 ID 也称为 principalId。 稍后使用服务主体分配 RBAC 角色。 appId 用于在 Azure DevOps 中创建服务连接。

az identity create 中了解详细信息。

3.创建服务连接

此示例使用 Azure DevOps Azure CLI 扩展 和配置文件来创建服务连接。 这会配置在新 Azure 服务连接中创建的标识。 servicePrincipalId授权参数使用appId身份标识填充。

需要一个appId来作为输入。

第一个代码片段是配置文件。 ServiceConnectionGeneric.json

{
  "data": {
    "subscriptionId": "SUBSCRIPTION_ID",
    "subscriptionName": "My Azure Subscription",
    "environment": "AzureCloud",
    "scopeLevel": "Subscription",
    "creationMode": "Manual"
  },
  "name": "MyNewServiceEndpoint",
  "type": "AzureRM",
  "url": "https://management.azure.com/",
  "authorization": {
    "parameters": {
      "tenantid": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
      "serviceprincipalid": "00001111-aaaa-2222-bbbb-3333cccc4444"
    },
    "scheme": "WorkloadIdentityFederation"
  },
  "isShared": false,
  "isReady": true,
  "serviceEndpointProjectReferences": [
    {
      "projectReference": {
        "id": "c7e5f0b3-71fa-4429-9fb3-3321963a7c06",
        "name": "TestProject"
      },
      "name": "MyNewServiceEndpoint"
    }
  ]
}
az devops service-endpoint create -service-endpoint-configuration ./ServiceConnectionGeneric.json --query authorization.parameters

az devops service-endpoint create 使用 ServiceConnectionGeneric.json 在 Azure DevOps 中自动创建服务连接。 输出包括你将在未来的步骤中使用的授权参数。

示例输出:

{
  "serviceprincipalid": "00001111-aaaa-2222-bbbb-3333cccc4444",
  "tenantid": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
  "workloadIdentityFederationIssuer": "https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0",
  "workloadIdentityFederationIssuerType": "EntraID",
  "workloadIdentityFederationSubject": "<federation-subject>"
}

有关此命令的详细信息,请参阅 Azure DevOps CLI 服务终结点

4.创建联合标识凭据

使用workloadIdentityFederationIssuerworkloadIdentityFederationSubject创建服务连接步骤中输出创建联合凭据。

az identity federated-credential create --name fic-for-sc 
                                        --identity-name MyIdentity  
                                        --resource-group MyResourceGroup 
                                        --issuer "https://login.microsoftonline.com/TENANT_ID/v2.0" 
                                        --subject "<federation-subject>" 
                                        --subscription MSI_SUBSCRIPTION_ID

az identity federated-credential create 将联合标识凭据链接到托管标识,使托管标识能够使用提供的使用者声明通过 Microsoft Entra ID 进行身份验证。

小窍门

在未完成命令的任何行末尾添加行继续符(Bash: backslash、PowerShell: backquote)。

托管标识不必在被授予在 “创建角色分配”步骤中访问权限的同一订阅中创建。

有关此命令的详细信息,请参阅 az identity federated-credential create

5. 创建角色分配

向托管标识或应用注册 az role assignment create添加角色分配。 有关可用角色,请参阅 Azure 内置角色。 角色的被分配者是与应用注册或托管标识关联的服务主体。 服务主体由其 ID 标识,也称为 principalIdprincipalId在“创建标识”命令的输出中。

az role assignment create --role Contributor --scope /subscriptions/SUBSCRIPTION_ID --assignee-object-id PRINCIPAL_ID --assignee-principal-type ServicePrincipal

az role assignment create --role Contributor 命令将参与者角色分配给订阅级别的服务主体。 这样,服务主体就可以管理指定订阅中的资源。

有关此命令的详细信息,请参阅 az role assignment create