Utiliser PowerShell pour gérer les listes de contrôle d’accès dans Azure Data Lake Storage Gen2

Cet article explique comment utiliser PowerShell pour récupérer, définir et mettre à jour les listes de contrôle d’accès de répertoires et de fichiers.

L’héritage des listes ACL est déjà disponible pour les nouveaux éléments enfants créés sous un répertoire parent. Toutefois, vous pouvez également ajouter, mettre à jour et supprimer des listes de contrôle d’accès de manière récursive au niveau des éléments enfants existants d’un répertoire parent sans avoir à apporter ces modifications individuellement à chaque élément enfant.

Référence | Envoyer des commentaires

Prérequis

  • Un abonnement Azure. Pour plus d’informations, consultez Obtenir l’essai gratuit Azure.

  • Un compte de stockage doté d’un espace de noms hiérarchique (HNS) activé. Pour créer un test, suivez ces instructions.

  • Azure CLI version 2.6.0 ou ultérieure.

  • Une des autorisations de sécurité suivantes :

    • Un principal de sécurité Microsoft Entra ID provisionné auquel le rôle de propriétaire de données Blob de stockage a été attribué, étendu au conteneur cible, au compte de stockage, au groupe de ressources parent ou à l’abonnement.

    • Utilisateur propriétaire du conteneur ou du répertoire cible auquel vous envisagez d’appliquer les paramètres ACL. Pour définir des listes de contrôle d’accès de façon récursive, cela inclut tous les éléments enfants du conteneur ou du répertoire cible.

    • Clé du compte de stockage.

Installer le module PowerShell

  1. Vérifiez que la version de PowerShell installée est 5.1 ou une version ultérieure à l’aide de la commande suivante.

    echo $PSVersionTable.PSVersion.ToString()
    

    Pour mettre à niveau votre version de PowerShell, consultez Mise à niveau des instances Windows PowerShell existantes.

  2. Installez le module Az.Storage.

    Install-Module Az.Storage -Repository PSGallery -Force  
    

    Pour plus d’informations sur l’installation des modules PowerShell, consultez Installer le module Azure PowerShell.

Se connecter au compte

Choisissez la façon dont vous souhaitez que vos commandes obtiennent l’autorisation pour le compte de stockage.

Option 1 : obtenir une autorisation à l'aide de Microsoft Entra ID

Remarque

Si vous utilisez Microsoft Entra ID pour autoriser l'accès, assurez-vous que le rôle de propriétaire de données Storage Blob a été attribué à votre principal de sécurité. Pour en savoir plus sur l’application des autorisations de liste de contrôle d’accès et les conséquences de leur modification, consultez Modèle de contrôle d’accès dans Azure Data Lake Storage Gen2.

Avec cette approche, le système garantit que votre compte d’utilisateur dispose des autorisations de contrôle d’accès en fonction du rôle Azure (Azure RBAC) appropriées et des autorisations de liste de contrôle d’accès (ACL).

  1. Ouvrez une fenêtre de commande Windows PowerShell, puis connectez-vous à votre abonnement Azure avec la commande Connect-AzAccount et suivez les instructions à l’écran.

    Connect-AzAccount
    
  2. Si votre identité est associée à plusieurs abonnements, définissez comme abonnement actif l’abonnement du compte de stockage dans lequel vous souhaitez créer et gérer des répertoires. Dans cet exemple, remplacez la valeur d’espace réservé <subscription-id> par l’ID de votre abonnement.

    Select-AzSubscription -SubscriptionId <subscription-id>
    
  3. Obtenez le contexte du compte de stockage.

    $ctx = New-AzStorageContext -StorageAccountName '<storage-account-name>' -UseConnectedAccount
    

Option n°2 : Obtenir l’autorisation à l’aide de la clé de compte de stockage

Avec cette approche, le système ne vérifie pas les autorisations Azure RBAC ou ACL. Récupérez le contexte du compte de stockage à l’aide d’une clé de compte.

$ctx = New-AzStorageContext -StorageAccountName '<storage-account-name>' -StorageAccountKey '<storage-account-key>'

Obtenir les listes de contrôle d’accès

