Partilhar via


Usar o Bicep para criar recursos de controlo de acesso baseado em funções do Azure (Azure RBAC)

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 atribuir a um principal, como um utilizador, 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, um ID da função, um ID de entidade principal e um tipo de entidade principal.

Âmbito de aplicação

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-05-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, como nenhuma scope propriedade é especificada, a atribuição de função está limitada à 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'
  }
}

Sugestão

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 e 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 tenant do Microsoft Entra, mesmo que o escopo seja mais restrito.

Para que a sua implementação do Bicep seja repetível, é importante que o nome seja determinístico; ou seja, use o mesmo nome sempre que implementar. É 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. Os IDs de definição de funções internos são recursos com âmbito de subscrição. É recomendável usar existing recurso para fazer referência à função incorporada e usar a .id propriedade para acessar a sua ID de recurso totalmente qualificada:

param principalId string

@description('This is the built-in Contributor role. See https://learn.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'
  }
}

Diretor

A principalId propriedade deve ser definida como um GUID que representa o identificador do Microsoft Entra para o principal. No Microsoft Entra ID, isso às vezes é chamado de ID de objeto.

A principalType propriedade especifica se o principal é um utilizador, um grupo ou uma entidade de serviço. As identidades gerenciadas são uma forma de entidade de serviço.

Sugestão

É 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, é recomendável 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 podes definir uma atribuição de função num módulo Bicep e usar um identificador principal como valor inicial 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 através de uma atribuição de função. Para obter mais informações sobre definições de função, consulte Compreender 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 no nível de assinatura para obter um exemplo.

Os nomes de recursos de definição de função devem ser exclusivos dentro do inquilino do Microsoft Entra, mesmo que os âmbitos atribuíveis sejam mais restritos.

Observação

Alguns serviços gerenciam suas próprias definições e atribuições de função. Por exemplo, o Azure Cosmos DB mantém os seus próprios recursos Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments e Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions. Para obter mais informações, consulte a documentação do serviço específico.