Compartir por


Creación de una asignación de directiva para identificar recursos no compatibles mediante un archivo Bicep

En este inicio rápido, usará un archivo de Bicep para crear una asignación de directiva que valide el cumplimiento de los recursos 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.

Bicep es un lenguaje específico de dominio (DSL) que usa una sintaxis declarativa para implementar recursos de Azure. Brinda sintaxis concisa, seguridad de tipos confiable y compatibilidad con la reutilización de código. Bicep ofrece la mejor experiencia de creación para sus soluciones de infraestructura como código en Azure.

Al asignar una definición de iniciativa o directiva integrada, es opcional hacer referencia a una versión. Las asignaciones de directivas de definiciones integradas de forma predeterminada a la versión más reciente y heredan automáticamente los cambios de versión secundaria a menos que se especifique lo contrario.

Requisitos previos

Revisión del archivo de Bicep

El archivo de Bicep 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 el siguiente archivo de Bicep como policy-assignment.bicep.

  1. Abra Visual Studio Code y seleccione Archivo>Nuevo archivo.
  2. Copie y pegue el archivo de Bicep en Visual Studio Code.
  3. Seleccione Archivo>Guardar y use el nombre de archivo 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

El tipo de recurso definido en el archivo de Bicep 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 Bicep:

Implementación del archivo de Bicep

Puede implementar el archivo de Bicep 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.bicep'
}

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 del archivo de Bicep 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/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, ]}

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.