Bloqueo de los recursos para proteger la infraestructura

Como administrador, puede bloquear una suscripción, un grupo de recursos o un recurso de Azure para protegerlos de eliminaciones y modificaciones accidentales del usuario. El bloqueo invalida los permisos que el usuario pueda tener.

Puede establecer bloqueos que impidan eliminaciones o modificaciones. En el portal, estos bloqueos se denominan Eliminar y Solo lectura. En la línea de comandos, estos bloqueos se denominan CanNotDelete y ReadOnly.

  • CanNotDelete significa que los usuarios autorizados pueden leer y modificar un recurso, pero no eliminarlo.
  • ReadOnly significa que los usuarios autorizados solo pueden leer un recurso, pero no actualizarlo ni eliminarlo. Aplicar este bloqueo es similar a restringir todos los usuarios autorizados a los permisos que proporciona el rol Lector.

Al diferencia del control de acceso basado en rol (RBAC), los bloqueos de administración se usan para aplicar una restricción a todos los usuarios y roles. Para obtener información sobre cómo establecer permisos para usuarios y roles, vea Azure RBAC.

Bloqueo de la herencia

Cuando se aplica un bloqueo en un ámbito primario, todos los recursos heredan el mismo bloqueo. Incluso los recursos que agregue posteriormente heredan el mismo bloqueo del elemento primario. El bloqueo más restrictivo de toda la herencia tiene prioridad.

Los recursos de extensión heredan bloqueos del recurso al que se aplican. Por ejemplo, Microsoft.Insights/diagnosticSettings es un tipo de recurso de extensión. Si aplica una configuración de diagnóstico a un blob de almacenamiento y bloquea la cuenta de almacenamiento, no podrá eliminar la configuración de diagnóstico. Esta herencia tiene sentido porque el identificador de recurso completo de la configuración de diagnóstico es:

/subscriptions/{sub-id}/resourceGroups/{rg-name}/providers/Microsoft.Storage/storageAccounts/{storage-name}/blobServices/default/providers/microsoft.insights/diagnosticSettings/{setting-name}"

Que coincide con el ámbito del identificador de recurso del recurso que está bloqueado:

/subscriptions/{sub-id}/resourceGroups/{rg-name}/providers/Microsoft.Storage/storageAccounts/{storage-name}

Si tiene un bloqueo Eliminar en un recurso e intenta eliminar su grupo de recursos, la característica bloquea toda la operación de eliminación. Incluso si el grupo de recursos u otros recursos del grupo de recursos están desbloqueados, no se produce la eliminación. Nunca tiene una eliminación parcial.

Al cancelar una suscripción de Azure:

  • Un bloqueo de recursos no bloquea la cancelación de la suscripción.
  • Azure conserva los recursos desactivándolos en lugar de eliminarlos inmediatamente.
  • Azure solo elimina los recursos de forma permanente después de un período de espera.

Descripción del ámbito de los bloqueos

Nota

Los bloqueos solo se aplican a las operaciones de Azure del plano de control y no a las operaciones del plano de datos.

Las operaciones del plano de control de Azure van a https://management.azure.com. Las operaciones del plano de datos de Azure van a la instancia de servicio, como https://myaccount.blob.core.windows.net/. Consulte Plano de control y plano de datos de Azure. Para saber qué operaciones usan la dirección URL del plano de control, consulte API REST de Azure.

La distinción significa que los bloqueos protegen un recurso de los cambios, pero no restringen el modo en que un recurso realiza sus funciones. Un bloqueo ReadOnly, por ejemplo, en un servidor lógico SQL Database, lo protege de eliminaciones o modificaciones. Permite crear, actualizar o eliminar datos en la base de datos del servidor. Las operaciones del plano de datos permiten transacciones de datos. Estas solicitudes no van a https://management.azure.com.

Consideraciones antes de aplicar bloqueos

