Ajouter ou modifier des conditions d’attribution de rôle Azure à l’aide d’Azure PowerShell

Une condition d’attribution de rôle Azure est une vérification supplémentaire que vous pouvez éventuellement ajouter à votre attribution de rôle pour fournir un contrôle d’accès plus précis. Par exemple, vous pouvez ajouter une condition qui oblige un objet à porter une étiquette spécifique pour être lu. Cet article explique comment ajouter, modifier, lister ou supprimer des conditions pour vos attributions de rôles à l’aide d’Azure PowerShell.

Prérequis

Pour plus d’informations sur les prérequis à l’ajout ou à la modification des conditions d’attribution de rôle, consultez Prérequis aux conditions.

Ajouter une condition

Pour ajouter une condition d’attribution de rôle, utilisez New-AzRoleAssignment. La commande New-AzRoleAssignment comprend les paramètres suivants liés aux conditions.

Paramètre Type Description
Condition Chaîne Condition sous laquelle l’utilisateur peut se voir accorder une autorisation.
ConditionVersion Chaîne Version de la syntaxe de condition. Doit être défini sur 2.0. Si Condition est spécifié, ConditionVersion doit également être spécifié.

L’exemple suivant montre comment initialiser les variables pour attribuer le rôle Lecteur des données Blob du stockage avec une condition. La condition vérifie si le nom du conteneur correspond à « blobs-example-container ».

$subscriptionId = "<subscriptionId>"
$resourceGroup = "<resourceGroup>"
$roleDefinitionName = "Storage Blob Data Reader"
$roleDefinitionId = "2a2b9908-6ea1-4ae2-8e65-a410df84e7d1"
$userObjectId = "<userObjectId>"
$scope = "/subscriptions/$subscriptionId/resourceGroups/$resourceGroup"
$description = "Read access if container name equals blobs-example-container"
$condition = "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container'))"
$conditionVersion = "2.0"

Utilisez New-AzRoleAssignment pour attribuer le rôle avec une condition.

New-AzRoleAssignment -ObjectId $userObjectId -Scope $scope -RoleDefinitionId $roleDefinitionId -Description $description -Condition $condition -ConditionVersion $conditionVersion

Voici un exemple de sortie :

