Azure DevOps Services
瞭解如何使用腳本在 Azure Pipelines 中使用工作負載身分識別建立 Azure Resource Manager 服務連線。 腳本可確保設定服務連線時的一致性、效率和重複性,降低人為錯誤的風險。 它們可節省時間,特別是在建立多個連線或部署到不同環境時。 這些腳本也可以整合到自動化程式中,以調整及更妥善地管理大型部署。
將腳本當做自動化程式的一部分,藉由確保服務連線使用正確的許可權和設定,協助強制執行安全策略和合規性需求。 它也會作為設置過程的文件。
先決條件
產品 | 要求 |
---|---|
Azure DevOps | - Azure DevOps 組織和專案。 請建立一個組織或專案,如果您尚未這樣做。 |
天藍色 |
Azure 訂用帳戶。 許可權: - 若要在 Azure 中建立角色指派:您必須具有 「使用者存取管理員 」或 「角色型訪問控制系統管理員 」許可權,或更高許可權。 這些角色可讓您管理建立身分識別所需的存取權和指派角色。 如需詳細資訊,請參閱<Azure 內建角色>。 |
進入 |
許可權: - 若要在 Microsoft Entra 中建立應用程式註冊:應該啟用 應用程式註冊委派 ,或者您應該具有 應用程式開發人員 角色。 如需詳細資訊,請參閱 Microsoft Entra 內建角色。 您也可以在 Azure 中建立受控識別,而不是在 Entra 中建立應用程式註冊。 |
流程
限制條件
- 在自動化中,
"creationMode": "Manual"
應在建立需要Microsoft Entra 身分識別的服務連線時使用。 必須有重要的Microsoft Entra 許可權,才能讓 Azure DevOps 代表呼叫端建立所有物件,因此 Azure DevOps 不支持針對非用戶主體使用"creationMode": "Automatic"
。 相反地,端對端自動化應該個別建立每個物件(身分識別、服務連線、認證、角色指派)。 - 工作負載身分識別同盟會定義身分識別與服務連線之間的雙向關聯性。 因此,對象必須依特定順序建立,而且只能在建立服務連線之後建立同盟認證。
命令執行順序
下表提供每個物件建立命令之間所交換之主要屬性的一覽表。 輸出的相依性會決定執行順序。
步驟 | 輸入 | 輸出 |
---|---|---|
在 Microsoft Entra 或 Azure 中建立身分識別 | tenantId |
appId 、principalId |
在 Azure DevOps 中建立服務連線 | appId |
workloadIdentityFederationIssuer 、workloadIdentityFederationSubject |
在 entra 或 Azure Microsoft 中建立同盟認證 |
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 中建立服務主體。 服務主體的物件識別碼也稱為 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:反斜線、PowerShell:反引號)。
受控識別不必在授與其存取權的相同訂用帳戶中建立;這可以在建立角色指派步驟中完成。
如需此命令的詳細資訊,請參閱 az identity federated-credential create。
5.建立角色指派
使用 az role assignment create
將角色指派新增至你的受管理的識別或應用程式註冊。 如需可用的角色,請參閱 Azure 內建角色。 角色的被指派者是與應用程式註冊或受控識別相關聯的服務主體。 服務主體會以其識別碼來識別,也稱為 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
命令會將 Contributor 角色指派給訂閱層級的服務主體。 這可讓服務主體管理指定訂用帳戶內的資源。
如需此命令的詳細資訊,請參閱 az role assignment create。