Bloqueie os seus recursos para proteger a sua infraestrutura

Como administrador, você pode bloquear uma assinatura, grupo de recursos ou recurso do Azure para protegê-los de exclusões e modificações acidentais do usuário. O bloqueio sobrepõe-se a quaisquer permissões de utilizador.

É possível definir bloqueios que impeçam eliminações ou modificações. No portal, esses bloqueios são chamados de Excluir e Somente leitura. Na linha de comandos, estes bloqueios são denominados CanNotDelete e ReadOnly.

  • CanNotDelete significa que os utilizadores autorizados podem ler e modificar um recurso, mas não o podem eliminar.
  • ReadOnly significa que os utilizadores autorizados podem ler um recurso, mas não o podem eliminar ou atualizar. A aplicação desse bloqueio é semelhante a restringir todos os usuários autorizados às permissões fornecidas pela função Leitor .

Ao contrário do RBAC (controle de acesso baseado em função), você usa bloqueios de gerenciamento para aplicar uma restrição a todos os usuários e funções. Para saber mais sobre como definir permissões para usuários e funções, consulte Azure RBAC.

Bloquear herança

Quando você aplica um bloqueio em um escopo pai, todos os recursos dentro desse escopo herdam o mesmo bloqueio. Mesmo os recursos adicionados posteriormente herdam o mesmo bloqueio pai. O bloqueio mais restritivo na herança tem precedência.

Os recursos de extensão herdam bloqueios do recurso ao qual são aplicados. Por exemplo, Microsoft.Insights/diagnosticSettings é um tipo de recurso de extensão. Se você aplicar uma configuração de diagnóstico a um blob de armazenamento e bloquear a conta de armazenamento, não será possível excluir a configuração de diagnóstico. Essa herança faz sentido porque a ID de recurso completa da configuração de diagnóstico é:

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

O que corresponde ao escopo da ID do recurso bloqueado:

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

Se você tiver um bloqueio Excluir em um recurso e tentar excluir seu grupo de recursos, o recurso bloqueará toda a operação de exclusão. Mesmo que o grupo de recursos ou outros recursos no grupo de recursos sejam desbloqueados, a exclusão não acontece. Você nunca tem uma exclusão parcial.

Quando você cancela uma assinatura do Azure:

  • Um bloqueio de recursos não bloqueia o cancelamento da assinatura.
  • O Azure preserva seus recursos desativando-os em vez de excluí-los imediatamente.
  • O Azure só exclui seus recursos permanentemente após um período de espera.

Compreender o âmbito dos bloqueios

Nota

Os bloqueios só se aplicam às operações do Azure do plano de controle e não às operações do plano de dados.

As operações do plano de controle do Azure vão para https://management.azure.com. As operações do plano de dados do Azure vão para sua instância de serviço, como https://myaccount.blob.core.windows.net/. Consulte Plano de controle e plano de dados do Azure. Para descobrir quais operações usam a URL do plano de controle, consulte a API REST do Azure.

A distinção significa que os bloqueios protegem um recurso contra alterações, mas não restringem a forma como um recurso executa suas funções. Um bloqueio ReadOnly, por exemplo, em um servidor lógico do Banco de dados SQL, o protege contra exclusões ou modificações. Ele permite que você crie, atualize ou exclua dados no banco de dados do servidor. As operações do plano de dados permitem transações de dados. Esses pedidos não vão para https://management.azure.com.

Considerações antes de aplicar as fechaduras

