Usare PowerShell per gestire gli elenchi di controllo di accesso in Azure Data Lake Archiviazione Gen2

Questo articolo illustra come usare PowerShell per ottenere, impostare e aggiornare gli elenchi di controllo di accesso di directory e file.

L'ereditarietà ACL è già disponibile per i nuovi elementi figlio creati in una directory padre. Ma è anche possibile aggiungere, aggiornare e rimuovere gli ACL in modo ricorsivo sugli elementi figlio esistenti di una directory padre senza dover apportare queste modifiche singolarmente per ogni elemento figlio.

Riferimento | Inviare commenti e suggerimenti

Prerequisiti

  • Una sottoscrizione di Azure. Per altre informazioni, vedere Ottenere la versione di valutazione gratuita di Azure.

  • Un account di archiviazione in cui è abilitato lo spazio dei nomi gerarchico. Per crearne uno, seguire queste istruzioni.

  • Interfaccia della riga di comando di Azure versione 2.6.0 o successiva.

  • Una delle autorizzazioni di sicurezza seguenti:

    • Entità di sicurezza microsoft Entra ID di cui è stato effettuato il provisioning a cui è stato assegnato il ruolo proprietario dei dati BLOB Archiviazione, con ambito al contenitore di destinazione, all'account di archiviazione, al gruppo di risorse padre o alla sottoscrizione.

    • Proprietario dell'utente del contenitore o della directory di destinazione a cui si prevede di applicare le impostazioni ACL. Per impostare gli elenchi di controllo di accesso in modo ricorsivo, sono inclusi tutti gli elementi figlio nel contenitore o nella directory di destinazione.

    • Archiviazione chiave dell'account.

Installa il modulo PowerShell

  1. Verificare che la versione di PowerShell installata sia 5.1 o successiva usando il comando seguente.

    echo $PSVersionTable.PSVersion.ToString()
    

    Per aggiornare la versione di PowerShell, vedere Aggiornamento di Windows PowerShell esistente

  2. Installare il modulo Az.Archiviazione.

    Install-Module Az.Storage -Repository PSGallery -Force  
    

    Per altre informazioni su come installare i moduli di PowerShell, vedere Installare il modulo Azure PowerShell

Effettuare la connessione all'account

Scegliere come si vuole che i comandi ottengano l'autorizzazione per l'account di archiviazione.

Opzione 1: Ottenere l'autorizzazione usando Microsoft Entra ID

Nota

Se si usa Microsoft Entra ID per autorizzare l'accesso, assicurarsi che all'entità di sicurezza sia stato assegnato il ruolo di proprietario dei dati BLOB Archiviazione. Per altre informazioni sull'applicazione delle autorizzazioni ACL e sugli effetti della modifica, vedere Modello di controllo di accesso in Azure Data Lake Archiviazione Gen2.

Con questo approccio, il sistema garantisce che l'account utente disponga delle assegnazioni di controllo degli accessi in base al ruolo di Azure appropriate e delle autorizzazioni ACL.

  1. Aprire una finestra di comando di Windows PowerShell e quindi accedere alla sottoscrizione di Azure con il Connect-AzAccount comando e seguire le istruzioni visualizzate.

    Connect-AzAccount
    
  2. Se l'identità è associata a più sottoscrizioni, impostare la sottoscrizione attiva sulla sottoscrizione dell'account di archiviazione in cui si desidera creare e gestire le directory. In questo esempio sostituire il <subscription-id> valore segnaposto con l'ID della sottoscrizione.

    Select-AzSubscription -SubscriptionId <subscription-id>
    
  3. Ottenere il contesto dell'account di archiviazione.

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

Opzione 2: Ottenere l'autorizzazione usando la chiave dell'account di archiviazione

Con questo approccio, il sistema non controlla le autorizzazioni di Controllo degli accessi in base al ruolo di Azure o ACL. Ottenere il contesto dell'account di archiviazione usando una chiave dell'account.

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

Ottenere elenchi di controllo di accesso

