共用方式為


快速入門:使用 Bicep 檔案建立原則指派,以識別不符合規範的資源

在本快速入門中,您會使用 Bicep 檔案建立一個原則指派,驗證資源是否符合 Azure 原則。 此原則會指派給資源群組,且其會稽核不使用受控磁碟的虛擬機器。 建立原則指派之後,您將識別不符合規範的虛擬機器。

Bicep 是使用宣告式語法來部署 Azure 資源的特定領域語言 (DSL)。 其提供簡潔的語法、可靠的類型安全,並支援程式碼重複使用。 Bicep 能夠為您在 Azure 中的基礎結構即程式碼解決方案,提供最佳的製作體驗。

指派內建原則或計畫定義時,您可以選擇參考版本。 除非另有指定,否則內建定義的原則指派會預設為最新版本,並自動繼承次要版本變更。

必要條件

檢閱 Bicep 檔案

Bicep 檔案會為資源群組範圍建立一個原則指派,並指派內建原則定義 (稽核不使用受控磁碟的 VM)。

建立下列 Bicep 檔案作為 policy-assignment.bicep

  1. 開啟 Visual Studio Code,並選取 [檔案]>[新增文字檔]
  2. 複製 Bicep 檔案並將其貼入 Visual Studio Code 中。
  3. 選取 [檔案]>[儲存],並使用檔案名稱 policy-assignment.bicep
param policyAssignmentName string = 'audit-vm-managed-disks'
param policyDefinitionID string = '/providers/Microsoft.Authorization/policyDefinitions/06a78e20-9358-41c9-923c-fb736d382a4d'
param policyDisplayName string = 'Audit VM managed disks'

resource assignment 'Microsoft.Authorization/policyAssignments@2023-04-01' = {
  name: policyAssignmentName
  scope: resourceGroup()
  properties: {
    policyDefinitionId: policyDefinitionID
    description: 'Policy assignment to resource group scope created with Bicep file'
    displayName: policyDisplayName
    nonComplianceMessages: [
      {
        message: 'Virtual machines should use managed disks'
      }
    ]
  }
}

output assignmentId string = assignment.id

Bicep 檔案中定義的資源類型為 Microsoft.Authorization/policyAssignments

Bicep 檔案會使用三個參數來部署原則指派:

  • policyAssignmentName 會建立名為 audit-vm-managed-disks 的原則指派。
  • policyDefinitionID 會使用內建原則定義的識別碼。 如需參考,取得識別碼的命令位於部署範本的區段中。
  • policyDisplayName 會建立顯示在 Azure 入口網站中的顯示名稱。

如需 Bicep 檔案的詳細資訊:

部署 Bicep 檔案

您可以使用 Azure PowerShell 或 Azure CLI 來部署 Bicep 檔案。

從 Visual Studio Code 終端機工作階段中,連線到 Azure。 如果您有多個訂用帳戶,請執行命令來設定您訂用帳戶的內容。 使用您的 Azure 訂用帳戶識別碼來取代 <subscriptionID>

Connect-AzAccount

# Run these commands if you have multiple subscriptions
Get-AzSubScription
Set-AzContext -Subscription <subscriptionID>

您可以驗證 Microsoft.PolicyInsights 是否已註冊。 若未註冊,您可以執行命令來註冊資源提供者。

Get-AzResourceProvider -ProviderNamespace 'Microsoft.PolicyInsights' |
   Select-Object -Property ResourceTypes, RegistrationState

Register-AzResourceProvider -ProviderNamespace 'Microsoft.PolicyInsights'

如需詳細資訊,請移至 Get-AzResourceProviderRegister-AzResourceProvider

下列命令會顯示 policyDefinitionID 參數的值:

(Get-AzPolicyDefinition |
  Where-Object { $_.Properties.DisplayName -eq 'Audit VMs that do not use managed disks' }).ResourceId

下列命令會將原則定義部署至您的資源群組。 將 <resourceGroupName> 取代為您的資源群組名稱:

$rg = Get-AzResourceGroup -Name '<resourceGroupName>'