Obtenez la liste ACL d’un répertoire ou d’un fichier à l’aide de l’applet de commande Get-AzDataLakeGen2Item.

Cet exemple obtient la liste ACL du répertoire racine d’un conteneur, puis l’affiche sur la console.

$filesystemName = "my-file-system"
$filesystem = Get-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName
$filesystem.ACL

Cet exemple obtient la liste ACL d’un répertoire, puis affiche cette liste ACL dans la console.

$filesystemName = "my-file-system"
$dirname = "my-directory/"
$dir = Get-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName -Path $dirname
$dir.ACL

Cet exemple obtient la liste ACL d’un fichier, puis affiche cette liste ACL dans la console.

$filePath = "my-directory/upload.txt"
$file = Get-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName -Path $filePath
$file.ACL

L’image suivante montre la sortie après l’obtention de la liste ACL d’un répertoire.

Get ACL output for directory

Dans cet exemple, l’utilisateur propriétaire dispose d’autorisations de lecture, d’écriture et d’exécution. Le groupe propriétaire dispose uniquement d’autorisations de lecture et d’exécution. Pour plus d’informations sur les listes de contrôle d’accès, consultez Contrôle d’accès dans Azure Data Lake Storage Gen2.

Définir les listes de contrôle d’accès

Lorsque vous définissez une liste de contrôle d’accès (ACL), vous remplacez l’ensemble de l’ACL, y compris toutes ses entrées. Si vous souhaitez modifier le niveau d’autorisation d’un principal de sécurité ou ajouter un nouveau principal de sécurité à la liste de contrôle d’accès sans affecter d’autres entrées existantes, vous devez mettre à jour l’ACL à la place. Pour mettre à jour une liste de contrôle d’accès au lieu de la remplacer, consultez la section Mettre à jour une liste de contrôle d’accès de cet article.

Si vous choisissez de définir la liste de contrôle d’accès, vous devez ajouter une entrée pour l’utilisateur propriétaire, une entrée pour le groupe propriétaire et une entrée pour tous les autres utilisateurs. Pour en savoir plus sur l’utilisateur propriétaire, le groupe propriétaire et tous les autres utilisateurs, consultez Utilisateurs et identités.

Cette section vous montre comment :

  • Définir une liste de contrôle d’accès
  • Définir des listes de contrôle d’accès de façon récursive

Définir une liste de contrôle d’accès

Utilisez l’applet de commande Set-AzDataLakeGen2ItemAclObject pour créer une liste ACL pour l’utilisateur propriétaire, le groupe propriétaire ou d’autres utilisateurs. Ensuite, utilisez l’applet de commande Update-AzDataLakeGen2Item pour valider la liste ACL.

Cet exemple définit la liste ACL du répertoire racine d’un conteneur pour l’utilisateur propriétaire, le groupe propriétaire ou d’autres utilisateurs, puis affiche cette liste sur la console.

$filesystemName = "my-file-system"
$acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -Permission rw-
$acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType group -Permission rw- -InputObject $acl
$acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType other -Permission -wx -InputObject $acl
Update-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName -Acl $acl
$filesystem = Get-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName
$filesystem.ACL

Cet exemple définit la liste ACL d’un répertoire pour l’utilisateur propriétaire, le groupe propriétaire ou d’autres utilisateurs, puis affiche la liste ACL dans la console.

$filesystemName = "my-file-system"
$dirname = "my-directory/"
$acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -Permission rw-
$acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType group -Permission rw- -InputObject $acl
$acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType other -Permission -wx -InputObject $acl
Update-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName -Path $dirname -Acl $acl
$dir = Get-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName -Path $dirname
$dir.ACL

Notes

Si vous souhaitez définir une entrée de liste de contrôle d’accès par défaut, utilisez le paramètre -DefaultScope quand vous exécutez la commande Set-AzDataLakeGen2ItemAclObject. Par exemple : $acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -Permission rwx -DefaultScope.

Cet exemple définit la liste ACL d’un fichier pour l’utilisateur propriétaire, le groupe propriétaire ou d’autres utilisateurs, puis affiche la liste ACL dans la console.

