Ajouter des attributions de rôle Azure à l’aide de modèles Azure Resource ManagerAdd Azure role assignments using Azure Resource Manager templates

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.Azure role-based access control (Azure RBAC) is the authorization system you use to manage access to Azure resources. 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.To grant access, you assign roles to users, groups, service principals, or managed identities at a particular scope. En plus d’utiliser Azure PowerShell ou l’interface Azure CLI, vous pouvez attribuer des rôles à l’aide 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.Azure role-based access control (Azure RBAC) is the authorization system you use to manage access to Azure resources. 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.To grant access, you assign roles to users, groups, service principals, or managed identities at a particular scope. In addition to using Azure PowerShell or the Azure CLI, you can assign roles using Azure Resource Manager templates. Les modèles peuvent être utiles si vous devez déployer les ressources de manière cohérente et répétée.Templates can be helpful if you need to deploy resources consistently and repeatedly. Cet article explique comment attribuer des rôles à l’aide de modèles.This article describes how to assign roles using templates.

Récupérer des ID d’objetGet object IDs

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.To assign a role, you need to specify the ID of the user, group, or application you want to assign the role to. L’ID a le format : 11111111-1111-1111-1111-111111111111.The ID has the 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.You can get the ID using the Azure portal, Azure PowerShell, or Azure CLI.

UtilisateurUser

Pour récupérer l’ID d’un utilisateur, vous pouvez utiliser les commandes Get-AzADUser ou az ad user show.To get the ID of a user, you can use the Get-AzADUser or az ad user show commands.

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

GroupeGroup

Pour récupérer l’ID d’un groupe, vous pouvez utiliser les commandes Get-AzADGroup ou az ad group show.To get the ID of a group, you can use the Get-AzADGroup or az ad group show commands.

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

Identités managéesManaged identities

Pour obtenir l’ID d’une identité managée, vous pouvez utiliser les commandes Get-AzAdServiceprincipal ou az ad sp.To get the ID of a managed identity, you can use Get-AzAdServiceprincipal or az ad sp commands.

$objectid = (Get-AzADServicePrincipal -DisplayName <Azure resource name>).id
objectid=$(az ad sp list --display-name <Azure resource name> --query [].objectId --output tsv)

ApplicationApplication

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.To get the ID of a service principal (identity used by an application), you can use the Get-AzADServicePrincipal or az ad sp list commands. Pour un principal de service, utilisez l’ID d’objet et non l’ID d’application.For a service principal, use the object ID and not the application ID.

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

Ajouter une attribution de rôleAdd a role assignment

Dans Azure RBAC, vous ajoutez une attribution de rôle pour accorder l’accès.In Azure RBAC, to grant access, you add a role assignment.

Étendue du groupe de ressources (sans paramètres)Resource group scope (without parameters)

Le modèle suivant montre comment ajouter de façon très simple une attribution de rôle.The following template shows a basic way to add a role assignment. Certaines valeurs sont spécifiées dans le modèle.Some values are specified within the template. Le modèle suivant montre comment :The following template demonstrates:

  • Attribuer un rôle lecteur à un utilisateur, un groupe ou une application dans une étendue de groupe de ressourcesHow to assign the Reader role to a user, group, or application at a resource group scope