A aplicação de bloqueios pode levar a resultados inesperados. Algumas operações, que não parecem modificar um recurso, exigem ações bloqueadas. Os bloqueios impedem que o método POST envie dados para a API do Azure Resource Manager (ARM). Alguns exemplos comuns de operações bloqueadas são:

  • Um bloqueio somente leitura em uma conta de armazenamento impede que os usuários listem as chaves da conta. Uma solicitação POST manipula a operação Chaves da Lista de Armazenamento do Azure para proteger o acesso às chaves de conta. As chaves de conta fornecem acesso completo aos dados na conta de armazenamento. Quando um bloqueio somente leitura é configurado para uma conta de armazenamento, os usuários que não têm as chaves de conta precisam usar as credenciais do Microsoft Entra para acessar dados de blob ou fila. Um bloqueio somente leitura também impede a atribuição de funções RBAC do Azure com escopo para a conta de armazenamento ou para um contêiner de dados (contêiner de blob ou fila).

  • Um bloqueio somente leitura em uma conta de armazenamento protege as atribuições RBAC com escopo para uma conta de armazenamento ou um contêiner de dados (contêiner de blob ou fila).

  • Um bloqueio somente leitura em uma conta de armazenamento impede a criação de um contêiner de blob.

  • Um bloqueio somente leitura ou um bloqueio não pode ser excluído em uma conta de armazenamento não impede que seus dados sejam excluídos ou modificados. Ele também não protege os dados em um blob, fila, tabela ou arquivo.

  • A API da Conta de Armazenamento expõe as operações do plano de dados e do plano de controle. Se uma solicitação usar operações de plano de dados, o bloqueio na conta de armazenamento não protegerá os dados de blob, fila, tabela ou arquivo nessa conta de armazenamento. No entanto, se a solicitação usar operações de plano de controle, o bloqueio protege esses recursos.

    Por exemplo, se uma solicitação usa Compartilhamentos de arquivos - Excluir, que é uma operação de plano de controle, a exclusão falhará. Se a solicitação usar Delete Share, que é uma operação de plano de dados, a exclusão será bem-sucedida. Recomendamos que você use uma operação de avião de controle.

  • Um bloqueio somente leitura em um NSG (grupo de segurança de rede) impede a criação do log de fluxo NSG correspondente. Um bloqueio não pode excluir em um grupo de segurança de rede (NSG) não impede a criação ou modificação do log de fluxo NSG correspondente.

  • Um bloqueio somente leitura em um recurso do Serviço de Aplicativo impede que o Visual Studio Server Explorer exiba arquivos para o recurso porque essa interação requer acesso de gravação.

  • Um bloqueio somente leitura em um grupo de recursos que contém um plano do Serviço de Aplicativo impede que você aumente ou diminua a escala do plano.

  • Um bloqueio somente leitura em um grupo de recursos que contém uma máquina virtual impede que todos os usuários iniciem ou reiniciem uma máquina virtual. Essas operações exigem uma solicitação de método POST.

  • Um bloqueio somente leitura em um grupo de recursos impede que você mova recursos existentes para dentro ou para fora do grupo de recursos.

  • Um bloqueio somente leitura em um grupo de recursos que contém uma conta de automação impede que todos os runbooks sejam iniciados. Essas operações exigem uma solicitação de método POST.

  • Um bloqueio não pode excluir em um recurso ou grupo de recursos impede a exclusão de atribuições do RBAC do Azure.

  • Um bloqueio não pode excluir em um grupo de recursos impede que o Azure Resource Manager exclua automaticamente implantações no histórico. Se você atingir 800 implantações no histórico, suas implantações falharão.

  • Um bloqueio não pode excluir no grupo de recursos criado pelo Serviço de Backup do Azure faz com que os backups falhem. O serviço suporta um máximo de 18 pontos de restauração. Quando bloqueado, o serviço de backup não pode limpar os pontos de restauração. Para obter mais informações, consulte Perguntas freqüentes-Fazer backup de VMs do Azure.

  • Um bloqueio não pode excluir em um grupo de recursos que contém espaços de trabalho do Azure Machine Learning impede que o dimensionamento automático de clusters de computação do Azure Machine Learning funcione corretamente. Com o bloqueio, o dimensionamento automático não pode remover nós não utilizados. Sua solução consome mais recursos do que o necessário para a carga de trabalho.

  • Um bloqueio somente leitura em um espaço de trabalho do Log Analytics impede que o User and Entity Behavior Analytics (UEBA) seja habilitado.

  • Um bloqueio não pode excluir em um espaço de trabalho do Log Analytics não impede operações de limpeza de dados. Em vez disso, remova a função de limpeza de dados do usuário.

  • Um bloqueio somente leitura em uma assinatura impede que o Consultor do Azure funcione corretamente. O Advisor não consegue armazenar os resultados das suas consultas.

  • Um bloqueio somente leitura em um Application Gateway impede que você obtenha a integridade do back-end do gateway de aplicativo. Essa operação usa um método POST, que um bloqueio somente leitura bloqueia.

  • Um bloqueio somente leitura em um cluster do Serviço Kubernetes do Azure (AKS) limita como você pode acessar recursos de cluster por meio do portal. Um bloqueio somente leitura impede que você use a seção de recursos do Kubernetes do cluster AKS no portal do Azure para escolher um recurso de cluster. Essas operações exigem uma solicitação de método POST para autenticação.

  • Um bloqueio de não pode excluir em uma máquina virtual protegida pela Recuperação de Site impede que determinados links de recursos relacionados à Recuperação de Site sejam removidos corretamente quando você remove a proteção ou desabilita a replicação. Se você planeja proteger a VM novamente mais tarde, precisará remover o bloqueio antes de desabilitar a proteção. Se você não remover o bloqueio, precisará seguir determinadas etapas para limpar os links obsoletos antes de poder proteger a VM. Para obter mais informações, consulte Solucionar problemas de replicação de VM do Azure.