$filesystemName = "my-file-system"
$filePath = "my-directory/upload.txt"
$acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -Permission rw-
$acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType group -Permission rw- -InputObject $acl
$acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType other -Permission "-wx" -InputObject $acl
Update-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName -Path $filePath -Acl $acl
$file = Get-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName -Path $filePath
$file.ACL

Notes

Pour définir l’ACL d’un groupe ou d’un utilisateur spécifique, d’un principal de service, ou d’une identité managée, utilisez leurs ID d’objet respectifs. Par exemple, pour définir la liste de contrôle d’accès d’un groupe, utilisez group:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx. Pour définir la liste de contrôle d’accès d’un utilisateur, utilisez user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.

L’image suivante montre la sortie après la définition de la liste ACL d’un fichier.

Get ACL output for file

Dans cet exemple, l’utilisateur propriétaire et le groupe propriétaire disposent uniquement des autorisations de lecture et d’écriture. Tous les autres utilisateurs disposent des autorisations d’écriture et d’exécution. Pour plus d’informations sur les listes de contrôle d’accès, consultez Contrôle d’accès dans Azure Data Lake Storage Gen2.

Définir des listes de contrôle d’accès de façon récursive

Définissez des listes de contrôle d’accès de manière récursive à l’aide de la cmdlet Set-AzDataLakeGen2AclRecursive.

Cet exemple définit la liste ACL d’un répertoire nommé my-parent-directory. Ces entrées donnent à l’utilisateur propriétaire des autorisations de lecture, d’écriture et d’exécution, donnent au groupe propriétaire uniquement des autorisations de lecture et d’exécution, et ne donnent à tous les autres aucun accès. La dernière entrée de la liste de contrôle d’accès dans cet exemple donne à un utilisateur spécifique avec l’ID d’objet « xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx » des autorisations de lecture et d’exécution.

$filesystemName = "my-container"
$dirname = "my-parent-directory/"
$userID = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";

$acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -Permission rwx
$acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType group -Permission r-x -InputObject $acl
$acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType other -Permission "---" -InputObject $acl
$acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -EntityId $userID -Permission r-x -InputObject $acl

Set-AzDataLakeGen2AclRecursive -Context $ctx -FileSystem $filesystemName -Path $dirname -Acl $acl

Notes

Si vous souhaitez définir une entrée de liste de contrôle d’accès par défaut, utilisez le paramètre -DefaultScope quand vous exécutez la commande Set-AzDataLakeGen2ItemAclObject. Par exemple : $acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -Permission rwx -DefaultScope.

Pour voir un exemple qui définit des ACL de manière récursive dans des lots en spécifiant une taille de lot, consultez l’article de référence Set-AzDataLakeGen2AclRecursive.

Mettre à jour les ACL

Lorsque vous mettez à jour une liste de contrôle d’accès, vous modifiez l’ACL au lieu de la remplacer. Par exemple, vous pouvez ajouter un nouveau principal de sécurité à la liste de contrôle d’accès sans affecter les autres principaux de sécurité listés dans l’ACL. Pour remplacer la liste de contrôle d’accès au lieu de la mettre à jour, consultez la section Mettre à jour une liste de contrôle d’accès de cet article.

Cette section vous montre comment :

  • Mettre à jour une ACL
  • Mettre à jour les listes de contrôle d’accès de manière récursive

Mettre à jour une ACL

Tout d’abord, obtenez la liste de contrôle d’accès. Ensuite, utilisez l’applet de commande Set-AzDataLakeGen2ItemAclObject pour ajouter ou mettre à jour une entrée de liste de contrôle d’accès. Utilisez l’applet de commande Update-AzDataLakeGen2Item pour valider la liste de contrôle d’accès.

Cet exemple crée ou met à jour la liste de contrôle d’accès sur un répertoire pour un utilisateur.

$filesystemName = "my-file-system"
$dirname = "my-directory/"
$acl = (Get-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName -Path $dirname).ACL
$acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -EntityID xxxxxxxx-xxxx-xxxxxxxxxxx -Permission r-x -InputObject $acl
Update-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName -Path $dirname -Acl $acl

Notes

