Entenda o bloqueio de recursos nos Blueprints do Azure

A criação de ambientes consistentes em escala só é realmente valiosa se houver um mecanismo para manter essa consistência. Este artigo explica como o bloqueio de recursos funciona em Blueprints do Azure. Para ver um exemplo de bloqueio de recursos e aplicação de atribuições de negação, veja o tutorial Proteger novos recursos.

Observação

Os bloqueios de recursos implantados pelo Azure Blueprints são aplicados apenas a recursos que não são de extensão implantados pela atribuição do blueprint. Os recursos existentes, como aqueles em grupos de recursos que já existem, não têm bloqueios adicionados a eles.

Estados e modos de bloqueio

O modo de bloqueio se aplica à atribuição de blueprint e tem três opções: Não Bloquear, Somente Leitura ou Não Excluir. O modo de bloqueio é configurado durante a implantação de artefato em uma atribuição de blueprint. Um modo de bloqueio diferente pode ser definido pela atualização da atribuição de blueprint. No entanto, os modos de bloqueio não podem ser alterados fora do Azure Blueprints.

Recursos criados por artefatos em uma atribuição de blueprint possuem quatro estados: Desbloqueados, Somente Leitura ou Não É Possível Editar/Excluir ou Não É Possível Excluir. Cada tipo de artefato pode estar no estado Não Bloqueado. A seguinte tabela pode ser usada para determinar o estado de um recurso:

Modo Tipo de recurso do artefato Estado Descrição
Não Bloquear * Não Bloqueado Os recursos não são protegidos pelo Azure Blueprints. Esse estado também é usado para recursos adicionados a um artefato do grupo de recursos Somente Leitura ou Não Excluir fora de uma atribuição de blueprint.
Somente leitura Resource group Não é Possível Editar/Excluir O grupo de recursos é somente leitura e as marcas no grupo de recursos não podem ser modificadas. Os recursos Não Bloqueados podem ser adicionados, movidos, alterados ou excluídos desse grupo de recursos.
Somente leitura Não grupo de recursos Somente leitura O recurso não pode ser alterado de nenhuma forma. Nenhuma alteração é permitida e não pode ser excluído.
Não exclua * Não é Possível Excluir Os recursos podem ser alterados, mas não podem ser excluídos. Os recursos Não Bloqueados podem ser adicionados, movidos, alterados ou excluídos desse grupo de recursos.

Substituindo os estados de bloqueio

Normalmente, é possível que alguém com o controle de acesso baseado em função do Azure (RBAC) apropriado na assinatura, como a função de “Proprietário”, possa alterar ou excluir qualquer recurso. Esse acesso não é o caso quando o Azure Blueprints aplica o bloqueio como parte de uma atribuição implantada. Se a atribuição foi definida com a opção Somente Leitura ou Não Excluir, nem mesmo o proprietário da assinatura pode executar a ação bloqueada no recurso protegido.

Isso protege a consistência do plano gráfico em definido e o ambiente em que ele foi projetado para criar a partir de exclusão acidental ou através de programação ou de alteração.

Atribuir no grupo de gerenciamento

A única opção para impedir que os proprietários da assinatura removam uma atribuição de blueprint é atribuir o blueprint a um grupo de gerenciamento. Nesse cenário, somente os Proprietários do grupo de gerenciamento têm as permissões necessárias para remover a atribuição do blueprint.

Para atribuir o blueprint a um grupo de gerenciamento em vez de uma assinatura, a chamada à API REST muda para esta aparência:

PUT https://management.azure.com/providers/Microsoft.Management/managementGroups/{assignmentMG}/providers/Microsoft.Blueprint/blueprintAssignments/{assignmentName}?api-version=2018-11-01-preview

O grupo de gerenciamento definido pelo {assignmentMG} deve estar dentro da hierarquia do grupo de gerenciamento ou ser o mesmo grupo de gerenciamento em que a definição do blueprint é salva.

O corpo da solicitação da atribuição do blueprint tem esta aparência:

{
    "identity": {
        "type": "SystemAssigned"
    },
    "location": "eastus",
    "properties": {
        "description": "enforce pre-defined simpleBlueprint to this XXXXXXXX subscription.",
        "blueprintId": "/providers/Microsoft.Management/managementGroups/{blueprintMG}/providers/Microsoft.Blueprint/blueprints/simpleBlueprint",
        "scope": "/subscriptions/{targetSubscriptionId}",
        "parameters": {
            "storageAccountType": {
                "value": "Standard_LRS"
            },
            "costCenter": {
                "value": "Contoso/Online/Shopping/Production"
            },
            "owners": {
                "value": [
                    "johnDoe@contoso.com",
                    "johnsteam@contoso.com"
                ]
            }
        },
        "resourceGroups": {
            "storageRG": {
                "name": "defaultRG",
                "location": "eastus"
            }
        }
    }
}

A principal diferença nesse corpo de solicitação e um que está sendo atribuído a uma assinatura é a propriedade properties.scope. Essa propriedade necessária deve ser definida como a assinatura à qual a atribuição de blueprint se aplica. A assinatura deve ser um filho direto da hierarquia do grupo de gerenciamento em que a atribuição de blueprint está armazenada.

