Snabbstart: Skapa en principtilldelning för att identifiera icke-kompatibla resurser med hjälp av ARM-mall

I den här snabbstarten använder du en Azure Resource Manager-mall (ARM-mall) för att skapa en principtilldelning som validerar resursens efterlevnad med en Azure-princip. Principen tilldelas till en resursgrupp och granskar virtuella datorer som inte använder hanterade diskar. När du har skapat principtilldelningen identifierar du icke-kompatibla virtuella datorer.

En Azure Resource Manager-mall är en JSON-fil (JavaScript Object Notation) som definierar infrastrukturen och konfigurationen för projektet. Mallen använder deklarativ syntax. Du beskriver den avsedda distributionen utan att skriva sekvensen med programmeringskommandon för att skapa distributionen.

Om din miljö uppfyller förhandskraven och du är van att använda ARM-mallar väljer du knappen Distribuera till Azure. Mallen öppnas i Azure-portalen.

Skärmbild av knappen Distribuera till Azure för att tilldela en princip med en Azure Resource Manager-mall.

Förutsättningar

  • Om du inte har något Azure-konto skapar du ett kostnadsfritt konto innan du börjar.
  • Azure PowerShell eller Azure CLI.
  • Visual Studio Code och Arm-verktygen (Azure Resource Manager).
  • Microsoft.PolicyInsights måste vara registrerad i din Azure-prenumeration. Om du vill registrera en resursprovider måste du ha behörighet att registrera resursprovidrar. Behörigheten ingår i rollerna Deltagare och Ägare.
  • En resursgrupp med minst en virtuell dator som inte använder hanterade diskar.

Granska mallen

ARM-mallen skapar en principtilldelning för ett resursgruppsomfång och tilldelar den inbyggda principdefinitionen Granska virtuella datorer som inte använder hanterade diskar.

Skapa följande ARM-mall som policy-assignment.json.

  1. Öppna Visual Studio Code och välj Fil>Ny textfil.
  2. Kopiera och klistra in ARM-mallen i Visual Studio Code.
  3. Välj Spara fil>och använd filnamnet 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'))]"
    }
  }
}

Resurstypen som definieras i ARM-mallen är Microsoft.Authorization/policyAssignments.

Mallen använder tre parametrar för att distribuera principtilldelningen:

  • policyAssignmentName skapar principtilldelningen med namnet audit-vm-managed-disks.
  • policyDefinitionID använder ID:t för den inbyggda principdefinitionen. Som referens finns kommandona för att hämta ID:t i avsnittet för att distribuera mallen.
  • policyDisplayName skapar ett visningsnamn som visas i Azure-portalen.

Mer information om ARM-mallfiler:

Distribuera ARM-mallen

Du kan distribuera ARM-mallen med Azure PowerShell eller Azure CLI.

Anslut till Azure från en terminalsession i Visual Studio Code. Om du har fler än en prenumeration kör du kommandona för att ange kontext till din prenumeration. Ersätt <subscriptionID> med ditt Azure-prenumerations-ID.

Connect-AzAccount

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

Du kan kontrollera om Microsoft.PolicyInsights det är registrerat. Om det inte är det kan du köra ett kommando för att registrera resursprovidern.

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

Register-AzResourceProvider -ProviderNamespace 'Microsoft.PolicyInsights'

Mer information finns i Get-AzResourceProvider och Register-AzResourceProvider.

Följande kommandon visar policyDefinitionID parameterns värde:

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

Följande kommandon distribuerar principdefinitionen till resursgruppen. Ersätt <resourceGroupName> med resursgruppens namn:

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

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

New-AzResourceGroupDeployment @deployparms

Variabeln $rg lagrar egenskaper för resursgruppen. Variabeln $deployparms använder splatting för att skapa parametervärden och förbättra läsbarheten. Kommandot New-AzResourceGroupDeployment använder parametervärdena som definierats i variabeln $deployparms .

  • Name är distributionsnamnet som visas i utdata och i Azure för resursgruppens distributioner.
  • ResourceGroupName använder egenskapen $rg.ResourceGroupName för att hämta namnet på resursgruppen där principen har tilldelats.
  • TemplateFile anger ARM-mallens namn och plats på den lokala datorn.

Du kan verifiera principtilldelningens distribution med följande kommando:

Kommandot använder $rg.ResourceId egenskapen för att hämta resursgruppens ID.

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

Mer information finns i Get-AzPolicyAssignment.

Identifiera icke-kompatibla resurser

När principtilldelningen har distribuerats granskas virtuella datorer som distribueras till resursgruppen för kompatibilitet med principen för hanterade diskar.

Efterlevnadstillståndet för en ny principtilldelning tar några minuter att bli aktiv och ge resultat om principens tillstånd.

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

Get-AzPolicyState @complianceparms

Variabeln $complianceparms skapar parametervärden som används i Get-AzPolicyState kommandot.

  • ResourceGroupName hämtar resursgruppens namn från egenskapen $rg.ResourceGroupName .
  • PolicyAssignmentName anger namnet som användes när principtilldelningen skapades.
  • Filter använder ett uttryck för att hitta resurser som inte är kompatibla med principtilldelningen.

Dina resultat liknar följande exempel och ComplianceState visar 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, ]}

Mer information finns i Get-AzPolicyState.

Rensa resurser

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

Logga ut från Azure PowerShell-sessionen:

Disconnect-AzAccount

Nästa steg

I den här snabbstarten har du tilldelat en principdefinition för att identifiera icke-kompatibla resurser i Azure-miljön.

Om du vill veta mer om hur du tilldelar principer som validerar resursefterlevnad fortsätter du till självstudien.