Ottenere l'elenco di controllo di accesso di una directory o di un file usando il Get-AzDataLakeGen2Itemcmdlet .

Questo esempio ottiene l'ACL della directory radice di un contenitore e quindi stampa l'ACL nella console.

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

Questo esempio ottiene l'ACL di una directory e quindi stampa l'ACL nella console.

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

Questo esempio ottiene l'ACL di un file e quindi stampa l'ACL nella console.

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

Nell'immagine seguente illustra l'output dopo aver recuperato l'ACL di una directory.

Get ACL output for directory

In questo esempio, l'utente proprietario è provvisto delle autorizzazioni di lettura, scrittura ed esecuzione. Il gruppo proprietario è provvisto delle sole autorizzazioni di lettura ed esecuzione. Per altre informazioni sugli elenchi di controllo di accesso, vedere Controllo di accesso in Azure Data Lake Storage Gen2.

Impostare gli elenchi di controllo di accesso

Quando si imposta un elenco di controllo di accesso, si sostituisce l'intero ACL, incluse tutte le voci. Se si vuole modificare il livello di autorizzazione di un'entità di sicurezza o aggiungere una nuova entità di sicurezza all'elenco di controllo di accesso senza influire sulle altre voci esistenti, è consigliabile aggiornare invece l'ACL. Per aggiornare un elenco di controllo di accesso anziché sostituirlo, vedere la sezione Aggiornare gli elenchi di controllo di accesso di questo articolo.

Se si sceglie di impostare l'ACL, è necessario aggiungere una voce per l'utente proprietario, una voce per il gruppo proprietario e una voce per tutti gli altri utenti. Per altre informazioni sull'utente proprietario, sul gruppo proprietario e su tutti gli altri utenti, vedere Utenti e identità.

Questa sezione illustra come:

  • Impostare un ACL
  • Impostare ricorsivamente gli elenchi di controllo di accesso

Impostare un ACL

Usare il Set-AzDataLakeGen2ItemAclObject cmdlet per creare un ACL per l'utente proprietario, il gruppo proprietario o altri utenti. Usare quindi il cmdlet per eseguire il Update-AzDataLakeGen2Item commit dell'ACL.

Questo esempio imposta l'ACL nella directory radice di un contenitore per l'utente proprietario, il gruppo proprietario o altri utenti e quindi stampa l'ACL nella 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

Questo esempio imposta l'ACL in una directory per l'utente proprietario, il gruppo proprietario o altri utenti e quindi stampa l'ACL nella 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

Nota

Se si vuole impostare una voce ACL predefinita , usare il parametro -DefaultScope quando si esegue il comando Set-AzDataLakeGen2ItemAclObject . Ad esempio: $acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -Permission rwx -DefaultScope.

Questo esempio imposta l'ACL in un file per l'utente proprietario, il gruppo proprietario o altri utenti e quindi stampa l'ACL nella 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

Nota

Per impostare l'ACL di un gruppo o di un utente specifico, un'entità servizio o un'identità gestita, usare i rispettivi ID oggetto. Ad esempio, per impostare l'ACL di un gruppo, usare group:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx. Per impostare l'ACL di un utente, usare user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.

Nell'immagine seguente illustra l'output dopo aver impostato l'ACL di un file.

Get ACL output for file

In questo esempio, l'utente proprietario e il gruppo proprietario sono provvisti delle sole autorizzazioni di lettura e scrittura. Tutti gli altri utenti sono provvisti di autorizzazioni di scrittura ed esecuzione. Per altre informazioni sugli elenchi di controllo di accesso, vedere Controllo di accesso in Azure Data Lake Storage Gen2.

Impostare ricorsivamente gli elenchi di controllo di accesso

Impostare gli ACL in modo ricorsivo usando il cmdlet Set-AzDataLakeGen2AclRecursive .