RoleAssignmentId   : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/Microsoft.Authorization/roleAssignments/<roleAssignmentId>
Scope              : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>
DisplayName        : User1
SignInName         : user1@contoso.com
RoleDefinitionName : Storage Blob Data Reader
RoleDefinitionId   : 2a2b9908-6ea1-4ae2-8e65-a410df84e7d1
ObjectId           : <userObjectId>
ObjectType         : User
CanDelegate        : False
Description        : Read access if container name equals blobs-example-container
ConditionVersion   : 2.0
Condition          : ((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container'))

Dans PowerShell, si votre condition comprend un signe dollar ($), vous devez le faire précéder d’un guillemet inversé (`). Par exemple, la condition suivante utilise des signes dollar pour délimiter le nom de clé d’étiquette. Pour plus d’informations sur les règles de liées aux guillemets dans PowerShell, consultez À propos des règles liées aux guillemets.

$condition = "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<`$key_case_sensitive`$>] StringEquals 'Cascade'))"

Modifier une condition

Pour modifier une condition d’attribution de rôle existante, utilisez Set-AzRoleAssignment. Seules les propriétés Condition, ConditionVersion et Description peuvent être modifiées. Si vous spécifiez le paramètre -PassThru, Set-AzRoleAssignment retourne l’attribution de rôle mise à jour, ce qui permet la visualisation ou le stockage dans une variable pour une utilisation ultérieure.

Il existe deux façons de modifier une condition. Vous pouvez utiliser l’objet PSRoleAssignment ou un fichier JSON.

Modifier une condition à l’aide de l’objet PSRoleAssignment

  1. Utilisez Get-AzRoleAssignment pour obtenir l’attribution de rôle existante avec une condition comme objet PSRoleAssignment.

    $testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectId
    
  2. Modifiez la condition.

    $condition = "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container' OR @Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container2'))"
    
  3. Initialisez la condition et la description.

    $testRa.Condition = $condition
    $testRa.Description = "Read access if container name equals blobs-example-container or blobs-example-container2"
    
  4. Utilisez Set-AzRoleAssignment pour mettre à jour la condition de l’attribution de rôle.

    Set-AzRoleAssignment -InputObject $testRa -PassThru
    

    Voici un exemple de sortie :

    RoleAssignmentId   : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/Microsoft.Authorization/roleAssignments/<roleAssignmentId>
    Scope              : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>
    DisplayName        : User1
    SignInName         : user1@contoso.com
    RoleDefinitionName : Storage Blob Data Reader
    RoleDefinitionId   : 2a2b9908-6ea1-4ae2-8e65-a410df84e7d1
    ObjectId           : <userObjectId>
    ObjectType         : User
    CanDelegate        : False
    Description        : Read access if container name equals blobs-example-container or blobs-example-container2
    ConditionVersion   : 2.0
    Condition          : ((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container' OR @Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container2'))
    

Modifier une condition à l’aide d’un fichier JSON

Pour modifier une condition, vous pouvez également fournir un fichier JSON comme entrée. Le code suivant montre un exemple de fichier JSON où Condition et Description sont mis à jour. Vous devez spécifier toutes les propriétés dans le fichier JSON pour mettre à jour une condition.

{
    "RoleDefinitionId": "2a2b9908-6ea1-4ae2-8e65-a410df84e7d1",
    "ObjectId": "<userObjectId>",
    "ObjectType": "User",
    "Scope": "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>",
    "Condition": "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container' OR @Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container2'))",
    "ConditionVersion": "2.0",
    "CanDelegate": false,
    "Description": "Read access if container name equals blobs-example-container or blobs-example-container2",
    "RoleAssignmentId": "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/Microsoft.Authorization/roleAssignments/<roleAssignmentId>"
}

Utilisez Set-AzRoleAssignment pour mettre à jour la condition de l’attribution de rôle.

Set-AzRoleAssignment -InputFile "C:\path\roleassignment.json" -PassThru

Voici un exemple de sortie :

RoleAssignmentId   : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/Microsoft.Authorization/roleAssignments/<roleAssignmentId>
Scope              : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>
DisplayName        : User1
SignInName         : user1@contoso.com
RoleDefinitionName : Storage Blob Data Reader
RoleDefinitionId   : 2a2b9908-6ea1-4ae2-8e65-a410df84e7d1
ObjectId           : <userObjectId>
ObjectType         : User
CanDelegate        : False
Description        : Read access if container name equals blobs-example-container or blobs-example-container2
ConditionVersion   : 2.0
Condition          : ((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container' OR @Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container2'))

Modifier les conditions dans plusieurs attributions de rôles

Si vous devez effectuer la même mise à jour vers plusieurs attributions de rôles, vous pouvez utiliser une boucle. Les commandes suivantes effectuent la tâche suivante :

  • Recherche les attributions de rôles dans un abonnement avec les chaînes <find-condition-string-1> ou <find-condition-string-2> dans la condition.

    $tenantId = "<your-tenant-id>"
    $subscriptionId = "<your-subscription-id>";
    $scope = "/subscriptions/$subscriptionId"
    $findConditionString1 = "<find-condition-string-1>"
    $findConditionString2 = "<find-condition-string-2>"
    Connect-AzAccount -TenantId $tenantId -SubscriptionId $subscriptionId
    $roleAssignments = Get-AzRoleAssignment -Scope $scope
    $foundRoleAssignments = $roleAssignments | Where-Object { ($_.Condition -Match $findConditionString1) -Or ($_.Condition -Match $findConditionString2) }
    

Les commandes suivantes effectuent les tâches suivantes :

  • Dans la condition des attributions de rôles trouvées, remplace <condition-string> par <replace-condition-string>.

  • Met à jour les attributions de rôles avec les modifications.

    $conditionString = "<condition-string>"
    $conditionStringReplacement = "<condition-string-replacement>"
    $updatedRoleAssignments = $foundRoleAssignments | ForEach-Object { $_.Condition = $_.Condition -replace $conditionString, $conditionStringReplacement; $_ }
    $updatedRoleAssignments | ForEach-Object { Set-AzRoleAssignment -InputObject $_ -PassThru }
    

Si les chaînes incluent des caractères spéciaux, tels que des crochets ([ ]), vous devez échapper à ces caractères avec une barre oblique inverse (\).

Lister une condition

Pour lister une condition d’attribution de rôle, utilisez Get-AzRoleAssignment. Pour plus d’informations, consultez Lister les attributions de rôles Azure avec Azure PowerShell.

Supprimer une condition

Pour supprimer une condition d’attribution de rôle, modifiez-la en définissant les deux propriétés Condition et ConditionVersion sur une chaîne vide ("") ou $null.

Si vous voulez supprimer à la fois l’attribution de rôle et la condition, vous pouvez également utiliser la commande Remove-AzRoleAssignment. Pour plus d’informations, consultez Supprimer des attributions de rôles Azure.

Étapes suivantes