Si vous souhaitez mettre à jour une entrée de liste de contrôle d’accès par défaut, utilisez le paramètre -DefaultScope lors de l’exécution de la commande Set-AzDataLakeGen2ItemAclObject. Par exemple : $acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -EntityID xxxxxxxx-xxxx-xxxxxxxxxxx -Permission r-x -DefaultScope.

Mettre à jour les listes de contrôle d’accès de manière récursive

Mettez à jour des listes de contrôle d’accès de manière récursive à l’aide de la cmdlet Update-AzDataLakeGen2AclRecursive.

Cet exemple met à jour une entrée de liste de contrôle d’accès avec l’autorisation d’écriture.

$filesystemName = "my-container"
$dirname = "my-parent-directory/"
$userID = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";

$acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -EntityId $userID -Permission rwx

Update-AzDataLakeGen2AclRecursive -Context $ctx -FileSystem $filesystemName -Path $dirname -Acl $acl

Notes

Pour définir l’ACL d’un groupe ou d’un utilisateur spécifique, d’un principal de service, ou d’une identité managée, utilisez leurs ID d’objet respectifs. Par exemple, pour définir la liste de contrôle d’accès d’un groupe, utilisez group:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx. Pour définir la liste de contrôle d’accès d’un utilisateur, utilisez user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.

Pour voir un exemple qui met à jour des ACL de manière récursive dans des lots en spécifiant une taille de lot, consultez l’article de référence Update-AzDataLakeGen2AclRecursive.

Supprimer des entrées de liste de contrôle d’accès

Cette section vous montre comment :

  • Supprimer une entrée de liste de contrôle d’accès
  • Supprimer des entrées de liste de contrôle d’accès (ACL) de manière récursive

Supprimer une entrée de liste de contrôle d’accès

Cet exemple supprime une entrée d’une liste de contrôle d’accès existante.

$id = "xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

# Create the new ACL object.
[Collections.Generic.List[System.Object]]$aclnew =$acl

foreach ($a in $aclnew)
{
    if ($a.AccessControlType -eq "User" -and $a.DefaultScope -eq $false -and $a.EntityId -eq $id)
    {
        $aclnew.Remove($a);
        break;
    }
}
Update-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName -Path $dirname -Acl $aclnew

Supprimer des entrées de liste de contrôle d’accès (ACL) de manière récursive

Vous pouvez supprimer une ou plusieurs entrées de liste de contrôle d’accès (ACL) de manière récursive. Pour supprimer une entrée de liste de contrôle d’accès, créez un nouvel objet ACL pour l’entrée ACL à supprimer, puis utilisez cet objet dans l’opération de suppression de l’ACL. Ne récupérez pas la liste de contrôle d’accès existante, il vous suffit de fournir les entrées ACL à supprimer.

Supprimez des entrées de liste de contrôle d’accès à l’aide de la cmdlet Remove-AzDataLakeGen2AclRecursive.

Cet exemple supprime une entrée de liste de contrôle d’accès dans le répertoire racine du conteneur.

$filesystemName = "my-container"
$userID = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

$acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -EntityId $userID -Permission "---"

Remove-AzDataLakeGen2AclRecursive -Context $ctx -FileSystem $filesystemName  -Acl $acl

Notes

Si vous souhaitez supprimer une entrée de liste de contrôle d’accès par défaut, utilisez le paramètre -DefaultScope lors de l’exécution de la commande Set-AzDataLakeGen2ItemAclObject. Par exemple : $acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -EntityId $userID -Permission "---" -DefaultScope.

Pour voir un exemple qui supprime des ACL de manière récursive dans des lots en spécifiant une taille de lot, consultez l’article de référence Remove-AzDataLakeGen2AclRecursive.

Récupérer suite à des échecs

Vous pouvez rencontrer des erreurs d’exécution ou d’autorisation lors de la modification récursive des listes de contrôle d’accès.

Pour les erreurs d’exécution, redémarrez le processus à partir du début. Des erreurs d’autorisation peuvent se produire si le principal de sécurité ne dispose pas des autorisations suffisantes pour modifier la liste de contrôle d’accès d’un répertoire ou d’un fichier qui se trouve dans la hiérarchie de répertoires en cours de modification. Résolvez le problème d’autorisation, puis choisissez de reprendre le processus à partir du point de défaillance à l’aide d’un jeton de continuation ou de redémarrer le processus à partir du début. Vous n’êtes pas obligé d’utiliser le jeton de continuation si vous préférez redémarrer à partir du début. Vous pouvez réappliquer les entrées de liste de contrôle d’accès sans incidence négative.

