分享方式:


快速入門:使用 ARM 範本建立原則指派以識別不相容資源

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

Azure Resource Manager 範本是一個 JavaScript 物件標記法 (JSON) 檔案,會定義專案的基礎結構和設定。 範本使用宣告式語法。 您可以描述預期的部署,而不需要撰寫程式設計命令順序來建立部署。

如果您的環境符合必要條件,而且您很熟悉 ARM 範本,請選取 [部署至 Azure] 按鈕。 範本會在 Azure 入口網站中開啟。

使用 Azure Resource Manager 範本指派原則的 [部署至 Azure] 按鈕的螢幕擷取畫面。

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

必要條件

檢閱範本

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

建立下列 ARM 範本作為 policy-assignment.json

  1. 開啟 Visual Studio Code,並選取 [檔案]>[新增文字檔]
  2. 複製 ARM 範本並將其貼入 Visual Studio Code 中。
  3. 選取 [檔案]>[儲存],並使用檔案名稱 policy-assignment.json
{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "policyAssignmentName": {
      "type": "string",
      "defaultValue": "audit-vm-managed-disks",
      "metadata": {
        "description": "Policy assignment name used in assignment's resource ID"
      }
    },
    "policyDefinitionID": {
      "type": "string",
      "defaultValue": "/providers/Microsoft.Authorization/policyDefinitions/06a78e20-9358-41c9-923c-fb736d382a4d",
      "metadata": {
        "description": "Policy definition ID"
      }
    },
    "policyDisplayName": {
      "type": "string",
      "defaultValue": "Audit VM managed disks",
      "metadata": {
        "description": "Display name for Azure portal"
      }
    }
  },
  "resources": [
    {
      "type": "Microsoft.Authorization/policyAssignments",
      "apiVersion": "2023-04-01",
      "name": "[parameters('policyAssignmentName')]",
      "properties": {
        "policyDefinitionId": "[parameters('policyDefinitionID')]",
        "description": "Policy assignment to resource group scope created with ARM template",
        "displayName": "[parameters('policyDisplayName')]",
        "nonComplianceMessages": [
          {
            "message": "Virtual machines should use managed disks"
          }
        ]
      }
    }
  ],
  "outputs": {
    "assignmentId": {
      "type": "string",
      "value": "[resourceId('Microsoft.Authorization/policyAssignments', parameters('policyAssignmentName'))]"
    }
  }
}

ARM 範本中定義的資源類型為 Microsoft.Authorization/policyAssignments

範本會使用三個參數來部署原則指派:

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

如需 ARM 範本檔案的詳細資訊:

  • 若要尋找更多的 ARM 範本範例,請移至 [瀏覽程式碼範例]
  • 若要深入了解部署的範本參考,請移至 Azure 範本參考
  • 若要了解如何開發 ARM 範本,請移至 [ARM 範本文件]
  • 若要了解訂用帳戶層級部署,請移至 [使用 ARM 範本進行訂用帳戶部署]

部署 ARM 範本

使用 Azure PowerShell 或 Azure CLI 部署 ARM 範本。

從 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.json'
}

New-AzResourceGroupDeployment @deployparms

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

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

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

此命令會使用 $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/26/2024 19:02:56
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 環境中的不相容資源。

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