La aplicación de bloqueos puede dar lugar a resultados inesperados. Algunas operaciones, que no parecen modificar un recurso, requieren acciones bloqueadas. Los bloqueos impiden que el método POST envíe datos a la API de Azure Resource Manager (ARM). Algunos ejemplos comunes de operaciones bloqueadas son:

  • Un bloqueo de solo lectura en una cuenta de almacenamiento impide que todos los usuarios muestren las claves de cuenta. Una solicitud POST controla la operación Enumerar claves de Azure Storage para proteger el acceso a las claves de cuenta. Las claves de cuenta proporcionan acceso completo a los datos de la cuenta de almacenamiento. Cuando se configura un bloqueo de solo lectura para una cuenta de almacenamiento, los usuarios que no tienen las claves de cuenta deben usar las credenciales de Microsoft Entra para acceder a los datos de blobs o de colas. Un bloqueo de solo lectura también impide la asignación de roles de RBAC de Azure del ámbito a la cuenta de almacenamiento o a un contenedor de datos (contenedor de blobs o colas).

  • Un bloqueo de solo lectura en una cuenta de almacenamiento protege las asignaciones de RBAC cuyo ámbito es una cuenta de almacenamiento o un contenedor de datos (contenedor de blobs o cola).

  • Un bloqueo de solo lectura en una cuenta de almacenamiento impide la creación de un contenedor de blobs.

  • Un bloqueo de solo lectura o de no se puede eliminar en una cuenta de almacenamiento no impide que sus datos se eliminen o modifiquen. Tampoco protege los datos de un blob, una cola, una tabla o un archivo.

  • La API de la cuenta de almacenamiento expone las operaciones del plano de datos y del plano de control. Si una solicitud usa operaciones de plano de datos, el bloqueo de la cuenta de almacenamiento no protege los datos de blob, cola, tabla o archivo que contiene. Pero si la solicitud usa operaciones de plano de control, el bloqueo protege esos recursos.

    Por ejemplo, si una solicitud usa Recursos compartidos de archivos: Eliminar, que es una operación de plano de control, la eliminación da error. Por ejemplo, si una solicitud usa Eliminar recurso compartido, que es una operación de plano de control, se deniega la eliminación. Se recomienda usar una operación del plano de control.

  • Un bloqueo de solo lectura en un grupo de seguridad de red (NSG) impide la creación del registro de flujo NSG correspondiente. Un bloqueo de no eliminación en un grupo de seguridad de red (NSG) no impide la creación o modificación del registro de flujo NSG correspondiente.

  • Un bloqueo de solo lectura en un recurso de App Service evita que el Explorador de servidores de Visual Studio muestre los archivos del recurso, ya que esa interacción requiere acceso de escritura.

  • Un bloqueo de solo lectura en un grupo de recursos que contiene un plan de App Service le impide escalar horizontal o verticalmente el plan.

  • Un bloqueo de solo lectura en un grupo de recursos que contiene una máquina virtual impide que todos los usuarios inicien o reinicien la máquina virtual. Estas operaciones requieren una solicitud de método POST.

  • Un bloqueo de solo lectura en un grupo de recursos impide mover los recursos existentes dentro o fuera del grupo de recursos.

  • Un bloqueo de solo lectura en un grupo de recursos que contiene una cuenta de automatización evita que se inicien todos los runbooks. Estas operaciones requieren una solicitud de método POST.

  • Un bloqueo de no eliminación en un recurso o grupo de recursos impide la eliminación de asignaciones de RBAC de Azure.

  • Un bloqueo que no se puede eliminar en un grupo de recursos impide que Azure Resource Manager elimine de forma automática las implementaciones en el historial. Si alcanza 800 implementaciones en el historial, se produce un error en las implementaciones.

  • Un bloqueo de no se puede eliminar en el grupo de recursos creado por el Servicio Azure Backup genera un error en las copias de seguridad. El servicio admite un máximo de 18 puntos de restauración. Cuando está bloqueado, el servicio de copia de seguridad no puede limpiar los puntos de restauración. Para más información, consulte Preguntas más frecuentes sobre la copia de seguridad de máquinas virtuales de Azure.

  • Un bloqueo que impide la eliminación en un grupo de recursos que contiene áreas de trabajo de Azure Machine Learning impide que el escalado automático de clústeres de proceso de Azure Machine Learning funcione correctamente. Con el bloqueo, el escalado automático no puede quitar nodos sin usar. La solución consume más recursos de los necesarios para la carga de trabajo.

  • Un bloqueo de solo lectura en un área de trabajo de Log Analytics impide que se habilite el análisis de comportamiento de usuarios y entidades (UEBA).

  • Un bloqueo de tipo "no se puede eliminar" en un área de trabajo de Log Analytics no impide operaciones de purga de datos. En su lugar, quite el rol de purga de datos del usuario.

  • Un bloqueo de solo lectura en una suscripción impide que Azure Advisor funcione correctamente. Advisor no puede almacenar los resultados de sus consultas.

  • Un bloqueo de solo lectura en una instancia de Application Gateway le impide obtener el estado de back-end de la puerta de enlace de aplicaciones. Esa operación usa un método POST, que bloquea un bloqueo de solo lectura.

  • Un bloqueo de solo lectura en un clúster de Azure Kubernetes Service (AKS) limita cómo puede acceder a los recursos del clúster a través del portal. Un bloqueo de solo lectura impide que use la sección de recursos de Kubernetes del clúster de AKS en Azure Portal para elegir un recurso de clúster. Estas operaciones requieren una solicitud de método POST para la autenticación.

  • Un bloqueo que no se puede eliminar, en una máquina virtual que está protegida por Site Recovery, evita que determinados vínculos de recursos relacionados con Site Recovery se eliminen correctamente al quitar la protección o deshabilitar la replicación. Si tiene previsto volver a proteger la VM más adelante, debe quitar el bloqueo antes de deshabilitar la protección. Si no quita el bloqueo, debe seguir unos pasos determinados para limpiar los vínculos obsoletos antes de proteger la VM. Para obtener más información, consulte Solución de problemas de replicación de VM de Azure.