Quem pode criar ou excluir bloqueios

Para criar ou eliminar bloqueios de gestão, tem de ter acesso a ações Microsoft.Authorization/* ou Microsoft.Authorization/locks/*. Os usuários atribuídos às funções de Proprietário e Administrador de Acesso de Usuário têm o acesso necessário. Algumas funções internas especializadas também concedem esse acesso. Pode criar uma função personalizada com as permissões necessárias.

Aplicativos gerenciados e bloqueios

Alguns serviços do Azure, como o Azure Databricks, usam aplicativos gerenciados para implementar o serviço. Nesse caso, o serviço cria dois grupos de recursos. Um é um grupo de recursos desbloqueados que contém uma visão geral do serviço. O outro é um grupo de recursos bloqueado que contém a infraestrutura de serviço.

Se você tentar excluir o grupo de recursos de infraestrutura, receberá um erro informando que o grupo de recursos está bloqueado. Se você tentar excluir o bloqueio para o grupo de recursos de infraestrutura, receberá um erro informando que o bloqueio não pode ser excluído porque um aplicativo do sistema o possui.

Em vez disso, exclua o serviço, que também exclui o grupo de recursos de infraestrutura.

Para aplicativos gerenciados, escolha o serviço que você implantou.

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

Observe que o serviço inclui um link para um Grupo de Recursos Gerenciados. Esse grupo de recursos mantém a infraestrutura e está bloqueado. Você só pode excluí-lo indiretamente.

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

Para excluir tudo para o serviço, incluindo o grupo de recursos de infraestrutura bloqueado, escolha Excluir para o serviço.

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

Configurar bloqueios

Portal

No painel de navegação esquerdo, o nome do recurso de bloqueio de assinatura é Bloqueios de recursos, enquanto o nome do recurso de bloqueio de grupo de recursos é Bloqueios.

  1. No painel Definições do recurso, grupo de recursos ou subscrição que quer bloquear, selecione Bloqueios.

    Select lock.

  2. Para adicionar um bloqueio, selecione Adicionar. Se você quiser criar um cadeado em um nível pai, selecione o pai. O recurso selecionado atualmente herda o bloqueio do pai. Por exemplo, você pode bloquear o grupo de recursos para aplicar um bloqueio a todos os seus recursos.

    Add lock.

  3. Dê ao cadeado um nome e um nível de bloqueio. Opcionalmente, pode adicionar notas para descrever o bloqueio.

    Set lock.

  4. Para eliminar o bloqueio, selecione o botão Eliminar .

    Delete lock.

Template

Ao usar um modelo ARM ou um arquivo Bicep para implantar um bloqueio, é bom entender como o escopo de implantação e o escopo de bloqueio funcionam juntos. Para aplicar um bloqueio no escopo da implantação, como bloquear um grupo de recursos ou uma assinatura, deixe a propriedade scope desdefinida. Ao bloquear um recurso, dentro do escopo de implantação, defina a propriedade scope no bloqueio.

O modelo a seguir aplica um bloqueio ao grupo de recursos. Observe que não há uma propriedade de escopo no recurso de bloqueio porque o escopo de bloqueio corresponde ao escopo de implantação. Implante este modelo no nível do 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 criar um grupo de recursos e bloqueá-lo, implante o modelo a seguir no nível da assinatura.

{
  "$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": {}
}

Ao aplicar um bloqueio a um recurso dentro do grupo de recursos, adicione a propriedade scope. Defina o escopo como o nome do recurso a ser bloqueado.

O exemplo a seguir mostra um modelo que cria um plano de serviço de aplicativo, um site e um bloqueio no site. O escopo do bloqueio é definido para o site.

{
  "$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

Você bloqueia recursos implantados com o Azure PowerShell usando o comando New-AzResourceLock .

Para bloquear um recurso, forneça o nome do recurso, seu tipo de recurso e o nome do grupo de recursos.

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

Para bloquear um grupo de recursos, forneça o nome do grupo de recursos.

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

Para obter informações sobre um bloqueio, use Get-AzResourceLock. Para obter todos os bloqueios na sua subscrição, utilize:

Get-AzResourceLock

Para obter todos os bloqueios de um recurso, use:

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

Para obter todos os bloqueios para um grupo de recursos, use:

Get-AzResourceLock -ResourceGroupName exampleresourcegroup

Para excluir um bloqueio de um recurso, use:

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

Para excluir um bloqueio para um grupo de recursos, use:

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

CLI do Azure

Você bloqueia recursos implantados com a CLI do Azure usando o comando az lock create .

Para bloquear um recurso, forneça o nome do recurso, seu tipo de recurso e o nome do grupo de recursos.

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

Para bloquear um grupo de recursos, forneça o nome do grupo de recursos.

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

Para obter informações sobre um bloqueio, use az lock list. Para obter todos os bloqueios na sua subscrição, utilize:

az lock list

Para obter todos os bloqueios de um recurso, use:

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

Para obter todos os bloqueios para um grupo de recursos, use:

az lock list --resource-group exampleresourcegroup

Para excluir um bloqueio de um 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 excluir um bloqueio para um grupo de recursos, use:

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

Python

Você bloqueia recursos implantados com Python usando o comando ManagementLockClient.management_locks.create_or_update_at_resource_group_level .

Para bloquear um recurso, forneça o nome do recurso, seu tipo de recurso e o nome do 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 um grupo de recursos, forneça o nome do 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 obter informações sobre todos os bloqueios na sua subscrição, utilize ManagementLockClient.management_locks.get. Para obter todos os bloqueios na sua subscrição, utilize:

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 obter um bloqueio para um 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 obter um bloqueio para um 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 excluir um bloqueio de um 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 excluir um bloqueio para um 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 REST

Você pode bloquear recursos implantados com a API REST para bloqueios de gerenciamento. A API REST permite criar e excluir bloqueios e recuperar informações sobre bloqueios existentes.

Para criar um bloqueio, execute:

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

O escopo pode ser uma assinatura, um grupo de recursos ou um recurso. O nome do cadeado pode ser o que você quiser chamá-lo. Para a versão da API, use 2016-09-01.

Na solicitação, inclua um objeto JSON que especifique as propriedades de bloqueio.

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

Próximos passos