In questo esempio viene impostato l'elenco di controllo di accesso di una directory denominata my-parent-directory. Queste voci assegnano all'utente le autorizzazioni di lettura, scrittura ed esecuzione proprietarie, assegnano al gruppo proprietario solo autorizzazioni di lettura ed esecuzione e non consentono l'accesso a tutti gli altri utenti. L'ultima voce ACL in questo esempio fornisce a un utente specifico le autorizzazioni di lettura ed esecuzione con l'ID oggetto "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx".

$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

Nota

Se si vuole impostare una voce ACL predefinita , usare il parametro -DefaultScope quando si esegue il comando Set-AzDataLakeGen2ItemAclObject . Ad esempio: $acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -Permission rwx -DefaultScope.

Per un esempio che imposta gli ACL in modo ricorsivo nei batch specificando una dimensione batch, vedere l'articolo di riferimento Set-AzDataLakeGen2AclRecursive .

Aggiornare gli elenchi di controllo di accesso

Quando si aggiorna un ACL, si modifica l'ACL anziché sostituire l'ACL. Ad esempio, è possibile aggiungere una nuova entità di sicurezza all'elenco di controllo di accesso senza influire sulle altre entità di sicurezza elencate nell'elenco di controllo di accesso. Per sostituire l'ACL invece di aggiornarlo, vedere la sezione Impostare elenchi di controllo di accesso di questo articolo.

Questa sezione illustra come:

  • Aggiornare un ACL
  • Aggiornare gli elenchi di controllo di accesso in modo ricorsivo

Aggiornare un ACL

Prima di tutto, ottenere l'ACL. Usare quindi il Set-AzDataLakeGen2ItemAclObject cmdlet per aggiungere o aggiornare una voce ACL. Usare il cmdlet per eseguire il Update-AzDataLakeGen2Item commit dell'ACL.

In questo esempio viene creato o aggiornato l'elenco di controllo di accesso in una directory per un utente.

$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

Nota

Se si vuole aggiornare una voce ACL predefinita , usare il parametro -DefaultScope quando si esegue il comando Set-AzDataLakeGen2ItemAclObject . Ad esempio: $acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -EntityID xxxxxxxx-xxxx-xxxxxxxxxxx -Permission r-x -DefaultScope.

Aggiornare gli elenchi di controllo di accesso in modo ricorsivo

Aggiornare gli ACL in modo ricorsivo usando il cmdlet Update-AzDataLakeGen2AclRecursive .

In questo esempio viene aggiornata una voce ACL con autorizzazione di scrittura.

$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

Nota

Per impostare l'ACL di un gruppo o di un utente specifico, un'entità servizio o un'identità gestita, usare i rispettivi ID oggetto. Ad esempio, per impostare l'ACL di un gruppo, usare group:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx. Per impostare l'ACL di un utente, usare user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.

Per un esempio che aggiorna gli elenchi di controllo di accesso in modo ricorsivo nei batch specificando una dimensione batch, vedere l'articolo di riferimento Update-AzDataLakeGen2AclRecursive .

Rimuovere le voci ACL

Questa sezione illustra come:

  • Rimuovere una voce ACL
  • Rimuovere le voci ACL in modo ricorsivo

Rimuovere una voce ACL

In questo esempio viene rimossa una voce da un elenco di controllo di accesso esistente.

$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

Rimuovere le voci ACL in modo ricorsivo

È possibile rimuovere una o più voci ACL in modo ricorsivo. Per rimuovere una voce ACL, creare un nuovo oggetto ACL per la voce ACL da rimuovere e quindi usare tale oggetto nell'operazione di rimozione dell'elenco di controllo di accesso. Non ottenere l'ACL esistente, specificare solo le voci ACL da rimuovere.

Rimuovere le voci ACL usando il cmdlet Remove-AzDataLakeGen2AclRecursive .

In questo esempio viene rimossa una voce ACL dalla directory radice del contenitore.

$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

Nota

Se si desidera rimuovere una voce ACL predefinita , usare il parametro -DefaultScope quando si esegue il comando Set-AzDataLakeGen2ItemAclObject . Ad esempio: $acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -EntityId $userID -Permission "---" -DefaultScope.

