Zarządzanie listami ACL w usłudze Azure Data Lake Storage Gen2 przy użyciu programu PowerShell

W tym artykule pokazano, jak za pomocą programu PowerShell pobierać, ustawiać i aktualizować listy kontroli dostępu katalogów i plików.

Dziedziczenie listy ACL jest już dostępne dla nowych elementów podrzędnych utworzonych w katalogu nadrzędnym. Można jednak również dodawać, aktualizować i usuwać listy ACL cyklicznie w istniejących elementach podrzędnych katalogu nadrzędnego bez konieczności wprowadzania tych zmian indywidualnie dla każdego elementu podrzędnego.

Dokumentacja | — prześlij opinię

Wymagania wstępne

  • Subskrypcja platformy Azure. Aby uzyskać więcej informacji, zobacz Uzyskiwanie bezpłatnej wersji próbnej platformy Azure.

  • Konto magazynu z włączoną hierarchiczną przestrzenią nazw (HNS). Postępuj zgodnie z tymi instrukcjami, aby je utworzyć.

  • Wersja interfejsu wiersza polecenia platformy Azure lub nowsza 2.6.0 .

  • Jedno z następujących uprawnień zabezpieczeń:

    • Aprowizowana jednostka zabezpieczeń identyfikatora entra firmy Microsoft, która została przypisana do roli właściciela danych obiektu blob usługi Storage, w zakresie kontenera docelowego, konta magazynu, nadrzędnej grupy zasobów lub subskrypcji.

    • Właścicielem kontenera docelowego lub katalogu, do którego planujesz zastosować ustawienia listy ACL. Aby ustawić listy ACL cyklicznie, obejmuje to wszystkie elementy podrzędne w kontenerze docelowym lub katalogu.

    • Klucz konta magazynu.

Zainstaluj moduł programu PowerShell

  1. Sprawdź, czy zainstalowana wersja programu PowerShell jest 5.1 lub nowsza, używając następującego polecenia.

    echo $PSVersionTable.PSVersion.ToString()
    

    Aby uaktualnić wersję programu PowerShell, zobacz Uaktualnianie istniejącego programu Windows PowerShell

  2. Zainstaluj moduł Az.Storage .

    Install-Module Az.Storage -Repository PSGallery -Force  
    

    Aby uzyskać więcej informacji na temat sposobu instalowania modułów programu PowerShell, zobacz Instalowanie modułu programu Azure PowerShell

Połączenie do konta

Wybierz sposób uzyskiwania autoryzacji na koncie magazynu za pomocą poleceń.

Opcja 1. Uzyskiwanie autoryzacji przy użyciu identyfikatora Entra firmy Microsoft

Uwaga

Jeśli używasz identyfikatora Entra firmy Microsoft do autoryzowania dostępu, upewnij się, że podmiot zabezpieczeń ma przypisaną rolę Właściciela danych obiektu blob usługi Storage. Aby dowiedzieć się więcej na temat stosowania uprawnień listy ACL i ich skutków, zobacz Model kontroli dostępu w usłudze Azure Data Lake Storage Gen2.

Dzięki temu system zapewnia, że twoje konto użytkownika ma odpowiednie przypisania kontroli dostępu na podstawie ról (RBAC) platformy Azure i uprawnienia listy ACL.

  1. Otwórz okno polecenia programu Windows PowerShell, a następnie zaloguj się do subskrypcji platformy Azure za Connect-AzAccount pomocą polecenia i postępuj zgodnie z instrukcjami wyświetlanymi na ekranie.

    Connect-AzAccount
    
  2. Jeśli tożsamość jest skojarzona z więcej niż jedną subskrypcją, ustaw aktywną subskrypcję na subskrypcję konta magazynu, w którym chcesz utworzyć katalogi i zarządzać nimi. W tym przykładzie zastąp wartość symbolu <subscription-id> zastępczego identyfikatorem subskrypcji.

    Select-AzSubscription -SubscriptionId <subscription-id>
    
  3. Pobierz kontekst konta magazynu.

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

Opcja 2. Uzyskiwanie autoryzacji przy użyciu klucza konta magazynu

Dzięki temu system nie sprawdza uprawnień kontroli dostępu opartej na rolach platformy Azure ani listy ACL. Pobierz kontekst konta magazynu przy użyciu klucza konta.

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

