Creare risorse RBAC di Azure con Bicep
Azure dispone di un potente sistema di controllo degli accessi in base al ruolo. Per ulteriori informazioni sul controllo degli accessi in base al ruolo di Azure, vedere Che cos'è il controllo degli accessi in base al ruolo di Azure? Usando Bicep, è possibile definire a livello di codice le assegnazioni di ruolo e le definizioni di ruolo RBAC.
Assegnazioni di ruolo
Le assegnazioni di ruolo consentono di concedere a un'entità (ad esempio un utente, un gruppo o un'entità servizio) l'accesso a una risorsa specifica di Azure.
Per definire un'assegnazione di ruolo, creare una risorsa con tipo Microsoft.Authorization/roleAssignments
. Una definizione di ruolo ha più proprietà, tra cui un ambito, un nome, un ID definizione di ruolo, un ID entità e un tipo di entità.
Ambito
Le assegnazioni di ruolo si applicano a un ambito specifico, che definisce la risorsa o il set di risorse a cui si concede l'accesso. Per altre informazioni, vedere Informazioni sull'ambito per il controllo degli accessi in base al ruolo di Azure.
Le assegnazioni di ruolo sono risorse di estensione, ovvero si applicano a un'altra risorsa. L'esempio seguente illustra come creare un account di archiviazione e un'assegnazione di ruolo con ambito a tale account di archiviazione:
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 non si specifica in modo esplicito l'ambito, Bicep usa il file targetScope
. Nell'esempio seguente non viene specificata alcuna proprietà scope
, pertanto l'assegnazione di ruolo ha come ambito la sottoscrizione:
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'
}
}
Suggerimento
Usare l'ambito più piccolo necessario per soddisfare i requisiti.
Ad esempio, se è necessario concedere a un'identità gestita l'accesso a un singolo account di archiviazione, è consigliabile creare l'assegnazione di ruolo nell'ambito dell'account di archiviazione, non nell'ambito del gruppo di risorse o della sottoscrizione.
Nome
Il nome della risorsa di un'assegnazione di ruolo deve essere un identificatore univoco globale (GUID).
I nomi delle risorse di assegnazione di ruolo devono essere univoci all'interno del tenant di Microsoft Entra, anche se l'ambito è più ristretto.
Affinché la distribuzione Bicep sia ripetibile, è importante che il nome sia deterministico, in altre parole, usare lo stesso nome ogni volta che si distribuisce. È consigliabile creare un GUID che usi l'ambito, l'ID entità e l'ID ruolo insieme. È consigliabile usare la funzione guid()
per creare un GUID deterministico per i nomi delle assegnazioni di ruolo, come in questo esempio:
name: guid(subscription().id, principalId, roleDefinitionResourceId)
Un ID di definizione del ruolo
Il ruolo assegnato può essere una definizione di ruolo predefinita o una definizione di ruolo personalizzata. Per usare una definizione di ruolo predefinita, trovare l'ID di definizione del ruolo appropriato. Ad esempio, il ruolo Collaboratore ha un ID definizione di ruolo di b24988ac-6180-42a0-ab88-20f7382dd24c
.
Quando si crea la risorsa di assegnazione di ruolo, è necessario specificare un ID risorsa completo. Gli ID di definizione del ruolo predefiniti sono risorse con ambito sottoscrizione. È consigliabile usare una risorsa existing
per fare riferimento al ruolo predefinito e accedere al relativo ID risorsa completo usando la proprietà .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'
}
}
Entità di sicurezza
La proprietà principalId
deve essere impostata su un GUID che rappresenta l'identificatore Microsoft Entra per l'entità. In Microsoft Entra ID, a volte viene definito ID oggetto.
La proprietà principalType
specifica se l'entità è un utente, un gruppo o un'entità servizio. Le identità gestite sono una forma di entità servizio.
Suggerimento
È importante impostare la proprietà principalType
quando si crea un'assegnazione di ruolo in Bicep. In caso contrario, è possibile che si verifichino errori di distribuzione intermittenti, soprattutto quando si lavora con entità servizio e identità gestite.
L'esempio seguente illustra come creare un'identità gestita assegnata dall'utente e un'assegnazione di ruolo:
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 di eliminazione delle risorse
Quando si elimina un utente, un gruppo, un'entità servizio o un'identità gestita dall'ID Microsoft Entra, è consigliabile eliminare eventuali assegnazioni di ruolo. Non vengono eliminati automaticamente.
Tutte le assegnazioni di ruolo che fanno riferimento a un ID entità eliminato non sono valide. Se si tenta di riutilizzare il nome di un'assegnazione di ruolo per un'altra assegnazione di ruolo, la distribuzione avrà esito negativo. Per ovviare a questo comportamento, è necessario rimuovere l'assegnazione di ruolo precedente prima di ricrearla oppure assicurarsi di usare un nome univoco quando si distribuisce una nuova assegnazione di ruolo. Questo modello di avvio rapido illustra come definire un'assegnazione di ruolo in un modulo Bicep e usare un ID entità come valore di inizializzazione per il nome dell'assegnazione di ruolo.
Definizioni di ruolo personalizzate
Le definizioni di ruolo personalizzate consentono di definire un set di autorizzazioni che possono quindi essere assegnate a un'entità usando un'assegnazione di ruolo. Per altre informazioni sulle definizioni dei ruoli, vedere Informazioni sulle definizioni dei ruoli di Azure.
Per creare una definizione di ruolo personalizzata, definire una risorsa di tipo Microsoft.Authorization/roleDefinitions
. Per un esempio, vedere l'argomento di avvio rapido Creare un nuovo ruolo tramite una distribuzione a livello di sottoscrizione.
I nomi delle risorse di definizione del ruolo devono essere univoci all'interno del tenant di Microsoft Entra, anche se gli ambiti assegnabili sono più stretti.
Nota
Alcuni servizi gestiscono definizioni di ruolo e assegnazioni personalizzate. Ad esempio, Azure Cosmos DB gestisce le proprie risorse Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments
e Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions
. Per altre informazioni, vedere la documentazione specifica del servizio.
Risorse correlate
- Documentazione delle risorse
- Risorse di estensione
- Ambiti
- Modelli di Guida introduttiva
- Creare un nuovo ruolo def tramite una distribuzione a livello di sottoscrizione
- Assegnare un ruolo nell'ambito della sottoscrizione
- Assegnare un ruolo nell'ambito del tenant
- Creare un gruppo di risorse, applicare un blocco e un controllo degli accessi in base al ruolo
- Creare un insieme di credenziali delle chiavi, un'identità gestita e un'assegnazione di ruolo
- Post di blog della community
- Creare assegnazioni di ruolo per ambiti diversi con Bicep, di Barbara Forbes