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 |
appId 、principalId |
在 Azure DevOps 中创建服务连接 | appId |
workloadIdentityFederationIssuer 、workloadIdentityFederationSubject |
在 Microsoft Entra 或 Azure 中创建联合凭据 |
appId 、workloadIdentityFederationIssuer 、workloadIdentityFederationSubject |
|
在 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.创建联合标识凭据
使用workloadIdentityFederationIssuer
和workloadIdentityFederationSubject
从创建服务连接步骤中输出创建联合凭据。
- 托管标识
- 应用注册
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 标识,也称为 principalId
。
principalId
在“创建标识”命令的输出中。
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。