Cet exemple retourne des résultats à la variable, puis canalise les entrées ayant échoué vers une table mise en forme.

$result = Set-AzDataLakeGen2AclRecursive -Context $ctx -FileSystem $filesystemName -Path $dirname -Acl $acl
$result
$result.FailedEntries | ft

En fonction de la sortie du tableau, vous pouvez corriger les erreurs d’autorisation, puis reprendre l’exécution à l’aide du jeton de continuation.

$result = Set-AzDataLakeGen2AclRecursive -Context $ctx -FileSystem $filesystemName -Path $dirname -Acl $acl -ContinuationToken $result.ContinuationToken
$result

Pour voir un exemple qui définit des ACL de manière récursive dans des lots en spécifiant une taille de lot, consultez l’article de référence Set-AzDataLakeGen2AclRecursive.

Si vous souhaitez que le processus se termine sans être interrompu par des erreurs d’autorisation, vous pouvez le spécifier.

Cet exemple utilise le paramètre ContinueOnFailure pour que l’exécution continue même si l’opération rencontre une erreur d’autorisation.

$result = Set-AzDataLakeGen2AclRecursive -Context $ctx -FileSystem $filesystemName -Path $dirname -Acl $acl -ContinueOnFailure

echo "[Result Summary]"
echo "TotalDirectoriesSuccessfulCount: `t$($result.TotalFilesSuccessfulCount)"
echo "TotalFilesSuccessfulCount: `t`t`t$($result.TotalDirectoriesSuccessfulCount)"
echo "TotalFailureCount: `t`t`t`t`t$($result.TotalFailureCount)"
echo "FailedEntries:"$($result.FailedEntries | ft)

Pour voir un exemple qui définit des ACL de manière récursive dans des lots en spécifiant une taille de lot, consultez l’article de référence Set-AzDataLakeGen2AclRecursive.

Bonnes pratiques

Cette section décrit certaines des meilleures pratiques pour définir des listes de contrôle d’accès (ACL) de manière récursive.

Traitement des erreurs d’exécution

Une erreur d’exécution peut se produire pour de nombreuses raisons (par exemple, une panne ou un problème de connectivité client). Si vous rencontrez une erreur d’exécution, redémarrez le processus ACL récursif. Les listes de contrôle d’accès peuvent être réappliquées à des éléments sans impact négatif.

Traitement des erreurs d’autorisation (403)

Si vous rencontrez une exception de contrôle d’accès lors de l’exécution d’un processus ACL récursif, votre principal de sécurité AD peut ne pas disposer des autorisations suffisantes pour appliquer une liste de contrôle d’accès à un ou plusieurs des éléments enfants dans la hiérarchie de répertoires. Lorsqu’une erreur d’autorisation se produit, le processus s’arrête et un jeton de continuation est fourni. Corrigez le problème d’autorisation, puis utilisez le jeton de continuation pour traiter le jeu de données restant. Les répertoires et les fichiers qui ont déjà été traités correctement n’ont pas besoin d’être retraités. Vous pouvez également choisir de redémarrer le processus ACL récursif. Les listes de contrôle d’accès peuvent être réappliquées à des éléments sans impact négatif.

Informations d'identification

Nous vous recommandons de provisionner un principal de sécurité Microsoft Entra auquel a été attribué le rôle Propriétaire des données Blob de stockage dans l’étendue du compte ou du conteneur de stockage cible.

Performances

Pour réduire la latence, nous vous recommandons d’exécuter le processus ACL récursif dans une machine virtuelle Azure située dans la même région que votre compte de stockage.

Limites des listes de contrôle d’accès (ACL)

Le nombre maximal de listes ACL que vous pouvez appliquer à un répertoire ou à un fichier est de 32 ACL d’accès et de 32 ACL par défaut. Pour plus d’informations, consultez Contrôle d’accès dans Azure Data Lake Storage Gen2.

Voir aussi