$deployparms = @{
Name = 'PolicyDeployment'
ResourceGroupName = $rg.ResourceGroupName
TemplateFile = 'policy-assignment.bicep'
}

New-AzResourceGroupDeployment @deployparms

$rg 變數會儲存資源群組的屬性。 $deployparms 變數會使用 splatting 來建立參數值並改善可讀性。 New-AzResourceGroupDeployment 命令會使用 $deployparms 變數中定義的參數值。

  • Name 是輸出中和 Azure 中針對資源群組部署所顯示的部署名稱。
  • ResourceGroupName 會使用 $rg.ResourceGroupName 屬性來取得其中指派原則的資源群組名稱。
  • TemplateFile 會指定本機電腦上 Bicep 檔案的名稱和位置。

您可以使用下列命令來驗證原則指派的部署:

此命令會使用 $rg.ResourceId 屬性來取得資源群組的識別碼。

Get-AzPolicyAssignment -Name 'audit-vm-managed-disks' -Scope $rg.ResourceId
Name               : audit-vm-managed-disks
ResourceId         : /subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/Microsoft.Authorization/policyAssignments/audit-vm-managed-disks
ResourceName       : audit-vm-managed-disks
ResourceGroupName  : {resourceGroupName}
ResourceType       : Microsoft.Authorization/policyAssignments
SubscriptionId     : {subscriptionId}
PolicyAssignmentId : /subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/Microsoft.Authorization/policyAssignments/audit-vm-managed-disks
Properties         : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.Policy.PsPolicyAssignmentProperties

如需詳細資訊,請移至 Get-AzPolicyAssignment

識別不符合規範的資源

在部署原則指派之後,會稽核部署至資源群組的虛擬機器,是否符合受控磁碟原則。

新原則指派的合規性狀態需要幾分鐘的時間才會生效,而且其會提供原則狀態的相關結果。

$complianceparms = @{
ResourceGroupName = $rg.ResourceGroupName
PolicyAssignmentName = 'audit-vm-managed-disks'
Filter = 'IsCompliant eq false'
}

Get-AzPolicyState @complianceparms

$complianceparms 變數會建立 Get-AzPolicyState 命令中使用的參數值。

  • ResourceGroupName 會從 $rg.ResourceGroupName 屬性中取得資源群組名稱。
  • PolicyAssignmentName 會指定建立原則指派時所使用的名稱。
  • Filter 會使用運算式來尋找不符合原則指派規範的資源。

您的結果類似下列範例,且 ComplianceState 顯示 NonCompliant

Timestamp                : 2/20/2024 18:55:45
ResourceId               : /subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/microsoft.compute/virtualmachines/{vmId}
PolicyAssignmentId       : /subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/microsoft.authorization/policyassignments/audit-vm-managed-disks
PolicyDefinitionId       : /providers/microsoft.authorization/policydefinitions/06a78e20-9358-41c9-923c-fb736d382a4d
IsCompliant              : False
SubscriptionId           : {subscriptionId}
ResourceType             : Microsoft.Compute/virtualMachines
ResourceLocation         : {location}
ResourceGroup            : {resourceGroupName}
ResourceTags             : tbd
PolicyAssignmentName     : audit-vm-managed-disks
PolicyAssignmentOwner    : tbd
PolicyAssignmentScope    : /subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}
PolicyDefinitionName     : 06a78e20-9358-41c9-923c-fb736d382a4d
PolicyDefinitionAction   : audit
PolicyDefinitionCategory : tbd
ManagementGroupIds       : {managementGroupId}
ComplianceState          : NonCompliant
AdditionalProperties     : {[complianceReasonCode, ]}

如需詳細資訊,請移至 Get-AzPolicyState

清除資源

Remove-AzPolicyAssignment -Name 'audit-vm-managed-disks' -Scope $rg.ResourceId

若要登出您的 Azure PowerShell 工作階段:

Disconnect-AzAccount

下一步

在這個快速入門中,您指派原則定義以識別 Azure 環境中的不相容資源。

若要深入了解如何指派驗證資源合規性的原則,請繼續進行教學課程。