Inicio rápido: Creación de una asignación de directiva para identificar recursos no compatibles mediante la plantilla de ARM

En este inicio rápido, usará una plantilla de Azure Resource Manager (plantilla de ARM) para crear una asignación de directiva que valide el cumplimiento del recurso con una directiva de Azure. La directiva se asigna a un grupo de recursos y audita las máquinas virtuales que no utilizan discos administrados. Después de crear la asignación de directiva, identifique las máquinas virtuales no compatibles.

Una plantilla de Azure Resource Manager es un archivo de notación de objetos JavaScript (JSON) que define tanto la infraestructura como la configuración de un proyecto. La plantilla usa sintaxis declarativa. Se describe la implementación deseada sin escribir la secuencia de comandos de programación para crear la implementación.

Si su entorno cumple los requisitos previos y está familiarizado con el uso de plantillas de Resource Manager, seleccione el botón Implementar en Azure. La plantilla se abre en Azure Portal.

Captura de pantalla del botón Implementar en Azure para asignar una directiva con una plantilla de Azure Resource Manager.

Requisitos previos

Revisión de la plantilla

La plantilla de ARM crea una asignación de directiva para un ámbito de grupo de recursos y asigna la definición de directiva integrada Auditar máquinas virtuales que no usan discos administrados.

Cree la siguiente plantilla de ARM como policy-assignment.json.

  1. Abra Visual Studio Code y seleccione Archivo>Nuevo archivo.
  2. Copie y pegue la plantilla de ARM en Visual Studio Code.
  3. Seleccione Archivo>Guardar y use el nombre de archivo 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'))]"
    }
  }
}

El tipo de recurso definido en la plantilla de ARM es Microsoft.Authorization/policyAssignments.

La plantilla usa tres parámetros para implementar la asignación de directiva:

  • policyAssignmentName crea la asignación de directiva denominada audit-vm-managed-disks.
  • policyDefinitionID usa el identificador de la definición de directiva integrada. Como referencia, los comandos para obtener el identificador se encuentran en la sección para implementar la plantilla.
  • policyDisplayName crea un nombre para mostrar que está visible en Azure Portal.

Para obtener más información sobre los archivos de plantilla de ARM:

Implementación de la plantilla de ARM

Puede implementar la plantilla de ARM con Azure PowerShell o la CLI de Azure.

Desde una sesión de terminal de Visual Studio Code, conéctese a Azure. Si tiene más de una suscripción, ejecute los comandos para establecer el contexto en la suscripción. Reemplace <subscriptionID> con la identificación de su suscripción de Azure.

Connect-AzAccount

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

Puede comprobar si Microsoft.PolicyInsights está registrado. Si no es así, puede ejecutar un comando para registrar el proveedor de recursos.

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

Register-AzResourceProvider -ProviderNamespace 'Microsoft.PolicyInsights'

Para obtener más información, vaya a Get-AzResourceProvider y Register-AzResourceProvider.

Los siguientes comandos muestran el valor del parámetro policyDefinitionID:

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

Los siguientes comandos implementan la definición de directiva en el grupo de recursos. Reemplace <resourceGroupName> por el nombre del grupo de recursos:

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

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

New-AzResourceGroupDeployment @deployparms

La variable $rg almacena las propiedades del grupo de recursos. La variable $deployparms usa la expansión para crear valores de parámetro y mejorar la legibilidad. El comando New-AzResourceGroupDeployment usa los valores de parámetro definidos en la variable $deployparms.

  • Name es el nombre de implementación que se muestra en la salida y en Azure para las implementaciones del grupo de recursos.
  • ResourceGroupName usa la propiedad $rg.ResourceGroupName para obtener el nombre del grupo de recursos donde se asigna la directiva.
  • TemplateFile especifica el nombre y la ubicación de la plantilla de ARM en el equipo local.

Puede comprobar la implementación de la asignación de directivas con el comando siguiente:

El comando usa la propiedad $rg.ResourceId para obtener el id. del grupo de recursos.

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

Para obtener más información, vaya a Get-AzPolicyAssignment.

Identificación de recursos sin compatibilidad

Una vez implementada la asignación de directiva, las máquinas virtuales que se implementan en el grupo de recursos se auditan para cumplir la directiva de disco administrado.

El estado de cumplimiento de una nueva asignación de directiva tarda unos minutos en activarse y proporcionar resultados sobre el estado de la directiva.

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

Get-AzPolicyState @complianceparms

La variable $complianceparms crea valores de parámetro que se usan en el comando Get-AzPolicyState.

  • ResourceGroupName obtiene el nombre del grupo de recursos de la propiedad $rg.ResourceGroupName.
  • PolicyAssignmentName especifica el nombre utilizado cuando se creó la asignación de directiva.
  • Filter usa una expresión para buscar recursos que no son compatibles con la asignación de directiva.

Los resultados deben tener una apariencia similar al ejemplo siguiente y ComplianceState muestra 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, ]}

Para más información, consulte Get-AzPolicyState.

Limpieza de recursos

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

Para cerrar la sesión de Azure PowerShell:

Disconnect-AzAccount

Pasos siguientes

En este inicio rápido, se asigna una definición de directiva para identificar los recursos incompatibles en el entorno de Azure.

Para obtener más información sobre cómo asignar directivas que validen el cumplimiento de los recursos, continúe con el tutorial.