Compartir a través de


Efecto Modify de las definiciones de Azure Policy

El efecto modify se usa para agregar, actualizar o quitar propiedades o etiquetas de una suscripción o un recurso durante la creación o la actualización. Los recursos no conformes existentes también se pueden solucionar con una tarea de corrección. Las asignaciones de directivas con efecto establecido como Modify requieren una identidad administrada para realizar la corrección. Un ejemplo común que usa el efecto modify es actualizar etiquetas en recursos como "costCenter".

Hay algunos matices en el comportamiento de modificación de las propiedades de los recursos. Obtenga más información sobre los escenarios en los que se omite la modificación.

Una sola regla de modify puede tener cualquier número de operaciones. Las operaciones compatibles son:

  • Agregar, reemplazar o quitar etiquetas de recursos. Solo se pueden quitar etiquetas. En el caso de las etiquetas, una directiva Modify siempre debe tener el elemento mode establecido en indexed a menos que el recurso de destino sea un grupo de recursos.
  • Agregar o reemplazar el valor del tipo de identidad administrada (identity.type) de las máquinas virtuales y los conjuntos de escalado de máquinas virtuales. Solo puede modificar identity.type para máquinas virtuales o Virtual Machine Scale Sets.
  • Agregar o reemplazar los valores de determinados alias.
    • Use Get-AzPolicyAlias | Select-Object -ExpandProperty 'Aliases' | Where-Object { $_.DefaultMetadata.Attributes -eq 'Modifiable' } en Azure PowerShell 4.6.0 o posterior para obtener una lista de los alias que se pueden usar con modify.

Importante

Si está administrando etiquetas, se recomienda usar Modify en lugar de Append, ya que Modify proporciona más tipos de operaciones y la posibilidad de corregir los recursos existentes. Sin embargo, se recomienda Append si no puede crear una identidad administrada o Modify no es compatible todavía con el alias de la propiedad del recurso.

Evaluación de Modify

Modify se evalúa antes de que un proveedor de recursos procese la solicitud durante la creación o actualización de un recurso. Las operaciones modify se aplican al contenido de la solicitud cuando se cumple la condición if de la regla de la directiva. Cada operación modify puede especificar una condición que determina cuándo se aplica.

Cuando se especifica un alias, se realizan más comprobaciones para garantizar que la operación modify no cambie el contenido de la solicitud de tal forma que el proveedor de recursos la rechace:

  • La propiedad a la que se asigna el alias se marca como Modificable en la versión de API de la solicitud.
  • El tipo de token de la operación modify coincide con el tipo de token esperado para la propiedad en la versión de API de la solicitud.

Si se produce un error en cualquiera de estas comprobaciones, la evaluación de la directiva recurre al valor conflictEffect especificado.

Importante

Se recomienda que las definiciones de Modify que incluyen alias usen el efecto de conflicto de auditoría para evitar errores en las solicitudes con versiones de API en las que la propiedad asignada no es "modificable". Si el mismo alias se comporta de manera diferente con cada versión de API, se pueden usar operaciones Modify condicionales para determinar la operación modify usada para cada versión de API.

Modificación omitida

Hay algunos casos en los que se omiten las operaciones de modificación durante la evaluación:

  • Recursos existentes: cuando una definición de directiva que usa el efecto modify se ejecuta como parte de un ciclo de evaluación, no realiza cambios en los recursos que ya existen. En su lugar, marca cualquier recurso que cumpla la condición if como no compatible, por lo que se pueden corregir mediante una tarea de corrección.
  • No aplicable: cuando se evalúa la condición de una operación en la matriz de operations como false, se omite esa operación determinada.
  • Propiedad no modificable: si un alias especificado para una operación no se puede modificar en la versión de la API de la solicitud, la evaluación usa el efecto de conflicto. Si el efecto de conflicto se establece en deny, la solicitud se bloquea. Si el efecto de conflicto se establece en audit, se permite que pase la solicitud, pero se omite la operación de modify.
  • Propiedad no presente: si una propiedad no está presente en la carga de recursos de la solicitud, se puede omitir la modificación. En algunos casos, las propiedades modificables se anidan dentro de otras propiedades y tienen un alias como Microsoft.Storage/storageAccounts/blobServices/deleteRetentionPolicy.enabled. Si la propiedad "principal", en este caso deleteRetentionPolicy, no está presente en la solicitud, se omite la modificación porque se supone que esa propiedad se omite intencionadamente. Para obtener un ejemplo práctico, vaya a la sección Ejemplo de propiedad no presente.
  • Operación de identidad que no sea máquina virtual o VMSS: cuando una operación de modificación intenta agregar o reemplazar el campo identity.type en un recurso distinto de una máquina virtual o un conjunto de escalado de máquinas virtuales, la evaluación de directivas se omite por completo para que no se realice la modificación. En este caso, el recurso se considera no aplicable a la directiva.

Ejemplo de propiedad no presente

La modificación de las propiedades de recursos depende de la solicitud de API y de la carga de recursos actualizada. La carga puede depender del cliente usado, como Azure Portal, y otros factores, como el proveedor de recursos.

Imagine que aplica una directiva que modifica las etiquetas en una máquina virtual (VM). Cada vez que se actualiza la máquina virtual, como durante el cambio de tamaño o de disco, las etiquetas se actualizan según corresponda, independientemente del contenido de la carga de la máquina virtual. Esto se debe a que las etiquetas son independientes de las propiedades de la máquina virtual.

