Bloquear seus recursos para proteger sua infraestrutura

Como administrador, você pode bloquear uma assinatura do Azure, um grupo de recursos ou um recurso para protegê-los contra exclusões e modificações acidentais do usuário. O bloqueio substitui todas as permissões que o usuário tenha.

Você pode definir bloqueios que impedem exclusões ou modificações. No portal, os bloqueios são chamados de Excluir e Somente leitura. Na linha de comando, esses bloqueios são chamados de CanNotDelete e ReadOnly.

  • CanNotDelete significa que os usuários autorizados ainda poderão ler e modificar um recurso, mas não poderão excluí-lo.
  • ReadOnly significa que os usuários autorizados poderão ler um recurso, mas não poderão excluir ou atualizá-lo. Aplicar esse bloqueio é semelhante a restringir todos os usuários autorizados para as permissões concedidas pela função Leitor.

Ao contrário do RBAC (controle de acesso baseado em função), é possível usar bloqueios de gerenciamento para aplicar uma restrição a todos os usuários e a todas as funções. Para saber mais sobre como configurar permissões para usuários e funções, confira o RBAC do Azure.

Herança de bloqueio

Quando você aplica um bloqueio a um escopo pai, todos os recursos filho herdam o mesmo bloqueio. Até mesmo os recursos que você herda posteriormente herdam o bloqueio do pai. O bloqueio mais restritivo na herança terá 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 poderá 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}"

Que corresponde ao escopo da ID do recurso que está 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, toda a operação de exclusão será bloqueada. Mesmo que o grupo de recursos ou outros recursos no grupo de recursos não estejam bloqueados, a exclusão não ocorrerá. Uma exclusão parcial nunca ocorrerá.

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 escopo de bloqueios

Observação

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

As operações do painel 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/. Veja Painel de controle e plano de dados do Azure. Para descobrir quais operações usam a URL do painel 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 como um recurso executa suas funções. Um bloqueio ReadOnly, por exemplo, em um servidor lógico do Banco de Dados SQL, 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. Essas solicitações não vão para https://management.azure.com.

Considerações antes da aplicação de bloqueios

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 ARM (Azure Resource Manager). Alguns exemplos comuns de operações bloqueadas são:

  • Um bloqueio do tipo somente leitura em uma conta de armazenamento impede que todos os usuários listem as chaves das contas. Uma solicitação POST identifica a operação Listar chaves do Armazenamento do Microsoft Azure para proteger o acesso às chaves da conta. As chaves da 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 da conta precisam usar as credenciais do Microsoft Entra para acessarem dados de blob ou de fila. Um bloqueio somente leitura também impede a atribuição de funções RBAC do Azure que estão no escopo da conta de armazenamento ou de um contêiner de dados (contêiner de BLOB ou fila).

  • Um bloqueio somente leitura em uma conta de armazenamento protege as atribuições do RBAC do Azure 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 de proibição de exclusão em uma conta de armazenamento não protege os dados da conta contra exclusão ou modificação. Ele também não protege os dados de um blob, uma fila, uma tabela ou um arquivo.

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

    Por exemplo, se uma solicitação usar Compartilhamentos de Arquivo – Excluir, que é uma operação do painel de controle, ocorrerá uma falha na exclusão. Se a solicitação usar Excluir Compartilhamento, que é uma operação de plano de dados, a exclusão terá êxito. Recomendamos que você use a operação do painel de controle.

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

  • Um bloqueio do tipo somente leitura em um recurso do Serviço de Aplicativo impedirá o Gerenciador de Servidores do Visual Studio de exibir os arquivos para o recurso, pois essa interação exige 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ê escale o plano verticalmente ou horizontalmente.

  • Um bloqueio do tipo somente leitura em um grupo de recursos que contém uma máquina virtual impede que qualquer usuário inicie ou reinicie a máquina virtual. Essas operações requerem uma solicitação do método POST.

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

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

  • Um bloqueio do tipo "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 Azure Resource Manager a exclusão automática de implantações no histórico. Se você atingir 800 implantações no histórico, suas implantações falharão.

  • Um bloqueio do tipo não excluir no grupo de recursos criado pelo Serviço de Backup do Azure causa falha nos backups. O serviço dá suporte a um máximo de 18 pontos de restauração. Quando bloqueado, o serviço de backup não consegue limpar os pontos de restauração. Para obter mais informações, veja Perguntas frequentes sobre Backup de VMs do Azure.

  • Um bloqueio não pode excluir um grupo de recursos que contém workspaces 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 workspace do Log Analytics impede que a UEBA (Análise do Comportamento de Usuários e de Entidades) seja habilitada.

  • Um bloqueio do tipo "não pode ser excluído" em um workspace do Log Analytics não impede as operações de limpeza de dados. Em vez disso, remova a função limpeza de dados do usuário.

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

  • O bloqueio somente leitura de um Gateway de Aplicativo impede a obtenção da integridade do back-end do gateway de aplicativo. Essa operação usa um método POST, que é bloqueada pelo bloqueio somente leitura.

  • Um bloqueio somente leitura em um cluster do AKS (Serviço de Kubernetes do Azure) limita como você pode acessar recursos de cluster por meio do portal. Um bloqueio somente leitura impede que você use a seção recursos do Kubernetes do cluster do 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 do tipo “não pode ser excluído” em uma Máquina Virtual protegida pelo Site Recovery impede que determinados links de recurso relacionados ao Site Recovery sejam removidos corretamente ao remover a proteção ou desabilitar a replicação. Se planejar proteger a VM novamente mais tarde, você precisará remova o bloqueio antes de desabilitar a proteção. Se você não remover o bloqueio, precisará seguir algumas etapas para limpar os links obsoletos para proteger a VM. Para saber mais, confira Solução de problemas de replicação de VM do Azure.

