Partilhar via


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.