deployIfNotExists不符合原則或modify效果的資源可以透過補救進入符合規範的狀態。 補救是透過來完成,無論是在管理群組、訂用帳戶、資源群組或個別資源上。 本文說明了解和完成使用「Azure 原則」來進行補救所需的步驟。
當 Azure 原則 在評估deployIfNotExists原則時啟動範本部署,或在評估modify原則時修改資源時,它會使用與原則指派相關聯的受控識別。 請注意,當指派的身分識別用於資源部署或修改時,它不會用於評估原則定義及其存在條件。 政策評估會利用發起 API 請求的呼叫者的身份。
原則指派會在補救期間使用 Azure 資源授權的受控識別。 您可以使用原則服務所建立的系統指派受控識別,或由使用者提供的使用者指派身分識別。 受控識別必須指派補救資源所需的最低 Azure 角色型訪問控制 (Azure RBAC) 角色。 如果受控識別缺少角色,在指派原則或計畫期間,入口網站中就會顯示錯誤。 當您使用入口網站時,Azure 原則 在指派啟動時自動授與列出的角色。 當您使用 Azure 軟體開發工具套件 (SDK) 時,角色必須手動授與受控識別。 受控識別的位置不會影響其與 Azure 原則的作業。
注意
變更原則定義後,並不會自動更新指派或相關聯的受控識別。
補救安全性可透過下列步驟來設定:
作為必要條件,原則定義必須定義角色, deployIfNotExists 且 modify 必須成功部署包含範本的內容。 對於內建原則定義不需採取任何動作,因為這些角色已預先填入。 針對自定義原則定義,請在屬性底下 details 新增 roleDefinitionIds 屬性。 此屬性是一個與您環境中角色相符的字串陣列。 如需完整範例,請參閱 deployIfNotExists 或修改。
"details": {
...
"roleDefinitionIds": [
"/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/{roleGUID}",
"/providers/Microsoft.Authorization/roleDefinitions/{builtinroleGUID}"
]
}
屬性 roleDefinitionIds 會使用完整的資源標識碼,而且不會佔用角色的短 roleName 。 若要取得環境中參與者角色的標識碼,請使用下列 Azure CLI 程式代碼:
az role definition list --name "Contributor"
重要
在原則定義中定義 roleDefinitionIds 或手動將許可權指派給受控識別時,許可權應限制為最小的可能集合。 如需更多最佳做法,請參閱受控識別最佳做法建議。
每個 Azure 原則指派只能與一個受控識別相關聯。 不過,可以指派多個角色給受控識別。 設定會以兩個步驟執行:先建立系統指派或使用者指派的受控識別,然後為其授與必要的角色。
注意
透過入口網站建立受控識別時,會自動將角色授與受控識別。 如果 roleDefinitionIds 稍後在原則定義中編輯,則必須手動授與新的許可權,即使在入口網站中也一樣。
建立受控識別
當您使用入口網站建立指派時,Azure 原則 可以產生系統指派的roleDefinitionIds受控識別,並將原則定義中所定義的角色授與它。 或者,您可以指定由使用者指派、且接收相同角色指派的受控識別。
若要在入口網站中設定系統指派的受控識別:
在 [建立/編輯指派] 檢視的 [補救] 索引標籤上,確定已在 [受控識別類型] 底下選取 [系統指派的受控識別]。
指定要放置受控識別的位置。
請勿為系統指派的受控識別指派範圍指派範圍,因為範圍繼承自指派範圍。
若要在入口網站中設定使用者指派的受控識別:
在 [建立/編輯指派] 檢視的 [補救] 索引標籤上,確定已在 [受控識別類型] 底下選取 [使用者指派的受控識別]。
指定受控識別的裝載範圍。 受控識別的範圍不一定要等於指派的範圍,但必須位於相同的租使用者中。
在 [現有的使用者指派的身分識別] 底下,選取受控識別。
若要在原則指派期間建立身分識別,必須定義 [位置] 並使用 [身分識別]。
下列範例會取得 [部署 SQL DB 透明資料加密] 內建原則的定義、設定目標資源群組,然後使用系統指派的受控識別建立指派。
# Login first with Connect-AzAccount if not using Cloud Shell
# Get the built-in "Deploy SQL DB transparent data encryption" policy definition
$policyDef = Get-AzPolicyDefinition -Id '/providers/Microsoft.Authorization/policyDefinitions/86a912f6-9a06-4e26-b447-11b16ba8659f'
# Get the reference to the resource group
$resourceGroup = Get-AzResourceGroup -Name 'MyResourceGroup'
# Create the assignment using the -Location and -Identity properties
$assignment = New-AzPolicyAssignment -Name 'sqlDbTDE' -DisplayName 'Deploy SQL DB transparent data encryption' -Scope $resourceGroup.ResourceId -PolicyDefinition $policyDef -Location 'westus' -IdentityType "SystemAssigned"
下列範例會取得 [部署 SQL DB 透明資料加密] 內建原則的定義、設定目標資源群組,然後使用使用者指派的受控識別建立指派。
# Login first with Connect-AzAccount if not using Cloud Shell
# Get the built-in "Deploy SQL DB transparent data encryption" policy definition
$policyDef = Get-AzPolicyDefinition -Id '/providers/Microsoft.Authorization/policyDefinitions/86a912f6-9a06-4e26-b447-11b16ba8659f'
# Get the reference to the resource group
$resourceGroup = Get-AzResourceGroup -Name 'MyResourceGroup'
# Get the existing user assigned managed identity ID
$userassignedidentity = Get-AzUserAssignedIdentity -ResourceGroupName $rgname -Name $userassignedidentityname
$userassignedidentityid = $userassignedidentity.Id
# Create the assignment using the -Location and -Identity properties
$assignment = New-AzPolicyAssignment -Name 'sqlDbTDE' -DisplayName 'Deploy SQL DB transparent data encryption' -Scope $resourceGroup.ResourceId -PolicyDefinition $policyDef -Location 'westus' -IdentityType "UserAssigned" -IdentityId $userassignedidentityid
$assignment 變數現在包含受控識別的主體識別碼,以及建立原則指派時所傳回的標準值。 您可以透過 存取 $assignment.Identity.PrincipalId 系統指派的受控識別,以及 $assignment.Identity.UserAssignedIdentities[$userassignedidentityid].PrincipalId 使用者指派的受控識別。
透過已定義的角色將權限授與受控識別
重要
如果受控識別沒有執行必要補救工作所需的權限,則只會透過入口網站自動授與權限。 若要透過入口網站建立受控識別,您可以略過此步驟。
對於所有其他方法,都必須透過新增角色手動為指派的受控識別授與存取權,否則補救部署將會失敗。
需要手動權限的範例案例:
- 如果透過 Azure 軟體開發套件 (SDK) 來建立指派
- 如果 由
deployIfNotExists 或 modify 修改的資源超出原則指派的範圍
- 如果範本存取了原則指派範圍以外的資源屬性
使用入口網站將已定義的角色授與指派項目的受控識別時,有兩種方法:使用存取控制 (IAM),或是編輯原則或計畫指派,然後選取 [儲存]。
若要將角色新增至指派項目的受控識別,請依照下列步驟進行操作:
藉由選取 [所有服務] 然後搜尋並選取 [原則],在 Azure 入口網站中啟動 Azure 原則服務。
選取 [Azure 原則] 頁面左側的 [指派]。
找出具有受控識別的指派項目,然後選取名稱。
在編輯頁面上尋找 [指派識別碼] 屬性。 指派標識碼看起來像下列範例:
/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Authorization/policyAssignments/2802056bfc094dfb95d4d7a5
受控識別的名稱是指派資源識別碼中的最後一個部分,在此範例中為 2802056bfc094dfb95d4d7a5。 請複製指派資源識別碼的這個部分。
瀏覽至需要手動新增角色定義的資源或資源父容器 (資源群組、訂用帳戶、管理群組)。
選取資源頁面中的 [存取控制 (IAM)] 連結,然後選取存取控制頁面頂端的 [+ 新增角色指派]。
從原則定義中選取符合 roleDefinitionIds 的適當角色。 將 [指派存取權] 保留為 [使用者、群組或應用程式] 的預設值。 在 [選取] 方塊中,貼上或輸入稍早找到的指派資源識別碼部分。 在搜尋完成之後,選取具有相同名稱的物件以選取識別碼,然後選取 [儲存]。
新的受控識別必須透過 Microsoft Entra ID 完成複寫,才能獲得所需的角色。 復寫完成後,下列範例會反覆運算 中的$policyDefroleDefinitionIds原則定義,並使用New-AzRoleAssignment將角色授與新的受控識別。
具體而言,第一個範例會示範如何在原則範圍授與角色。 第二個範例示範如何在方案 (原則集合) 範圍授與角色。
###################################################
# Grant roles to managed identity at policy scope #
###################################################
# Use the $policyDef to get to the roleDefinitionIds array
$roleDefinitionIds = $policyDef.Properties.policyRule.then.details.roleDefinitionIds
if ($roleDefinitionIds.Count -gt 0)
{
$roleDefinitionIds | ForEach-Object {
$roleDefId = $_.Split("/") | Select-Object -Last 1
New-AzRoleAssignment -Scope $resourceGroup.ResourceId -ObjectId $assignment.Identity.PrincipalId
-RoleDefinitionId $roleDefId
}
}
#######################################################
# Grant roles to managed identity at initiative scope #
#######################################################
#If the policy had no managed identity in its logic, then no impact. If there is a managed identity
used for enforcement, replicate it on the new assignment.
$getNewInitiativeAssignment = Get-AzPolicyAssignment -Name $newInitiativeDefinition.Name
#Create an array to store role definition's IDs used by policies inside the initiative.
$InitiativeRoleDefinitionIds = @();
#Loop through the policy definitions inside the initiative and gather their role definition IDs
foreach ($policyDefinitionIdInsideInitiative in $InitiativeDefinition.Properties.PolicyDefinitions.policyDefinitionId) {
$policyDef = Get-AzPolicyDefinition -Id $policyDefinitionIdInsideInitiative
$roleDefinitionIds = $policyDef.Properties.PolicyRule.then.details.roleDefinitionIds
$InitiativeRoleDefinitionIds += $roleDefinitionIds
}
#Create the role assignments used by the initiative assignment at the subscription scope.
if ($InitiativeRoleDefinitionIds.Count -gt 0) {
$InitiativeRoleDefinitionIds | Sort-Object -Unique | ForEach-Object {
$roleDefId = $_.Split("/") | Select-Object -Last 1
New-AzRoleAssignment -Scope "/subscriptions/$($subscription)" -ObjectId $getNewInitiativeAssignment.Identity.PrincipalId
-RoleDefinitionId $roleDefId
}
}
新的受控識別必須透過 Microsoft Entra ID 完成複寫,才能獲得所需的角色。 復寫完成後,原則定義 roleDefinitionIds 中指定的角色應該授與受控識別。
使用 az policy definition show 命令存取原則定義中指定的角色,然後使用 az role assignment create 命令逐一查看每個roleDefinitionIds角色指派來建立角色指派。
藉由選取 [所有服務] 然後搜尋並選取 [原則],在 Azure 入口網站中啟動 Azure 原則服務。
有三種方式可透過入口網站建立補救工作。
選項 1:從 [補救] 頁面建立補救工作
選取「Azure 原則」頁面左側的 [補救]。
所有deployIfNotExists和modify原則指派都會顯示在 [要補救的原則] 索引卷標上。選取一個具有不符合規範的資源,以開啟 [新增補救工作] 頁面。
請依照步驟指定補救工作詳細資料。
選取 [Azure 原則] 頁面左側的 [合規性]。
選取包含或效果的不符合規範的原則或deployIfNotExists方案指派modify。
選取頁面頂端的 [建立補救工作] 按鈕,以開啟 [新增補救工作] 頁面。
請依照步驟指定補救工作詳細資料。
如果要指派的原則或方案定義具有 deployIfNotExists 或 modify 效果,精靈的 [ 補救 ] 索引卷標會提供 [ 建立補救工作 ] 選項,以在原則指派的同時建立補救工作。
注意
這是最精簡的補救工作建立方法,並且支援用於在訂用帳戶上指派的原則。 對於在管理群組上指派的原則,應在評估判定資源合規性之後,使用選項 1 或選項 2 來建立補救工作。
從入口網站中的指派精靈,瀏覽至 [補救] 索引標籤。選取 [建立補救工作] 核取方塊。
如果補救工作是從計畫指派起始的,請從下拉式清單中選取要補救的原則。
設定受控識別,並填寫精靈的其餘部分。 建立工作分派時會建立補救工作。
只有在使用選項 1 或選項 2 來起始補救工作建立時,才適用此步驟。
如果補救工作是從計畫指派起始的,請從下拉式清單中選取要補救的原則。 一 deployIfNotExists 或 modify 一個原則可以一次透過單一補救工作來補救。
選擇性地修改頁面上的補救設定。 如需每個設定控制項的相關資訊,請參閱補救工作結構。
在相同頁面上,使用 [範圍] 省略符號挑選從中指派原則的子資源 (連個別資源物件也包含在內),以篩選要補救的資源。 此外,使用 [位置] 下拉式清單進一步篩選資源。
選取 [補救] 來篩選資源之後,開始補救工作。 原則合規性頁面會開啟至 [補救工作] 索引標籤,以顯示工作進度的狀態。 補救工作所建立的部署會立即開始。
瀏覽至 [補救] 頁面上的 [補救工作] 索引標籤。 選取補救工作,以檢視所使用篩選的詳細數據、目前狀態,以及要補救的資源清單。
在 [補救工作詳細資料] 頁面中,以滑鼠右鍵按一下資源,以檢視補救工作的部署或資源。 在資料列結尾選取 [相關事件],以查看錯誤訊息等詳細資料。
透過補救工作部署的資源會新增至原則指派詳細資料頁面上的 [已部署資源] 索引標籤中。
若要透過 Azure PowerShell 建立補救工作,請使用 Start-AzPolicyRemediation 命令。 取代為您的訂用帳戶識別碼,並以{subscriptionId}您的 {myAssignmentId} 或 deployIfNotExists 原則指派識別碼取代 modify 。
# Login first with Connect-AzAccount if not using Cloud Shell
# Create a remediation for a specific assignment
Start-AzPolicyRemediation -Name 'myRemediation' -PolicyAssignmentId '/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/policyAssignments/{myAssignmentId}'
您也可以選擇透過下列選擇性參數來調整補救設定:
-
-FailureThreshold - 用來指定在失敗百分比超過指定的閾值時,是否應將補救工作視為失敗。 以 0 到 100 之間的數字提供。 根據預設,失敗閾值為 100%。
-
-ResourceCount - 決定在一項補救工作中要補救多少個不符合的規範的資源。 預設值為 500 (先前的限制)。 數目上限為 50,000 個資源。
-
-ParallelDeploymentCount - 決定要同時補救的資源數目。 允許的值為一次 1 到 30 個資源。 預設值為 10。
如需更多補救 Cmdlet 和範例,請參閱 Az.PolicyInsights 模組。
若要使用 Azure CLI 建立補救工作,請使用 az policy remediation 命令。 取代為您的訂用帳戶識別碼,並以{subscriptionId}您的 {myAssignmentId} 或 deployIfNotExists 原則指派識別碼取代 modify 。
# Login first with az login if not using Cloud Shell
# Create a remediation for a specific assignment
az policy remediation create --name myRemediation --policy-assignment '/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/policyAssignments/{myAssignmentId}'
如需更多補救命令和範例,請參閱 az policy remediation 命令。
下一步