Assegnare ruoli di Azure usando i modelli di Azure Resource Manager
Il controllo degli accessi in base al ruolo di Azure è il sistema di autorizzazione che si usa per gestire l'accesso alle risorse di Azure. Per concedere l'accesso, assegnare ruoli a utenti, gruppi, entità servizio o identità gestite in un ambito specifico. Oltre a usare Azure PowerShell o l'interfaccia della riga di comando di Azure, è possibile assegnare ruoli usando i modelli di Azure Resource Manager. I modelli possono essere usati per distribuire le risorse in modo coerente e ripetuto. Questo articolo descrive come assegnare ruoli usando i modelli.
Nota
Bicep è un nuovo linguaggio per la definizione delle risorse di Azure. Offre un'esperienza di creazione più semplice rispetto a JSON, insieme ad altre funzionalità che contribuiscono a migliorare la qualità dell'infrastruttura come codice. Si consiglia a chiunque non abbia familiarità con l'infrastruttura come codice in Azure di usare Bicep invece di JSON.
Per informazioni su come definire le assegnazioni di ruolo usando Bicep, vedere Creare risorse di Controllo degli accessi in base al ruolo di Azure usando Bicep. Per un esempio di avvio rapido, vedere Avvio rapido: Assegnare un ruolo di Azure usando Bicep.
Prerequisiti
Per assegnare ruoli di Azure, è necessario disporre di:
Microsoft.Authorization/roleAssignments/write
autorizzazioni, ad esempio Controllo di accesso Amministrazione istrator basato su ruoli o accesso utente Amministrazione istrator
È necessario usare le versioni seguenti:
2018-09-01-preview
o versione successiva per assegnare un ruolo di Azure a una nuova entità servizio2020-04-01-preview
o versione successiva per assegnare un ruolo di Azure nell'ambito della risorsa2022-04-01
è la prima versione stabile
Per altre informazioni, vedere Versioni API delle API REST di Controllo degli accessi in base al ruolo di Azure.
Recuperare ID oggetto
Per assegnare un ruolo, è necessario specificare l'ID dell'utente, del gruppo o dell'applicazione a cui si vuole assegnare il ruolo. Il formato dell'ID è il seguente: 11111111-1111-1111-1111-111111111111
. È possibile ottenere l'ID tramite il portale di Azure, Azure PowerShell o l'interfaccia della riga di comando di Azure.
User
Per ottenere l'ID di un utente, è possibile usare i comandi Get-AzADUser o az ad user show.
$objectid = (Get-AzADUser -DisplayName "{name}").id
objectid=$(az ad user show --id "{email}" --query id --output tsv)
Raggruppa
Per ottenere l'ID di un gruppo, è possibile usare i comandi Get-AzADGroup o az ad group show.
$objectid = (Get-AzADGroup -DisplayName "{name}").id
objectid=$(az ad group show --group "{name}" --query id --output tsv)
Identità gestite
Per ottenere l'ID di un'identità gestita, è possibile usare i comandi Get-AzAdServiceprincipal o az ad sp .
$objectid = (Get-AzADServicePrincipal -DisplayName <Azure resource name>).id
objectid=$(az ad sp list --display-name <Azure resource name> --query [].id --output tsv)
Applicazione
Per ottenere l'ID di un'entità servizio (identità usata da un'applicazione), è possibile usare i comandi Get-AzADServicePrincipal o az ad sp list. Per un'entità servizio usare l'ID oggetto, non l'ID applicazione.
$objectid = (Get-AzADServicePrincipal -DisplayName "{name}").id
objectid=$(az ad sp list --display-name "{name}" --query [].id --output tsv)
Assegnare un ruolo di Azure
In Controllo degli accessi in base al ruolo di Azure, per concedere l'accesso, si assegna un ruolo.
Ambito del gruppo di risorse (senza parametri)
Il modello seguente illustra un modo di base per assegnare un ruolo. Alcuni valori sono specificati all'interno del modello. Il modello seguente illustra:
- Come assegnare il ruolo Lettore a un utente, un gruppo o un'applicazione nell'ambito di un gruppo di risorse
Per usare il modello, è necessario:
- Creare un nuovo file JSON e copiare il modello
- Sostituire
<your-principal-id>
con l'ID di un utente, un gruppo, un'identità gestita o un'applicazione a cui assegnare il ruolo
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [
{
"type": "Microsoft.Authorization/roleAssignments",
"apiVersion": "2022-04-01",
"name": "[guid(resourceGroup().id)]",
"properties": {
"roleDefinitionId": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]",
"principalId": "<your-principal-id>"
}
}
]
}
Di seguito sono riportati esempi di comandi New-AzResourceGroupDeployment e az deployment group create per informazioni su come avviare la distribuzione in un gruppo di risorse denominato ExampleGroup.
New-AzResourceGroupDeployment -ResourceGroupName ExampleGroup -TemplateFile rbac-test.json
az deployment group create --resource-group ExampleGroup --template-file rbac-test.json
L'esempio seguente illustra un'assegnazione del ruolo Lettore a un utente per un gruppo di risorse dopo la distribuzione del modello.
Ambito del gruppo di risorse o della sottoscrizione
Il modello precedente non è molto flessibile. Il modello seguente usa parametri e può essere usato in ambiti diversi. Il modello seguente illustra:
- Come assegnare un ruolo a un utente, un gruppo o un'applicazione nell'ambito di un gruppo di risorse o di una sottoscrizione
- Come specificare i ruoli proprietario, collaboratore e lettore come parametro
Per usare il modello, è necessario specificare gli input seguenti:
- ID di un utente, un gruppo, un'identità gestita o un'applicazione a cui assegnare il ruolo
- Un ID univoco che verrà usato per l'assegnazione del ruolo. In alternativa, è possibile usare l'ID predefinito
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"principalId": {
"type": "string",
"metadata": {
"description": "The principal to assign the role to"
}
},
"builtInRoleType": {
"type": "string",
"allowedValues": [
"Owner",
"Contributor",
"Reader"
],
"metadata": {
"description": "Built-in role to assign"
}
},
"roleNameGuid": {
"type": "string",
"defaultValue": "[newGuid()]",
"metadata": {
"description": "A new GUID used to identify the role assignment"
}
}
},
"variables": {
"Owner": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', '8e3af657-a8ff-443c-a75c-2fe8c4bcb635')]",
"Contributor": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]",
"Reader": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]"
},
"resources": [
{
"type": "Microsoft.Authorization/roleAssignments",
"apiVersion": "2022-04-01",
"name": "[parameters('roleNameGuid')]",
"properties": {
"roleDefinitionId": "[variables(parameters('builtInRoleType'))]",
"principalId": "[parameters('principalId')]"
}
}
]
}
Nota
Questo modello non è idempotente, a meno che non venga specificato lo stesso valore di roleNameGuid
come parametro per ogni distribuzione del modello. Se non viene specificato alcun valore di roleNameGuid
, per impostazione predefinita viene generato un nuovo GUID per ogni distribuzione e le distribuzioni successive avranno esito negativo con la visualizzazione di un errore Conflict: RoleAssignmentExists
.
L'ambito dell'assegnazione del ruolo è determinato dal livello della distribuzione. Di seguito sono riportati esempi di comandi New-AzResourceGroupDeployment e az deployment group create per l'avvio della distribuzione in un ambito del gruppo di risorse.
New-AzResourceGroupDeployment -ResourceGroupName ExampleGroup -TemplateFile rbac-test.json -principalId $objectid -builtInRoleType Reader
az deployment group create --resource-group ExampleGroup --template-file rbac-test.json --parameters principalId=$objectid builtInRoleType=Reader
Di seguito sono riportati esempi di comandi New-AzDeployment e az deployment sub create per informazioni su come avviare la distribuzione in un ambito di sottoscrizione e specificare il percorso.
New-AzDeployment -Location centralus -TemplateFile rbac-test.json -principalId $objectid -builtInRoleType Reader
az deployment sub create --location centralus --template-file rbac-test.json --parameters principalId=$objectid builtInRoleType=Reader
Ambito risorsa
Se è necessario assegnare un ruolo al livello di una risorsa, impostare la proprietà nell'assegnazione scope
di ruolo sul nome della risorsa.
Il modello seguente illustra:
- Come creare un nuovo account di archiviazione
- Come assegnare un ruolo a un utente, un gruppo o un'applicazione nell'ambito dell'account di archiviazione
- Come specificare i ruoli proprietario, collaboratore e lettore come parametro
Per usare il modello, è necessario specificare gli input seguenti:
- ID di un utente, un gruppo, un'identità gestita o un'applicazione a cui assegnare il ruolo
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"principalId": {
"type": "string",
"metadata": {
"description": "The principal to assign the role to"
}
},
"builtInRoleType": {
"type": "string",
"allowedValues": [
"Owner",
"Contributor",
"Reader"
],
"metadata": {
"description": "Built-in role to assign"
}
},
"roleNameGuid": {
"type": "string",
"defaultValue": "[newGuid()]",
"metadata": {
"description": "A new GUID used to identify the role assignment"
}
},
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]"
}
},
"variables": {
"Owner": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', '8e3af657-a8ff-443c-a75c-2fe8c4bcb635')]",
"Contributor": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]",
"Reader": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]",
"storageName": "[concat('storage', uniqueString(resourceGroup().id))]"
},
"resources": [
{
"apiVersion": "2019-04-01",
"type": "Microsoft.Storage/storageAccounts",
"name": "[variables('storageName')]",
"location": "[parameters('location')]",
"sku": {
"name": "Standard_LRS"
},
"kind": "Storage",
"properties": {}
},
{
"type": "Microsoft.Authorization/roleAssignments",
"apiVersion": "2022-04-01",
"name": "[parameters('roleNameGuid')]",
"scope": "[concat('Microsoft.Storage/storageAccounts', '/', variables('storageName'))]",
"dependsOn": [
"[variables('storageName')]"
],
"properties": {
"roleDefinitionId": "[variables(parameters('builtInRoleType'))]",
"principalId": "[parameters('principalId')]"
}
}
]
}
Per distribuire il modello precedente, usare i comandi del gruppo di risorse. Di seguito sono riportati esempi di comandi New-AzResourceGroupDeployment e az deployment group create per l'avvio della distribuzione in un ambito di risorsa.
New-AzResourceGroupDeployment -ResourceGroupName ExampleGroup -TemplateFile rbac-test.json -principalId $objectid -builtInRoleType Contributor
az deployment group create --resource-group ExampleGroup --template-file rbac-test.json --parameters principalId=$objectid builtInRoleType=Contributor
L'esempio seguente illustra un'assegnazione del ruolo Collaboratore a un utente per un account di archiviazione dopo la distribuzione del modello.
Nuova entità servizio
Se si crea una nuova entità servizio e si prova ad assegnare subito un ruolo a tale entità, in alcuni casi l'assegnazione di ruolo può avere esito negativo. Se ad esempio si crea una nuova identità gestita e si prova quindi ad assegnare un ruolo a tale entità nello stesso modello di Azure Resource Manager, l'assegnazione del ruolo potrebbe avere esito negativo. Il motivo di questo errore è probabilmente un ritardo di replica. L'entità servizio viene creata in un'area. L'assegnazione di ruolo potrebbe tuttavia verificarsi in un'area diversa che non ha ancora replicato l'entità servizio.
Per far fronte a questo scenario, è necessario impostare la proprietà principalType
su ServicePrincipal
quando si crea l'assegnazione di ruolo. È anche necessario impostare il valore di apiVersion
dell'assegnazione di ruolo su 2018-09-01-preview
o su una versione successiva. 2022-04-01
è la prima versione stabile.
Il modello seguente illustra:
- Come creare una nuova entità servizio dell'identità gestita
- Come specificare la proprietà
principalType
- Come assegnare il ruolo Collaboratore a tale entità servizio nell'ambito di un gruppo di risorse
Per usare il modello, è necessario specificare gli input seguenti:
- Nome di base dell'identità gestita. In alternativa, è possibile usare la stringa predefinita
{
"$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"baseName": {
"type": "string",
"defaultValue": "msi-test"
}
},
"variables": {
"identityName": "[concat(parameters('baseName'), '-bootstrap')]",
"bootstrapRoleAssignmentId": "[guid(concat(resourceGroup().id, 'contributor'))]",
"contributorRoleDefinitionId": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]"
},
"resources": [
{
"type": "Microsoft.ManagedIdentity/userAssignedIdentities",
"name": "[variables('identityName')]",
"apiVersion": "2018-11-30",
"location": "[resourceGroup().location]"
},
{
"type": "Microsoft.Authorization/roleAssignments",
"apiVersion": "2022-04-01",
"name": "[variables('bootstrapRoleAssignmentId')]",
"dependsOn": [
"[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('identityName'))]"
],
"properties": {
"roleDefinitionId": "[variables('contributorRoleDefinitionId')]",
"principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('identityName')), '2018-11-30').principalId]",
"principalType": "ServicePrincipal"
}
}
]
}
Di seguito sono riportati esempi di comandi New-AzResourceGroupDeployment e az deployment group create per l'avvio della distribuzione in un ambito del gruppo di risorse.
New-AzResourceGroupDeployment -ResourceGroupName ExampleGroup2 -TemplateFile rbac-test.json
az deployment group create --resource-group ExampleGroup2 --template-file rbac-test.json
L'esempio seguente illustra un'assegnazione del ruolo Collaboratore a un'entità servizio dell'identità gestita dopo la distribuzione del modello.