Uzyskiwanie list ACL

Pobierz listę ACL katalogu lub pliku przy użyciu Get-AzDataLakeGen2Itempolecenia cmdlet .

Ten przykład pobiera listę ACL katalogu głównego kontenera , a następnie drukuje listę ACL w konsoli.

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

Ten przykład pobiera listę ACL katalogu, a następnie drukuje listę ACL w konsoli.

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

Ten przykład pobiera listę ACL pliku , a następnie drukuje listę ACL w konsoli programu .

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

Na poniższej ilustracji przedstawiono dane wyjściowe po otrzymaniu listy ACL katalogu.

Get ACL output for directory

W tym przykładzie użytkownik, który jest właścicielem, ma uprawnienia do odczytu, zapisu i wykonywania. Grupa będąca właścicielem ma tylko uprawnienia do odczytu i wykonywania. Aby uzyskać więcej informacji na temat list kontroli dostępu, zobacz Kontrola dostępu w usłudze Azure Data Lake Storage Gen2.

Ustawianie list ACL

Po ustawieniu listy ACL należy zastąpićcałą listę ACL wraz ze wszystkimi wpisami. Jeśli chcesz zmienić poziom uprawnień podmiotu zabezpieczeń lub dodać nowego podmiotu zabezpieczeń do listy ACL bez wpływu na inne istniejące wpisy, należy zaktualizować listę ACL. Aby zaktualizować listę ACL zamiast jej zastąpić, zobacz sekcję Aktualizowanie list ACL w tym artykule.

Jeśli zdecydujesz się ustawić listę ACL, musisz dodać wpis dla użytkownika będącego właścicielem, wpis dla grupy właścicieli i wpis dla wszystkich innych użytkowników. Aby dowiedzieć się więcej na temat użytkownika, grupy właścicieli i wszystkich innych użytkowników, zobacz Użytkownicy i tożsamości.

W tej sekcji pokazano, jak wykonać następujące działania:

  • Ustawianie listy ACL
  • Cykliczne ustawianie list kontroli dostępu

Ustawianie listy ACL

Set-AzDataLakeGen2ItemAclObject Użyj polecenia cmdlet, aby utworzyć listę ACL dla użytkownika, grupy będącą właścicielem lub innymi użytkownikami. Następnie użyj Update-AzDataLakeGen2Item polecenia cmdlet , aby zatwierdzić listę ACL.

W tym przykładzie lista ACL jest ustawiana w katalogu głównym kontenera dla użytkownika, grupy właścicieli lub innych użytkowników, a następnie drukuje listę ACL do konsoli.

$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

W tym przykładzie lista ACL jest ustawiana w katalogu dla użytkownika, grupy właścicieli lub innych użytkowników, a następnie drukuje listę ACL do konsoli.

$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

Uwaga

Jeśli chcesz ustawić domyślny wpis listy ACL, użyj parametru -DefaultScope podczas uruchamiania polecenia Set-AzDataLakeGen2ItemAclObject. Na przykład: $acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -Permission rwx -DefaultScope.

W tym przykładzie lista ACL jest ustawiana w pliku dla użytkownika, który jest właścicielem grupy lub innych użytkowników, a następnie wyświetla listę ACL w konsoli.

$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

Uwaga

Aby ustawić listę ACL określonej grupy lub użytkownika, jednostki usługi lub tożsamości zarządzanej, użyj odpowiednich identyfikatorów obiektów. Aby na przykład ustawić listę ACL grupy, użyj polecenia group:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx. Aby ustawić listę ACL użytkownika, użyj polecenia user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.

Na poniższej ilustracji przedstawiono dane wyjściowe po ustawieniu listy ACL pliku.

Get ACL output for file

W tym przykładzie właściciel i grupa będąca właścicielem mają uprawnienia tylko do odczytu i zapisu. Wszyscy inni użytkownicy mają uprawnienia do zapisu i wykonywania. Aby uzyskać więcej informacji na temat list kontroli dostępu, zobacz Kontrola dostępu w usłudze Azure Data Lake Storage Gen2.

Cykliczne ustawianie list kontroli dostępu

Ustaw listy ACL cyklicznie przy użyciu polecenia cmdlet Set-AzDataLakeGen2AclRecursive .