Sin embargo, si aplica una directiva que modifica las propiedades de una máquina virtual, la modificación depende de la carga del recurso. Si intenta modificar las propiedades que no están incluidas en la carga de actualización, la modificación no tendrá lugar. Por ejemplo, esto puede ocurrir al aplicar revisiones a la propiedad assessmentMode de una máquina virtual (alias Microsoft.Compute/virtualMachines/osProfile.windowsConfiguration.patchSettings.assessmentMode). La propiedad está "anidada", por lo que si sus propiedades primarias no se incluyen en la solicitud, se supone que esta omisión es intencionada y se omite la modificación. Para que se realice la modificación, la carga del recurso debe contener este contexto.

Propiedades de Modify

La propiedad details del efecto modify tiene todas las subpropiedades que definen los permisos necesarios para la corrección y las propiedades operations que se usan para agregar, actualizar o quitar valores de etiqueta.

  • roleDefinitionIds (obligatorio)
  • conflictEffect (opcional)
    • Determina qué definición de directiva "gana" si más de una modifica la misma propiedad o cuando la operación modify no funciona en el alias especificado.
      • En el caso de los recursos nuevos o actualizados, la definición de la directiva con deny tiene prioridad. Las definiciones de directivas con audit omiten todas las operations. Si más de una definición de directiva tiene el efecto deny, la solicitud se deniega como conflicto. Si todas las definiciones de directiva tienen audit, no se procesa ninguna de las operations de las definiciones de directiva en conflicto.
      • En el caso de los recursos existentes, si hay más de una definición de directiva que tenga el efecto deny, el estado de cumplimiento es Conflict. Si una o varias definiciones de directivas tienen el efecto deny, cada asignación devuelve un estado de cumplimiento de Non-compliant.
    • Valores disponibles: audit, deny, disabled.
    • El valor predeterminado es deny.
  • operations (obligatorio)
    • Una matriz de todas las operaciones de etiqueta que se van a llevar a cabo en los recursos coincidentes.
    • Propiedades:
      • operation (obligatorio)
        • Define qué acción se va a realizar en un recurso coincidente. Las opciones son: addOrReplace, Add y Remove.
        • Add se comporta de forma similar al efecto append.
        • Remove solo se admite para las etiquetas de recursos.
      • field (obligatorio)
        • La etiqueta que se va a agregar, reemplazar o quitar. Los nombres de etiqueta deben seguir la misma convención de nomenclatura que otros campos.
      • value (opcional)
        • Valor en el que se va a establecer la etiqueta.
        • Esta propiedad es necesaria si operation es addOrReplace o Add.
      • condition (opcional)
        • Una cadena que contiene una expresión de lenguaje de Azure Policy con funciones de directiva que se evalúa como true o false.
        • No admite las siguientes funciones de directiva: field(), resourceGroup(), subscription().

Operaciones de Modify

La matriz de propiedades operations permite modificar varias etiquetas de maneras diferentes a partir de una única definición de directiva. Cada operación se compone de propiedades operation, field y value. operation determina qué hace la tarea de corrección en las etiquetas, field determina qué etiqueta se modifica y value define el nuevo valor de la etiqueta. En el ejemplo siguiente se realizan los siguientes cambios en las etiquetas:

  • Se establece la etiqueta environment en "Test", incluso si ya existe con otro valor.
  • Se quita la etiqueta TempResource.
  • Se establece la etiqueta Dept en el parámetro de directiva DeptName configurado en la asignación de directiva.
"details": {
  ...
  "operations": [
    {
      "operation": "addOrReplace",
      "field": "tags['environment']",
      "value": "Test"
    },
    {
      "operation": "Remove",
      "field": "tags['TempResource']",
    },
    {
      "operation": "addOrReplace",
      "field": "tags['Dept']",
      "value": "[parameters('DeptName')]"
    }
  ]
}

La propiedad operation tiene las opciones siguientes:

Operación Descripción
addOrReplace Agrega la propiedad o la etiqueta definidas y el valor al recurso, incluso si estas ya existen con un valor diferente.
add Agrega la propiedad o la etiqueta definidas y el valor al recurso.
remove Quita la etiqueta definida del recurso. Solo se admite para las etiquetas.

Ejemplos de Modify

Ejemplo 1: se agrega la etiqueta environment y se reemplazan las etiquetas environment existentes por "Test":

"then": {
  "effect": "modify",
  "details": {
    "roleDefinitionIds": [
      "/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c"
    ],
    "operations": [
      {
        "operation": "addOrReplace",
        "field": "tags['environment']",
        "value": "Test"
      }
    ]
  }
}

Ejemplo 2: se quita la etiqueta env y se agrega la etiqueta environment o se reemplazan las etiquetas environment existentes por un valor parametrizado:

"then": {
  "effect": "modify",
  "details": {
    "roleDefinitionIds": [
      "/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c"
    ],
    "conflictEffect": "deny",
    "operations": [
      {
        "operation": "Remove",
        "field": "tags['env']"
      },
      {
        "operation": "addOrReplace",
        "field": "tags['environment']",
        "value": "[parameters('tagValue')]"
      }
    ]
  }
}

Ejemplo 3: asegúrese de que una cuenta de almacenamiento no permita el acceso público a los blobs; la operación modify solo se aplica cuando se evalúan solicitudes con una versión de API mayor o igual que 2019-04-01:

"then": {
  "effect": "modify",
  "details": {
    "roleDefinitionIds": [
      "/providers/microsoft.authorization/roleDefinitions/17d1049b-9a84-46fb-8f53-869881c3d3ab"
    ],
    "conflictEffect": "audit",
    "operations": [
      {
        "condition": "[greaterOrEquals(requestContext().apiVersion, '2019-04-01')]",
        "operation": "addOrReplace",
        "field": "Microsoft.Storage/storageAccounts/allowBlobPublicAccess",
        "value": false
      }
    ]
  }
}

Pasos siguientes