Attribuer des rôles Azure avec des modèles Azure Resource Manager

Le contrôle d’accès en fonction du rôle Azure (Azure RBAC) est le système d’autorisation que vous utilisez pour gérer l’accès aux ressources Azure. Pour accorder l’accès, vous devez attribuer des rôles aux utilisateurs, aux groupes, aux principaux de service ou aux identités managées avec une étendue particulière. Outre l’utilisation d’Azure PowerShell ou d’Azure CLI, vous pouvez attribuer des rôles à l’aide de modèles Azure Resource Manager. Les modèles peuvent être utiles si vous devez déployer les ressources de manière cohérente et répétée. Cet article explique comment attribuer des rôles à l’aide de modèles.

Remarque

Bicep est un nouveau langage pour la définition de vos ressources Azure. Il offre une expérience de création plus simple que JSON ainsi que d’autres fonctionnalités qui permettent d’améliorer la qualité de votre infrastructure en tant que code. Nous recommandons à toute personne débutant avec l’infrastructure en tant que code sur Azure d’utiliser Bicep au lieu de JSON.

Pour en savoir plus sur la définition des attributions de rôles à l’aide de Bicep, consultez Créer des ressources RBAC Azure à l’aide de Bicep. Pour un exemple de démarrage rapide, consultez Démarrage rapide : Attribuer un rôle Azure à l’aide de Bicep.

Prérequis

Pour attribuer des rôles Azure, vous devez disposer de :

Vous devez utiliser les versions suivantes :

  • 2018-09-01-preview ou version ultérieure pour attribuer un rôle Azure à un nouveau principal de service
  • 2020-04-01-preview ou version ultérieure pour attribuer un rôle Azure au niveau de l’étendue des ressources
  • 2022-04-01 est la première version stable

Pour plus d’informations, consultez Versions des API REST Azure RBAC.

Récupérer des ID d’objet

Pour attribuer un rôle, vous devez spécifier l’ID de l’utilisateur, du groupe ou de l’application auxquels vous souhaitez attribuer le rôle. L’ID a le format : 11111111-1111-1111-1111-111111111111. Vous pouvez récupérer l’ID à l’aide du Portail Azure, d’Azure PowerShell ou d’Azure CLI.

Utilisateur

Pour récupérer l’ID d’un utilisateur, vous pouvez utiliser les commandes Get-AzADUser ou az ad user show.

$objectid = (Get-AzADUser -DisplayName "{name}").id
objectid=$(az ad user show --id "{email}" --query id --output tsv)

Groupe

Pour récupérer l’ID d’un groupe, vous pouvez utiliser les commandes Get-AzADGroup ou az ad group show.

$objectid = (Get-AzADGroup -DisplayName "{name}").id
objectid=$(az ad group show --group "{name}" --query id --output tsv)

Identités managées

Pour obtenir l’ID d’une identité managée, vous pouvez utiliser les commandes Get-AzAdServiceprincipal ou 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)

Application

Pour récupérer l’ID d’un principal de service (identité utilisée par une application), vous pouvez utiliser les commandes Get-AzADServicePrincipal ou az ad sp list. Pour un principal de service, utilisez l’ID d’objet et non l’ID d’application.

$objectid = (Get-AzADServicePrincipal -DisplayName "{name}").id
objectid=$(az ad sp list --display-name "{name}" --query [].id --output tsv)

Affecter un rôle Azure

Dans Azure RBAC, vous attribuez un rôle pour accorder un accès.

Étendue du groupe de ressources (sans paramètres)

Le modèle suivant illustre une façon très simple d’attribuer un rôle. Certaines valeurs sont spécifiées dans le modèle. Le modèle suivant montre comment :

  • Attribuer un rôle lecteur à un utilisateur, un groupe ou une application dans une étendue de groupe de ressources

Pour utiliser le modèle, vous devez effectuer les opérations suivantes :

  • Créez un fichier JSON et copiez le modèle.
  • Remplacez <your-principal-id> par l’ID d’un utilisateur, d’un groupe, d’une identité managée ou d’une application auxquels attribuer le rôle
{
    "$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>"
            }
        }
    ]
}

Les exemples suivants, avec les commandes New-AzResourceGroupDeployment et az deployment group create, montrent comment démarrer le déploiement dans un groupe de ressources nommé ExampleGroup.

New-AzResourceGroupDeployment -ResourceGroupName ExampleGroup -TemplateFile rbac-test.json
az deployment group create --resource-group ExampleGroup --template-file rbac-test.json

L’exemple suivant illustre l’attribution du rôle lecteur à un utilisateur pour un groupe de ressources après le déploiement du modèle.