Pour utiliser le modèle, vous devez effectuer les opérations suivantes :To use the template, you must do the following:

  • Créez un fichier JSON et copiez le modèle.Create a new JSON file and copy the template
  • 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ôleReplace <your-principal-id> with the ID of a user, group, managed identity, or application to assign the role to
{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "resources": [
        {
            "type": "Microsoft.Authorization/roleAssignments",
            "apiVersion": "2018-09-01-preview",
            "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.Here are example New-AzResourceGroupDeployment and az deployment group create commands for how to start the deployment in a resource group named 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.The following shows an example of the Reader role assignment to a user for a resource group after deploying the template.

Attribution de rôle dans une étendue de groupe de ressources

Étendue du groupe de ressources ou de l’abonnementResource group or subscription scope

Le modèle précédent n’est pas très flexible.The previous template isn't very flexible. Le modèle suivant utilise des paramètres et peut s’appliquer à différentes étendues.The following template uses parameters and can be used at different scopes. Le modèle suivant montre comment :The following template demonstrates:

  • Attribuer un rôle à un utilisateur, un groupe ou une application dans une étendue de groupe de ressources ou d’abonnementHow to assign a role to a user, group, or application at either a resource group or subscription scope
  • Spécifier les rôles Propriétaire, Collaborateur et Lecteur comme paramètreHow to specify the Owner, Contributor, and Reader roles as a parameter

Pour utiliser le modèle, vous devez spécifier les entrées suivantes :To use the template, you must specify the following inputs:

  • L’ID d’un utilisateur, d’un groupe, d’une identité managée ou d’une application auxquels attribuer le rôleThe ID of a user, group, managed identity, or application to assign the role to
  • Un identificateur unique qui sera utilisé pour l’attribution de rôle, ou vous pouvez utiliser l’ID par défautA unique ID that will be used for the role assignment, or you can use the default ID
{
    "$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": "2018-09-01-preview",
            "name": "[parameters('roleNameGuid')]",
            "properties": {
                "roleDefinitionId": "[variables(parameters('builtInRoleType'))]",
                "principalId": "[parameters('principalId')]"
            }
        }
    ]
}

Notes

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.This template is not idempotent unless the same roleNameGuid value is provided as a parameter for each deployment of the template. 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.If no roleNameGuid is provided, by default a new GUID is generated on each deployment and subsequent deployments will fail with a Conflict: RoleAssignmentExists error.

L’étendue de l’attribution de rôle est déterminée à partir du niveau du déploiement.The scope of the role assignment is determined from the level of the deployment. 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.Here are example New-AzResourceGroupDeployment and az deployment group create commands for how to start the deployment at a resource group scope.

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.Here are example New-AzDeployment and az deployment sub create commands for how to start the deployment at a subscription scope and specify the location.

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 ressourcesResource scope

Si vous avez besoin d’ajouter une attribution de rôle au niveau d’une ressource, définissez la propriété scope de l’attribution de rôle à l’aide du nom de la ressource.If you need to add a role assignment at the level of a resource, set the scope property on the role assignment to the name of the resource.

Le modèle suivant montre comment :The following template demonstrates:

  • Création d’un nouveau compte de stockageHow to create a new storage account
  • Attribuer un rôle à un utilisateur, un groupe ou une application dans l’étendue d’un compte de stockageHow to assign a role to a user, group, or application at the storage account scope
  • Spécifier les rôles Propriétaire, Collaborateur et Lecteur comme paramètreHow to specify the Owner, Contributor, and Reader roles as a parameter

Pour utiliser le modèle, vous devez spécifier les entrées suivantes :To use the template, you must specify the following inputs:

  • L’ID d’un utilisateur, d’un groupe, d’une identité managée ou d’une application auxquels attribuer le rôleThe ID of a user, group, managed identity, or application to assign the role to
{
    "$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": "2020-04-01-preview",
            "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.To deploy the previous template, you use the resource group commands. 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.Here are example New-AzResourceGroupDeployment and az deployment group create commands for how to start the deployment at a resource scope.

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.The following shows an example of the Contributor role assignment to a user for a storage account after deploying the template.

Attribution de rôle dans une étendue de ressource

Nouveau principal de serviceNew service principal

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.If you create a new service principal and immediately try to assign a role to that service principal, that role assignment can fail in some cases. 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.For example, if you create a new managed identity and then try to assign a role to that service principal in the same Azure Resource Manager template, the role assignment might fail. Cet échec est souvent lié au délai de réplication.The reason for this failure is likely a replication delay. 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.The service principal is created in one region; however, the role assignment might occur in a different region that hasn't replicated the service principal yet.

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.To address this scenario, you should set the principalType property to ServicePrincipal when creating the role assignment. Vous devez également définir apiVersion de l’attribution de rôle sur 2018-09-01-preview ou une version ultérieure.You must also set the apiVersion of the role assignment to 2018-09-01-preview or later.

Le modèle suivant montre comment :The following template demonstrates:

  • Créer un principal de service d’identité managéeHow to create a new managed identity service principal
  • Spécifier le principalTypeHow to specify the principalType
  • Attribuer le rôle contributeur à ce principal de service dans une étendue de groupe de ressourcesHow to assign the Contributor role to that service principal at a resource group scope

Pour utiliser le modèle, vous devez spécifier les entrées suivantes :To use the template, you must specify the following inputs:

  • Le nom de base de l’identité managée. Vous pouvez également utiliser la chaîne par défaut.The base name of the managed identity, or you can use the default string
{
    "$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": "2018-09-01-preview",
            "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.Here are example New-AzResourceGroupDeployment and az deployment group create commands for how to start the deployment at a resource group scope.

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.The following shows an example of the Contributor role assignment to a new managed identity service principal after deploying the template.

Attribution de rôle pour un nouveau principal de service d’identité managée

Supprimer une attribution de rôleRemove a role assignment

Dans Azure RBAC, vous devez supprimer l’attribution de rôle pour supprimer l’accès à une ressource Azure.In Azure RBAC, to remove access to an Azure resource, you remove the role assignment. Il n’existe aucun moyen de supprimer une attribution de rôle à l’aide d’un modèle.There isn't a way to remove a role assignment using a template. Pour supprimer une attribution de rôle, vous devez utiliser d’autres outils tels que :To remove a role assignment, you must use other tools such as:

Étapes suivantesNext steps