Per un esempio che rimuove gli ACL in modo ricorsivo nei batch specificando una dimensione del batch, vedere l'articolo di riferimento Remove-AzDataLakeGen2AclRecursive .

Ripristino da errori

È possibile che si verifichino errori di runtime o di autorizzazione durante la modifica degli elenchi di controllo di accesso in modo ricorsivo.

Per gli errori di runtime, riavviare il processo dall'inizio. Gli errori di autorizzazione possono verificarsi se l'entità di sicurezza non dispone di autorizzazioni sufficienti per modificare l'elenco di controllo di accesso di una directory o di un file presente nella gerarchia di directory da modificare. Risolvere il problema di autorizzazione e quindi scegliere di riprendere il processo dal punto di errore usando un token di continuazione o riavviare il processo dall'inizio. Non è necessario usare il token di continuazione se si preferisce riavviare dall'inizio. È possibile riapplicare le voci ACL senza alcun impatto negativo.

In questo esempio vengono restituiti risultati alla variabile e quindi vengono restituite voci non riuscite a una tabella formattata.

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

In base all'output della tabella, è possibile correggere eventuali errori di autorizzazione e quindi riprendere l'esecuzione usando il token di continuazione.

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

Per un esempio che imposta gli ACL in modo ricorsivo nei batch specificando una dimensione batch, vedere l'articolo di riferimento Set-AzDataLakeGen2AclRecursive .

Se si desidera che il processo venga completato senza interruzioni dagli errori di autorizzazione, è possibile specificarlo.

In questo esempio viene usato il ContinueOnFailure parametro in modo che l'esecuzione continui anche se l'operazione rileva un errore di autorizzazione.

$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)

Per un esempio che imposta gli ACL in modo ricorsivo nei batch specificando una dimensione batch, vedere l'articolo di riferimento Set-AzDataLakeGen2AclRecursive .

Procedure consigliate

Questa sezione fornisce alcune linee guida sulle procedure consigliate per l'impostazione degli elenchi di controllo di accesso in modo ricorsivo.

Gestione degli errori di runtime

Un errore di runtime può verificarsi per molti motivi (ad esempio, un'interruzione o un problema di connettività client). Se si verifica un errore di runtime, riavviare il processo ACL ricorsivo. Gli elenchi di controllo di accesso possono essere riapplicati agli elementi senza causare un impatto negativo.

Gestione degli errori di autorizzazione (403)

Se si verifica un'eccezione di controllo di accesso durante l'esecuzione di un processo ACL ricorsivo, l'entità di sicurezza di Active Directory potrebbe non disporre di autorizzazioni sufficienti per applicare un elenco di controllo di accesso a uno o più elementi figlio nella gerarchia di directory. Quando si verifica un errore di autorizzazione, il processo viene arrestato e viene fornito un token di continuazione. Risolvere il problema di autorizzazione e quindi usare il token di continuazione per elaborare il set di dati rimanente. Le directory e i file che sono già stati elaborati correttamente non dovranno essere elaborati di nuovo. È anche possibile scegliere di riavviare il processo ACL ricorsivo. Gli elenchi di controllo di accesso possono essere riapplicati agli elementi senza causare un impatto negativo.

Credentials

È consigliabile effettuare il provisioning di un'entità di sicurezza Di Microsoft Entra assegnata al ruolo proprietario dei dati BLOB Archiviazione nell'ambito dell'account di archiviazione o del contenitore di destinazione.

Prestazioni

Per ridurre la latenza, è consigliabile eseguire il processo ACL ricorsivo in una macchina virtuale di Azure che si trova nella stessa area dell'account di archiviazione.

Limiti ACL

Il numero massimo di ACL che è possibile applicare a una directory o a un file è 32 ACL di accesso e 32 ACL predefiniti. Per altre informazioni, vedere Access control in Azure Data Lake Storage Gen2 (Controllo di accesso in Azure Data Lake Storage Gen2).

Vedi anche