Role assignment at resource group scope

Étendue du groupe de ressources ou de l’abonnement

Le modèle précédent n’est pas très flexible. Le modèle suivant utilise des paramètres et peut s’appliquer à différentes étendues. Le modèle suivant montre comment :

  • Attribuer un rôle à un utilisateur, un groupe ou une application dans une étendue de groupe de ressources ou d’abonnement
  • Spécifier les rôles Propriétaire, Collaborateur et Lecteur comme paramètre

Pour utiliser le modèle, vous devez spécifier les entrées suivantes :

  • L’ID d’un utilisateur, d’un groupe, d’une identité managée ou d’une application auxquels attribuer le rôle
  • Un identificateur unique qui sera utilisé pour l’attribution de rôle, ou vous pouvez utiliser l’ID par défaut
{
    "$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')]"
            }
        }
    ]
}

Remarque

Ce modèle n’est pas idempotent, à moins que la même valeur de roleNameGuid soit fournie comme paramètre pour chaque déploiement du modèle. Si aucune valeur de roleNameGuid n’est fournie, par défaut, un nouveau GUID est généré à chaque déploiement et les déploiements suivants échouent avec une erreur Conflict: RoleAssignmentExists.

L’étendue de l’attribution de rôle est déterminée à partir du niveau du déploiement. Les exemples suivants, avec les commandes New-AzResourceGroupDeployment et az deployment group create, montrent comment démarrer le déploiement dans une étendue de groupe de ressources.

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

Les exemples suivants, avec les commandes New-AzDeployment et az deployment sub create, montrent comment démarrer le déploiement dans une étendue d’abonnement et spécifier l’emplacement.

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

Étendue des ressources

Si vous avez besoin d’attribuer un rôle au niveau d’une ressource, définissez la propriété scope de l’attribution de rôle sur le nom de la ressource.

Le modèle suivant montre comment :

  • Création d’un nouveau compte de stockage
  • Attribuer un rôle à un utilisateur, un groupe ou une application dans l’étendue d’un compte de stockage
  • Spécifier les rôles Propriétaire, Collaborateur et Lecteur comme paramètre

Pour utiliser le modèle, vous devez spécifier les entrées suivantes :

  • L’ID d’un utilisateur, d’un groupe, d’une identité managée ou d’une application auxquels attribuer le rôle
{
    "$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')]"
            }
        }
    ]
}

Pour déployer le modèle précédent, vous devez utiliser les commandes de groupe de ressources. Les exemples suivants, avec les commandes New-AzResourceGroupDeployment et az deployment group create, montrent comment démarrer le déploiement dans une étendue de ressource.

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’exemple suivant illustre l’attribution du rôle contributeur à un utilisateur pour un compte de stockage après le déploiement du modèle.

Role assignment at resource scope

Nouveau principal de service

Dans certains cas, si vous créez un principal de service et que vous tentez immédiatement de lui attribuer un rôle, cette attribution peut échouer. Par exemple, si vous créez une identité managée et que vous tentez d’attribuer un rôle à ce principal de service dans le même modèle Azure Resource Manager, l’attribution de rôle peut échouer. Cet échec est souvent lié au délai de réplication. Le principal du service est créé dans une région. Toutefois, l’attribution de rôle peut s’effectuer dans une autre région, qui n’a pas encore répliqué le principal de service.

Dans le cadre de ce scénario, vous devez définir la propriété principalType sur ServicePrincipal lors de la création de l’attribution de rôle. Vous devez également définir apiVersion de l’attribution de rôle sur 2018-09-01-preview ou une version ultérieure. 2022-04-01 est la première version stable.

Le modèle suivant montre comment :

  • Créer un principal de service d’identité managée
  • Spécifier le principalType
  • Attribuer le rôle contributeur à ce principal de service dans une étendue de groupe de ressources

Pour utiliser le modèle, vous devez spécifier les entrées suivantes :

  • Le nom de base de l’identité managée. Vous pouvez également utiliser la chaîne par défaut.
{
    "$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"
            }
        }
    ]
}

Les exemples suivants, avec les commandes New-AzResourceGroupDeployment et az deployment group create, montrent comment démarrer le déploiement dans une étendue de groupe de ressources.

New-AzResourceGroupDeployment -ResourceGroupName ExampleGroup2 -TemplateFile rbac-test.json
az deployment group create --resource-group ExampleGroup2 --template-file rbac-test.json

L’exemple suivant illustre l’attribution du rôle contributeur à un nouveau principal de service d’identité managée après le déploiement du modèle.

Role assignment for a new managed identity service principal

Étapes suivantes