Criar recursos do RBAC do Azure usando o Bicep
O Azure tem um poderoso sistema de controle de acesso baseado em função (RBAC). Para obter mais informações sobre o Azure RBAC, consulte O que é o controle de acesso baseado em função do Azure (Azure RBAC)? Usando o Bicep, você pode definir programaticamente suas atribuições de função RBAC e definições de função.
Atribuições de funções
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 um escopo, um nome, uma ID de definição de função, uma ID principal e um tipo de principal.
Âmbito
As atribuições de função se aplicam em um escopo específico, que define o recurso ou conjunto de recursos aos quais você está concedendo acesso. Para obter mais informações, consulte 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 exemplo a seguir 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 exemplo a seguir, nenhuma scope
propriedade é especificada, portanto, a atribuição de função tem como escopo a 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'
}
}
Gorjeta
Use o menor escopo necessário para atender às suas necessidades.
Por exemplo, se você precisar conceder acesso a uma identidade gerenciada a uma única 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 escopo do grupo de recursos ou da assinatura.
Nome
O nome do recurso de uma atribuição de função deve ser um identificador global exclusivo (GUID).
Os nomes de recursos de atribuição de função devem ser exclusivos dentro do locatário do Microsoft Entra, mesmo que o escopo seja mais restrito.
Para que sua implantação do Bicep seja repetível, é importante que o nome seja determinístico - em outras palavras, use o mesmo nome toda vez que implantar. É uma boa prática criar um GUID que use o escopo, a ID principal e a ID da função juntos. É uma boa ideia usar a guid()
função para ajudá-lo a criar 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 atribuída 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 de Colaborador 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 um ID de recurso totalmente qualificado. As IDs de definição de função internas são recursos com escopo de assinatura. É uma boa prática usar um existing
recurso para se referir à função interna e acessar sua ID de recurso totalmente qualificada usando a .id
propriedade:
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 principalId
propriedade deve ser definida como um GUID que representa o identificador do Microsoft Entra para a entidade de segurança. No Microsoft Entra ID, isso às vezes é chamado de ID de objeto.
A principalType
propriedade especifica se a entidade de segurança é um usuário, um grupo ou uma entidade de serviço. As identidades gerenciadas são uma forma de entidade de serviço.
Gorjeta
É importante definir a principalType
propriedade ao criar uma atribuição de função no Bicep. Caso contrário, você poderá obter erros de implantação intermitentes, especialmente quando trabalha com entidades de serviço e identidades gerenciadas.
O exemplo a seguir 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 da ID do Microsoft Entra, é uma boa prática excluir todas as atribuições de função. Eles não são excluídos automaticamente.
Todas as atribuições de função que se referem a um ID principal excluído 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 garantir que você use um nome exclusivo quando você 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 principal como um valor de semente para o nome da atribuição de função.
Definições de função personalizadas
As 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 obter mais informações sobre definições de função, consulte Compreender as definições de função do Azure.
Para criar uma definição de função personalizada, defina um recurso do tipo Microsoft.Authorization/roleDefinitions
. Consulte Criar uma nova definição de função por meio de um início rápido de implantação em nível de assinatura para obter um exemplo.
Os nomes de recursos de definição de função devem ser exclusivos dentro do locatário do Microsoft Entra, mesmo que os escopos atribuíveis sejam mais estreitos.
Nota
Alguns serviços gerenciam suas próprias definições e atribuições de função. Por exemplo, o Azure Cosmos DB mantém seus próprios Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments
recursos e recursos Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions
. Para obter mais informações, consulte a documentação do serviço específico.
Recursos relacionados
- Documentação de recursos
- Recursos de extensão
- Âmbitos de aplicação
- Modelos de início rápido
- Publicações no blogue da comunidade
- Crie atribuições de função para diferentes escopos com o Bicep, por Barbara Forbes