Criar recursos do Azure RBAC usando o Bicep
O Azure tem um poderoso sistema RBAC (controle de acesso baseado em função). Para obter mais informações sobre o RBAC do Azure, confira O que é o RBAC (controle de acesso baseado em função) do Azure? Usando o Bicep, você pode definir programaticamente suas atribuições de função RBAC e definições de função.
Atribuições de função
As atribuições de função permitem que você conceda a uma entidade de segurança (como um usuário, um grupo ou uma entidade de serviço) acesso a um recurso específico do Azure.
Para definir uma atribuição de função, crie um recurso com o tipo Microsoft.Authorization/roleAssignments
. Uma definição de função tem várias propriedades, incluindo escopo, nome, ID de definição de função, ID principal e tipo de entidade de segurança.
Escopo
As atribuições de função se aplicam em um escopo específico, que define o recurso ou o conjunto de recursos aos quais você está concedendo acesso. Para obter mais informações, confira Entender o escopo do Azure RBAC.
As atribuições de função são recursos de extensão, o que significa que se aplicam a outro recurso. O seguinte exemplo mostra como criar uma conta de armazenamento e uma atribuição de função com escopo para essa conta de armazenamento:
param location string = resourceGroup().location
param storageAccountName string = 'stor${uniqueString(resourceGroup().id)}'
param storageSkuName string = 'Standard_LRS'
param roleDefinitionResourceId string
param principalId string
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-04-01' = {
name: storageAccountName
location: location
kind: 'StorageV2'
sku: {
name: storageSkuName
}
}
resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
scope: storageAccount
name: guid(storageAccount.id, principalId, roleDefinitionResourceId)
properties: {
roleDefinitionId: roleDefinitionResourceId
principalId: principalId
principalType: 'ServicePrincipal'
}
}
Se você não especificar explicitamente o escopo, o Bicep usará o arquivo targetScope
. No seguinte exemplo, nenhuma propriedade scope
é especificada, portanto, a atribuição de função se aplica à assinatura:
param roleDefinitionResourceId string
param principalId string
targetScope = 'subscription'
resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
name: guid(subscription().id, principalId, roleDefinitionResourceId)
properties: {
roleDefinitionId: roleDefinitionResourceId
principalId: principalId
principalType: 'ServicePrincipal'
}
}
Dica
Use o menor escopo necessário para atender aos seus requisitos.
Por exemplo, se você precisar conceder um acesso de identidade gerenciada a uma só conta de armazenamento, é uma boa prática de segurança criar a atribuição de função no escopo da conta de armazenamento, não no grupo de recursos ou no escopo da assinatura.
Nome
O nome do recurso de uma atribuição de função deve ser um GUID (identificador global exclusivo).
Os nomes de recursos de atribuição de função devem ser exclusivos no locatário do Microsoft Entra, mesmo que o escopo seja mais restritivo.
Para que sua implantação do Bicep seja repetível, é importante que o nome seja determinístico – em outras palavras, para usar o mesmo nome toda vez que você implantar. É uma boa prática criar um GUID que use o escopo, a ID principal e a ID da função juntos. Use a função guid()
para ajudar na criação de um GUID determinístico para seus nomes de atribuição de função, como neste exemplo:
name: guid(subscription().id, principalId, roleDefinitionResourceId)
ID de definição de função
A função que você atribui pode ser uma definição de função interna ou uma definição de função personalizada. Para usar uma definição de função interna, localize a ID de definição de função apropriada. Por exemplo, a função Contribuidor tem uma ID de definição de função de b24988ac-6180-42a0-ab88-20f7382dd24c
.
Ao criar o recurso de atribuição de função, você precisa especificar uma ID de recurso totalmente qualificada. As IDs de definição de função interna são recursos com escopo de assinatura. É uma boa prática usar um recurso para se referir à função existing
interna e acessar sua ID de recurso totalmente qualificada usando a propriedade .id
:
param principalId string
@description('This is the built-in Contributor role. See https://docs.microsoft.com/azure/role-based-access-control/built-in-roles#contributor')
resource contributorRoleDefinition 'Microsoft.Authorization/roleDefinitions@2022-04-01' existing = {
scope: subscription()
name: 'b24988ac-6180-42a0-ab88-20f7382dd24c'
}
resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
name: guid(resourceGroup().id, principalId, contributorRoleDefinition.id)
properties: {
roleDefinitionId: contributorRoleDefinition.id
principalId: principalId
principalType: 'ServicePrincipal'
}
}
Principal
A propriedade principalId
deve ser definida como um GUID que represente o identificador do Microsoft Entra para a entidade de segurança. No Microsoft Entra ID, isso às vezes é chamado de ID do objeto.
A propriedade principalType
especifica se a entidade é um usuário, um grupo ou uma entidade de serviço. As identidades gerenciadas são uma forma de entidade de serviço.
Dica
É importante definir a propriedade principalType
ao criar uma atribuição de função no Bicep. Caso contrário, você pode receber erros de implantação intermitentes, especialmente ao trabalhar com entidades de serviço e identidades gerenciadas.
O seguinte exemplo mostra como criar uma identidade gerenciada atribuída pelo usuário e uma atribuição de função:
param location string = resourceGroup().location
param roleDefinitionResourceId string
var managedIdentityName = 'MyManagedIdentity'
resource managedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
name: managedIdentityName
location: location
}
resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
name: guid(resourceGroup().id, managedIdentity.id, roleDefinitionResourceId)
properties: {
roleDefinitionId: roleDefinitionResourceId
principalId: managedIdentity.properties.principalId
principalType: 'ServicePrincipal'
}
}
Comportamento de exclusão de recursos
Quando você exclui um usuário, grupo, entidade de serviço ou identidade gerenciada do Microsoft Entra ID, é uma boa prática excluir também as atribuições de função relacionadas a ele. Elas não são excluídas automaticamente.
Todas as atribuições de função que se referem a uma ID de entidade de segurança excluída tornam-se inválidas. Se você tentar reutilizar o nome de uma atribuição de função para outra atribuição de função, a implantação falhará. Para contornar esse comportamento, você deve remover a atribuição de função antiga antes de recriá-la ou certificar-se de usar um nome exclusivo ao implantar uma nova atribuição de função. Este modelo de início rápido ilustra como você pode definir uma atribuição de função em um módulo Bicep e usar uma ID da entidade de segurança como um valor gerador para o nome da atribuição de função.
Definições de função personalizadas
Definições de função personalizadas permitem definir um conjunto de permissões que podem ser atribuídas a uma entidade de segurança usando uma atribuição de função. Para saber mais sobre definições de função, confira Noções básicas sobre definições de função do Azure.
Para criar uma definição de função personalizada, defina um recurso do tipo Microsoft.Authorization/roleDefinitions
. Confira o início rápido Criar uma definição de função por meio de uma implantação no nível da assinatura para um exemplo.
Os nomes de recursos de definição de função devem ser exclusivos no locatário do Microsoft Entra, mesmo que os escopos atribuíveis sejam mais restritivos.
Observação
Alguns serviços gerenciam as próprias definições de função e atribuições. Por exemplo, o Azure Cosmos DB mantém os próprios recursos Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments
e Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions
. Para obter mais informações, confira a documentação do serviço específico.
Recursos relacionados
- Documentação de recursos
- Recursos de extensão
- Escopos
- Modelos de início rápido
- Postagens no blog da comunidade
- Criar atribuições de função para escopos diferentes com o Bicep, por Barbara Forbes