Observação

Um blueprint atribuído ao escopo do grupo de gerenciamento ainda funciona como uma atribuição de blueprint de nível de assinatura. A única diferença é onde a atribuição de blueprint é armazenada para impedir que os proprietários da assinatura removam a atribuição e os bloqueios associados.

Removendo os estados de bloqueio

Se for necessário modificar ou excluir um recurso protegido por uma atribuição, haverá duas maneiras de fazer isso.

  • Atualizar a atribuição de blueprint para um modo de bloqueio igual a Não Bloquear
  • Excluir a atribuição de blueprint

Quando a atribuição é removida, os bloqueios criados pelo Azure Blueprints são removidos. No entanto, o recurso é deixado para trás e precisaria ser excluído por meios normais.

Como o plano gráfico bloqueios trabalho

Uma ação de negação do RBAC do Azure para negar atribuições é aplicada aos recursos de artefato durante a atribuição de um blueprint se a atribuição selecionou a opção Somente Leitura ou Não Excluir. A ação de negação é adicionada pela identidade gerenciada da atribuição de blueprint e só pode ser removida dos recursos de artefato pela mesma identidade gerenciada. Essa medida de segurança impõe o mecanismo de bloqueio e impede a remoção do bloqueio do blueprint fora do Azure Blueprints.

Screenshot of the Access control (I A M) page and the Deny assignments tab for a resource group.

As propriedades das atribuições de negação de cada modo são as seguintes:

Modo Permissions.Actions Permissions.NotActions Principals[i].Type ExcludePrincipals[i].Id DoNotApplyToChildScopes
Somente leitura * */read
Microsoft.Authorization/locks/delete
Microsoft.Network/virtualNetwork/subnets/join/action
SystemDefined (todos) atribuição de blueprint e definida pelo usuário em excludedPrincipals Grupo de recursos – verdadeiro; Recurso – falso
Não exclua */delete Microsoft.Authorization/locks/delete
Microsoft.Network/virtualNetwork/subnets/join/action
SystemDefined (todos) atribuição de blueprint e definida pelo usuário em excludedPrincipals Grupo de recursos – verdadeiro; Recurso – falso

Importante

O Gerenciador de Recursos do Azure armazena em cache os detalhes da atribuição de função por até 30 minutos. Como resultado, a ação de negação das atribuições de negação nos recursos de blueprint pode não entrar imediatamente em vigor. Durante esse período, talvez seja possível excluir um recurso destinado a ser protegido por bloqueios de blueprint.

Excluir uma entidade de segurança de uma atribuição de negação

Em alguns cenários de design ou segurança, pode ser necessário excluir uma entidade da atribuição de negação criada pela atribuição de blueprint. Essa etapa é feita na API REST adicionando até cinco valores à matriz excludedPrincipals na propriedade locks ao criar a atribuição. A definição de atribuição a seguir é um exemplo de um corpo de solicitação que inclui excludedPrincipals:

{
  "identity": {
    "type": "SystemAssigned"
  },
  "location": "eastus",
  "properties": {
    "description": "enforce pre-defined simpleBlueprint to this XXXXXXXX subscription.",
    "blueprintId": "/providers/Microsoft.Management/managementGroups/{mgId}/providers/Microsoft.Blueprint/blueprints/simpleBlueprint",
    "locks": {
        "mode": "AllResourcesDoNotDelete",
        "excludedPrincipals": [
            "7be2f100-3af5-4c15-bcb7-27ee43784a1f",
            "38833b56-194d-420b-90ce-cff578296714"
        ]
    },
    "parameters": {
      "storageAccountType": {
        "value": "Standard_LRS"
      },
      "costCenter": {
        "value": "Contoso/Online/Shopping/Production"
      },
      "owners": {
        "value": [
          "johnDoe@contoso.com",
          "johnsteam@contoso.com"
        ]
      }
    },
    "resourceGroups": {
      "storageRG": {
        "name": "defaultRG",
        "location": "eastus"
      }
    }
  }
}

Excluir uma ação de uma atribuição de negação

Semelhante à exclusão de uma entidade de segurança em uma atribuição de negação em uma atribuição de blueprint, você pode excluir operações específicas do provedor de recursos do Azure. No bloco properties.locks, no mesmo lugar em que excludedPrincipals está, um excludedActions pode ser adicionado:

"locks": {
    "mode": "AllResourcesDoNotDelete",
    "excludedPrincipals": [
        "7be2f100-3af5-4c15-bcb7-27ee43784a1f",
        "38833b56-194d-420b-90ce-cff578296714"
    ],
    "excludedActions": [
        "Microsoft.ContainerRegistry/registries/push/write",
        "Microsoft.Authorization/*/read"
    ]
},

Embora excludedPrincipals deva ser explícito, as entradas de excludedActions podem fazer uso de * para correspondência curinga de operações do provedor de recursos.

Próximas etapas