W tym przykładzie ustawiono listę ACL katalogu o nazwie my-parent-directory. Te wpisy zapewniają użytkownikowi uprawnienia do odczytu, zapisu i wykonywania, zapewniają uprawnienia tylko do odczytu i wykonywania grupy właścicieli i daje wszystkim innym bez dostępu. Ostatni wpis listy ACL w tym przykładzie zawiera określonego użytkownika o identyfikatorze obiektu "xxxxxxxx-xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" uprawnienia do odczytu i wykonywania.

$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

Uwaga

Jeśli chcesz ustawić domyślny wpis listy ACL, użyj parametru -DefaultScope podczas uruchamiania polecenia Set-AzDataLakeGen2ItemAclObject. Na przykład: $acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -Permission rwx -DefaultScope.

Aby zobaczyć przykład ustawiający listy ACL rekursywnie w partiach, określając rozmiar partii, zobacz artykuł Referencyjny set-AzDataLakeGen2AclRecursive .

Aktualizowanie list ACL

Podczas aktualizowania listy ACL należy zmodyfikować listę ACL zamiast zastąpić listę ACL. Można na przykład dodać nowego podmiotu zabezpieczeń do listy ACL bez wpływu na inne podmioty zabezpieczeń wymienione na liście ACL. Aby zastąpić listę ACL zamiast ją zaktualizować, zobacz sekcję Ustawianie list ACL w tym artykule.

W tej sekcji pokazano, jak wykonać następujące działania:

  • Aktualizowanie listy ACL
  • Rekursywne aktualizowanie list ACL

Aktualizowanie listy ACL

Najpierw pobierz listę ACL. Następnie użyj Set-AzDataLakeGen2ItemAclObject polecenia cmdlet , aby dodać lub zaktualizować wpis listy ACL. Update-AzDataLakeGen2Item Użyj polecenia cmdlet , aby zatwierdzić listę ACL.

W tym przykładzie jest tworzona lub aktualizowana lista ACL w katalogu dla użytkownika.

$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

Uwaga

Jeśli chcesz zaktualizować domyślny wpis listy ACL, użyj parametru -DefaultScope podczas uruchamiania polecenia Set-AzDataLakeGen2ItemAclObject. Na przykład: $acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -EntityID xxxxxxxx-xxxx-xxxxxxxxxxx -Permission r-x -DefaultScope.

Rekursywne aktualizowanie list ACL

Aktualizuj listy ACL cyklicznie przy użyciu polecenia cmdlet Update-AzDataLakeGen2AclRecursive .

W tym przykładzie zaktualizowano wpis listy ACL z uprawnieniami do zapisu.

$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

Uwaga

Aby ustawić listę ACL określonej grupy lub użytkownika, jednostki usługi lub tożsamości zarządzanej, użyj odpowiednich identyfikatorów obiektów. Aby na przykład ustawić listę ACL grupy, użyj polecenia group:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx. Aby ustawić listę ACL użytkownika, użyj polecenia user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.

Aby zobaczyć przykład aktualizacji list ACL cyklicznie w partiach przez określenie rozmiaru partii, zobacz artykuł Update-AzDataLakeGen2AclRecursive reference (Dokumentacja aktualizacji-AzDataLakeGen2AclRecursive ).

Usuwanie wpisów listy ACL

W tej sekcji pokazano, jak wykonać następujące działania:

  • Usuwanie wpisu listy ACL
  • Usuwanie wpisów listy ACL rekursywnie

Usuwanie wpisu listy ACL

W tym przykładzie usunięto wpis z istniejącej listy ACL.

$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

Usuwanie wpisów listy ACL rekursywnie

Można usunąć co najmniej jeden wpis listy ACL rekursywnie. Aby usunąć wpis listy ACL, utwórz nowy obiekt listy ACL dla wpisu listy ACL do usunięcia, a następnie użyj tego obiektu w operacji usuwania listy ACL. Nie pobieraj istniejącej listy ACL, po prostu podaj wpisy listy ACL do usunięcia.

Usuń wpisy listy ACL przy użyciu polecenia cmdlet Remove-AzDataLakeGen2AclRecursive .

W tym przykładzie usunięto wpis listy ACL z katalogu głównego kontenera.

$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

Uwaga

Jeśli chcesz usunąć domyślny wpis listy ACL, użyj parametru -DefaultScope podczas uruchamiania polecenia Set-AzDataLakeGen2ItemAclObject . Na przykład: $acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -EntityId $userID -Permission "---" -DefaultScope.

