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:

È necessario usare le versioni seguenti:

  • 2018-09-01-preview o versione successiva per assegnare un ruolo di Azure a una nuova entità servizio
  • 2020-04-01-preview o versione successiva per assegnare un ruolo di Azure nell'ambito della risorsa
  • 2022-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.

Role assignment at resource group scope

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.

Role assignment at resource scope

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.

Role assignment for a new managed identity service principal

Passaggi successivi