Quem pode criar ou excluir bloqueios

Para criar ou excluir bloqueios de gerenciamento, você deve ter acesso às ações Microsoft.Authorization/* ou Microsoft.Authorization/locks/*. Os usuários aos quais foram atribuídas as funções de Proprietário e Administrador de Acesso do Usuário têm o acesso necessário. Algumas funções integradas especializadas também concedem esse acesso. Você também 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 deles é um grupo de recursos desbloqueado 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 tentar excluir o grupo de recursos de infraestrutura, você receberá um erro informando que o grupo de recursos está bloqueado. Se tentar excluir o bloqueio para o grupo de recursos de infraestrutura, você receberá um erro informando que o bloqueio não pode ser excluído porque ele é propriedade de um aplicativo do sistema.

Em vez disso, exclua o serviço, o que também excluirá 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 conté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, selecione 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 do grupo de recursos é Bloqueios.

  1. Na folha Configurações do recurso, do grupo de recursos ou da assinatura que você deseja bloquear, selecione Bloqueios.

    Select lock.

  2. Para adicionar um bloqueio, selecione Adicionar. Se você quiser criar um bloqueio 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. Forneça um nome e um nível para o bloqueio. Opcionalmente, é possível adicionar notas que descrevem o bloqueio.

    Set lock.

  4. Para excluir o bloqueio, selecione o botão Excluir.

    Delete lock.

Modelo

Ao usar um modelo do modelo do 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 de implantação, como o bloqueio de um grupo de recursos ou assinatura, não defina a propriedade de escopo. Ao bloquear um recurso dentro do escopo de implantação, defina a propriedade de escopo.

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 do bloqueio corresponde ao escopo da 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 de escopo. 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

Bloqueie recursos implantados com o Azure PowerShell usando o comando New-AzResourceLock.

Para bloquear um recurso, forneça o nome dele, 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 dele.

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

Para saber mais sobre um bloqueio, use Get-AzResourceLock. Para obter todos os bloqueios em sua assinatura, use:

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 de 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 de um grupo de recursos, use:

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

CLI do Azure

Bloqueie recursos implantados com a CLI do Azure usando o comando az lock create.

Para bloquear um recurso, forneça o nome dele, 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 dele.

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

Para saber mais sobre um bloqueio, use az lock list. Para obter todos os bloqueios em sua assinatura, use:

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 de 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 de 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 implementados com Python por meio do o comando ManagementLockClient.management_locks.create_or_update_at_resource_group_level.

Para bloquear um recurso, forneça o nome dele, 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 dele.

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 em sua assinatura, use ManagementLockClient.management_locks.get. Para obter todos os bloqueios em sua assinatura, 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 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_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 excluir um bloqueio de 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 de 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 os recursos implantados com a API REST para bloqueios de gerenciamento. A API REST permite que você crie e exclua bloqueios e recupere 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, grupo de recursos ou recurso. O nome do bloqueio pode ser o que você desejar. Use a de 01/09/2016 para a versão de API.

Na solicitação, inclua um objeto JSON que especifica as propriedades do bloqueio.

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

Próximas etapas