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. 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.

  • 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.

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 de conta precisam usar as credenciais do Azure AD para acessar 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 em que não se pode excluir em uma conta de armazenamento não protege os dados da conta contra exclusão ou modificação. Ele só protege a conta de armazenamento contra exclusão. Se uma solicitação usar operações de plano de dados, o bloqueio na conta de armazenamento não protegerá dados de blob, fila, tabela ou arquivo nessa conta de armazenamento. 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, a exclusão será negada. 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 uma conta de armazenamento não protege os dados da conta contra exclusão ou modificação. Ele também não protege seus dados de blob, fila, tabela ou arquivo.

  • 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 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 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 de não-exclusão em um grupo de recursos impede que o Azure Machine Learning faça o dimensionamento automático dos clusters de cálculo do Azure Machine Learning para remover nós não utilizados.

  • 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 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.

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/*. Somente as funções Proprietário e Administrador de Acesso do Usuário podem criar ou excluir bloqueios de gerenciamento. 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.

Select service

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.

Show managed group

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

Delete service

Configurar bloqueios

Portal

  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 em que ele está implantado. 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

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