Quién puede crear o eliminar bloqueos

Para crear o eliminar bloqueos de administración, debe tener acceso a las acciones Microsoft.Authorization/* o Microsoft.Authorization/locks/*. Los usuarios asignados a los roles Propietario y Administrador de acceso de usuario tienen el acceso necesario. Algunos roles integrados especializados también conceden este acceso. Puede crear un rol personalizado con los permisos necesarios.

Bloqueos y aplicaciones administradas

Algunos servicios de Azure, como Azure Databricks, utilizan aplicaciones administradas para implementar el servicio. En ese caso, el servicio crea dos grupos de recursos. Uno es un grupo de recursos desbloqueado que contiene información general del servicio. El otro es un grupo de recursos bloqueado que contiene la infraestructura de servicio.

Si intenta eliminar el grupo de recursos de infraestructura, obtendrá un error que indica que el grupo de recursos está bloqueado. Si intenta eliminar el bloqueo para el grupo de recursos de infraestructura, obtendrá un error que indica que el bloqueo no puede eliminarse porque pertenece a una aplicación del sistema.

En su lugar, elimine el servicio, lo que también elimina el grupo de recursos de infraestructura.

Para las aplicaciones administradas, elija el servicio implementado.

Screenshot of the Azure portal with an instance of Azure Databricks selected.

Tenga en cuenta que el servicio incluye un vínculo para un Grupo de recursos administrado. Ese grupo de recursos contiene la infraestructura y está bloqueado. Solo puede eliminarlo indirectamente.

Screenshot displaying the Managed Resource Group link in the Azure portal.

Para eliminar todo el contenido para el servicio, incluido el grupo de recursos de infraestructura bloqueado, seleccione Eliminar para el servicio.

Screenshot of the Azure portal with the Delete option for the selected service.

Configuración de bloqueos

Portal

En el panel de navegación izquierdo, el nombre de la característica de bloqueo de suscripción es Bloqueos de recursos, mientras que el nombre de la característica de bloqueo del grupo de recursos es Bloqueos.

  1. En la hoja Configuración del recurso, del grupo de recursos o de la suscripción que desea bloquear, seleccione Bloqueos.

    Select lock.

  2. Para agregar un bloqueo, seleccione Agregar. Si desea crear un bloqueo en un nivel primario, seleccione el elemento primario. El recurso seleccionado actualmente hereda el bloqueo del elemento primario. Por ejemplo, podría bloquear el grupo de recursos para aplicar un bloqueo a todos sus recursos.

    Add lock.

  3. Asigne al bloqueo un nombre y un nivel. Opcionalmente, puede agregar notas que describan el bloqueo.

    Set lock.

  4. Para eliminar el bloqueo, seleccione el botón Eliminar.

    Delete lock.

Plantilla

Al usar una plantilla de ARM o un archivo Bicep para implementar un bloqueo, es bueno comprender cómo funcionan conjuntamente el ámbito de implementación y el ámbito de bloqueo. Para aplicar un bloqueo en el ámbito de implementación, como el bloqueo de un grupo de recursos o una suscripción, no configure la propiedad de ámbito. Al bloquear un recurso dentro del ámbito de implementación, configure la propiedad de ámbito en el bloqueo.

La plantilla siguiente aplica un bloqueo al grupo de recursos. Observe que no hay una propiedad de ámbito en el recurso de bloqueo porque el ámbito del bloqueo coincide con el ámbito de implementación. Implemente esta plantilla en el nivel de grupo de recursos.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
  },
  "resources": [
    {
      "type": "Microsoft.Authorization/locks",
      "apiVersion": "2016-09-01",
      "name": "rgLock",
      "properties": {
        "level": "CanNotDelete",
        "notes": "Resource group should not be deleted."
      }
    }
  ]
}

Para crear un grupo de recursos y bloquearlo, implemente la plantilla siguiente en el nivel de suscripción.

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "rgName": {
      "type": "string"
    },
    "rgLocation": {
      "type": "string"
    }
  },
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Resources/resourceGroups",
      "apiVersion": "2021-04-01",
      "name": "[parameters('rgName')]",
      "location": "[parameters('rgLocation')]",
      "properties": {}
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "lockDeployment",
      "resourceGroup": "[parameters('rgName')]",
      "dependsOn": [
        "[resourceId('Microsoft.Resources/resourceGroups/', parameters('rgName'))]"
      ],
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "parameters": {},
          "variables": {},
          "resources": [
            {
              "type": "Microsoft.Authorization/locks",
              "apiVersion": "2016-09-01",
              "name": "rgLock",
              "properties": {
                "level": "CanNotDelete",
                "notes": "Resource group and its resources should not be deleted."
              }
            }
          ],
          "outputs": {}
        }
      }
    }
  ],
  "outputs": {}
}

Al aplicar un bloqueo a un recurso dentro del grupo de recursos, agregue la propiedad de ámbito. Configure el ámbito en el nombre del recurso que va a bloquear.

En el ejemplo siguiente se muestra una plantilla que crea un plan de App Service, un sitio web y un bloqueo en el sitio web. El ámbito del bloqueo se establece en el sitio web.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "hostingPlanName": {
      "type": "string"
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    }
  },
  "variables": {
    "siteName": "[concat('ExampleSite', uniqueString(resourceGroup().id))]"
  },
  "resources": [
    {
      "type": "Microsoft.Web/serverfarms",
      "apiVersion": "2020-12-01",
      "name": "[parameters('hostingPlanName')]",
      "location": "[parameters('location')]",
      "sku": {
        "tier": "Free",
        "name": "f1",
        "capacity": 0
      },
      "properties": {
        "targetWorkerCount": 1
      }
    },
    {
      "type": "Microsoft.Web/sites",
      "apiVersion": "2020-12-01",
      "name": "[variables('siteName')]",
      "location": "[parameters('location')]",
      "dependsOn": [
        "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]"
      ],
      "properties": {
        "serverFarmId": "[parameters('hostingPlanName')]"
      }
    },
    {
      "type": "Microsoft.Authorization/locks",
      "apiVersion": "2016-09-01",
      "name": "siteLock",
      "scope": "[concat('Microsoft.Web/sites/', variables('siteName'))]",
      "dependsOn": [
        "[resourceId('Microsoft.Web/sites', variables('siteName'))]"
      ],
      "properties": {
        "level": "CanNotDelete",
        "notes": "Site should not be deleted."
      }
    }
  ]
}

Azure PowerShell

Bloquee recursos implementados con Azure PowerShell mediante el comando New-AzResourceLock.

Para bloquear un recurso, proporcione el nombre del recurso, su tipo y el nombre del grupo de recursos.

New-AzResourceLock -LockLevel CanNotDelete -LockName LockSite -ResourceName examplesite -ResourceType Microsoft.Web/sites -ResourceGroupName exampleresourcegroup

Para bloquear un grupo de recursos, proporcione el nombre del grupo de recursos.

New-AzResourceLock -LockName LockGroup -LockLevel CanNotDelete -ResourceGroupName exampleresourcegroup

Para obtener información sobre un bloqueo, use Get-AzResourceLock. Para obtener todos los bloqueos en su suscripción, use:

Get-AzResourceLock

Para obtener todos los bloqueos para un recurso, use:

Get-AzResourceLock -ResourceName examplesite -ResourceType Microsoft.Web/sites -ResourceGroupName exampleresourcegroup

Para obtener todos los bloqueos para un grupo de recursos, use:

Get-AzResourceLock -ResourceGroupName exampleresourcegroup

Para eliminar un bloqueo de un recurso, use:

$lockId = (Get-AzResourceLock -ResourceGroupName exampleresourcegroup -ResourceName examplesite -ResourceType Microsoft.Web/sites).LockId
Remove-AzResourceLock -LockId $lockId

Para eliminar un bloqueo de un grupo de recursos, use:

$lockId = (Get-AzResourceLock -ResourceGroupName exampleresourcegroup).LockId
Remove-AzResourceLock -LockId $lockId

Azure CLI

Bloquee recursos implementados con la CLI de Azure mediante el comando az lock create.

Para bloquear un recurso, proporcione el nombre del recurso, su tipo y el nombre del grupo de recursos.

az lock create --name LockSite --lock-type CanNotDelete --resource-group exampleresourcegroup --resource-name examplesite --resource-type Microsoft.Web/sites

Para bloquear un grupo de recursos, proporcione el nombre del grupo de recursos.

az lock create --name LockGroup --lock-type CanNotDelete --resource-group exampleresourcegroup

Para obtener información sobre un bloqueo, use az lock list. Para obtener todos los bloqueos en su suscripción, use:

az lock list

Para obtener todos los bloqueos para un recurso, use:

az lock list --resource-group exampleresourcegroup --resource-name examplesite --namespace Microsoft.Web --resource-type sites --parent ""

Para obtener todos los bloqueos para un grupo de recursos, use:

az lock list --resource-group exampleresourcegroup

Para eliminar un bloqueo de un recurso, use:

lockid=$(az lock show --name LockSite --resource-group exampleresourcegroup --resource-type Microsoft.Web/sites --resource-name examplesite --output tsv --query id)
az lock delete --ids $lockid

Para eliminar un bloqueo de un grupo de recursos, use:

lockid=$(az lock show --name LockSite --resource-group exampleresourcegroup  --output tsv --query id)
az lock delete --ids $lockid

Python

Puede bloquear recursos implementados con Python con el comando ManagementLockClient.management_locks.create_or_update_at_resource_group_level.

Para bloquear un recurso, proporcione el nombre del recurso, su tipo y el nombre del grupo de recursos.

import os
from azure.identity import AzureCliCredential
from azure.mgmt.resource import ManagementLockClient

credential = AzureCliCredential()
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]

lock_client = ManagementLockClient(credential, subscription_id)

lock_result = lock_client.management_locks.create_or_update_at_resource_level(
    "exampleGroup",
    "Microsoft.Web",
    "",
    "sites",
    "examplesite",
    "lockSite",
    {
        "level": "CanNotDelete"
    }
)

Para bloquear un grupo de recursos, proporcione el nombre del grupo de recursos.

import os
from azure.identity import AzureCliCredential
from azure.mgmt.resource import ManagementLockClient

credential = AzureCliCredential()
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]

lock_client = ManagementLockClient(credential, subscription_id)

lock_result = lock_client.management_locks.create_or_update_at_resource_group_level(
    "exampleGroup",
    "lockGroup",
    {
        "level": "CanNotDelete"
    }
)

Para obtener información sobre todos los bloqueos de la suscripción, use ManagementLockClient.management_locks.get. Para obtener todos los bloqueos en su suscripción, use:

import os
from azure.identity import AzureCliCredential
from azure.mgmt.resource import ManagementLockClient

credential = AzureCliCredential()
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]

lock_client = ManagementLockClient(credential, subscription_id)

lock_result = lock_client.management_locks.list_at_subscription_level()

for lock in lock_result:
    print(f"Lock name: {lock.name}")
    print(f"Lock level: {lock.level}")
    print(f"Lock notes: {lock.notes}")

Para obtener un bloqueo de un recurso, use:

import os
from azure.identity import AzureCliCredential
from azure.mgmt.resource import ManagementLockClient

credential = AzureCliCredential()
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]

lock_client = ManagementLockClient(credential, subscription_id)

lock_result = lock_client.management_locks.get_at_resource_level(
    "exampleGroup",
    "Microsoft.Web",
    "",
    "sites",
    "examplesite",
    "lockSite"
)

print(f"Lock ID: {lock_result.id}")
print(f"Lock Name: {lock_result.name}")
print(f"Lock Level: {lock_result.level}")

Para obtener un bloqueo de un grupo de recursos, use:

import os
from azure.identity import AzureCliCredential
from azure.mgmt.resource import ManagementLockClient

credential = AzureCliCredential()
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]

lock_client = ManagementLockClient(credential, subscription_id)

lock_result = lock_client.management_locks.get_at_resource_group_level(
    "exampleGroup",
    "lockGroup"
)

print(f"Lock ID: {lock_result.id}")
print(f"Lock Level: {lock_result.level}")

Para eliminar un bloqueo de un recurso, use:

import os
from azure.identity import AzureCliCredential
from azure.mgmt.resource import ManagementLockClient

credential = AzureCliCredential()
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]

lock_client = ManagementLockClient(credential, subscription_id)

lock_client.management_locks.delete_at_resource_level(
    "exampleGroup",
    "Microsoft.Web",
    "",
    "sites",
    "examplesite",
    "lockSite"
)

Para eliminar un bloqueo de un grupo de recursos, use:

import os
from azure.identity import AzureCliCredential
from azure.mgmt.resource import ManagementLockClient

credential = AzureCliCredential()
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]

lock_client = ManagementLockClient(credential, subscription_id)

lock_client.management_locks.delete_at_resource_group_level("exampleGroup", "lockGroup")

API DE REST

Puede bloquear los recursos implementados con la API de REST para bloqueos de administración. La API REST le permite crear y eliminar bloqueos, y recuperar información acerca de los bloqueos existentes.

Para crear un bloqueo, ejecute:

PUT https://management.azure.com/{scope}/providers/Microsoft.Authorization/locks/{lock-name}?api-version={api-version}

El ámbito puede ser una suscripción, un grupo de recursos o un recurso. El nombre del bloqueo puede ser cualquiera. Use 2016-09-01 para la versión de la API.

En la solicitud, incluya un objeto JSON que especifique las propiedades para el bloqueo.

{
  "properties": {
  "level": "CanNotDelete",
  "notes": "Optional text notes."
  }
}

Pasos siguientes