Aby zobaczyć przykład, który rekursywnie usuwa listy ACL w partiach przez określenie rozmiaru partii, zobacz artykuł Odwołania Remove-AzDataLakeGen2AclRecursive .

Odzyskiwanie po awariach

Podczas cyklicznego modyfikowania list ACL mogą wystąpić błędy środowiska uruchomieniowego lub uprawnień.

W przypadku błędów środowiska uruchomieniowego uruchom ponownie proces od początku. Błędy uprawnień mogą wystąpić, jeśli podmiot zabezpieczeń nie ma wystarczających uprawnień do modyfikowania listy ACL katalogu lub pliku, który znajduje się w hierarchii katalogów, które są modyfikowane. Rozwiąż problem z uprawnieniami, a następnie wybierz, aby wznowić proces od punktu awarii przy użyciu tokenu kontynuacji lub uruchomić ponownie proces od początku. Jeśli wolisz ponownie uruchomić od początku, nie musisz używać tokenu kontynuacji. Możesz ponownie zastosować wpisy listy ACL bez negatywnego wpływu.

Ten przykład zwraca wyniki do zmiennej, a następnie potoki zakończyły się niepowodzeniem wpisów do sformatowanej tabeli.

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

Na podstawie danych wyjściowych tabeli można naprawić wszelkie błędy uprawnień, a następnie wznowić wykonywanie przy użyciu tokenu kontynuacji.

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

Aby zobaczyć przykład ustawiający listy ACL rekursywnie w partiach, określając rozmiar partii, zobacz artykuł Referencyjny set-AzDataLakeGen2AclRecursive .

Jeśli chcesz, aby proces był nieprzerwany przez błędy uprawnień, możesz to określić.

W tym przykładzie użyto parametru ContinueOnFailure , aby wykonanie było kontynuowane nawet wtedy, gdy operacja napotka błąd uprawnień.

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

Aby zobaczyć przykład ustawiający listy ACL rekursywnie w partiach, określając rozmiar partii, zobacz artykuł Referencyjny set-AzDataLakeGen2AclRecursive .

Najlepsze rozwiązania

Ta sekcja zawiera wskazówki dotyczące najlepszych rozwiązań dotyczących cyklicznego ustawiania list ACL.

Obsługa błędów środowiska uruchomieniowego

Błąd środowiska uruchomieniowego może wystąpić z wielu powodów (na przykład: awaria lub problem z łącznością klienta). Jeśli wystąpi błąd środowiska uruchomieniowego, uruchom ponownie cyklicznego procesu listy ACL. Listy ACL można ponownie zastosować do elementów bez negatywnego wpływu.

Obsługa błędów uprawnień (403)

Jeśli wystąpi wyjątek kontroli dostępu podczas uruchamiania cyklicznego procesu listy ACL, podmiot zabezpieczeń usługi AD może nie mieć wystarczających uprawnień do zastosowania listy ACL do co najmniej jednego elementu podrzędnego w hierarchii katalogów. Po wystąpieniu błędu uprawnień proces zostanie zatrzymany i zostanie udostępniony token kontynuacji. Rozwiąż problem z uprawnieniami, a następnie użyj tokenu kontynuacji, aby przetworzyć pozostały zestaw danych. Katalogi i pliki, które zostały już pomyślnie przetworzone, nie będą musiały zostać ponownie przetworzone. Możesz również ponownie uruchomić cyklicznego procesu listy ACL. Listy ACL można ponownie zastosować do elementów bez negatywnego wpływu.

Poświadczenia

Zalecamy aprowizację podmiotu zabezpieczeń firmy Microsoft, któremu przypisano rolę Właściciela danych obiektu blob usługi Storage w zakresie docelowego konta magazynu lub kontenera.

Wydajność

Aby zmniejszyć opóźnienie, zalecamy uruchomienie cyklicznego procesu listy ACL na maszynie wirtualnej platformy Azure znajdującej się w tym samym regionie co konto magazynu.

Limity listy ACL

Maksymalna liczba list ACL, które można zastosować do katalogu lub pliku, to 32 listy ACL dostępu i 32 domyślne listy ACL. Aby uzyskać więcej informacji, zobacz Kontrola dostępu w usłudze Azure Data Lake Storage Gen2.

Zobacz też