Udostępnij za pomocą


Zarządzanie listami ACL w usłudze Azure Data Lake Storage 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 ACL jest już dostępne dla nowych elementów podrzędnych tworzonych w katalogu nadrzędnym. Można jednak również dodawać, aktualizować i usuwać listy kontroli dostępu (ACL) rekursywnie na 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ą strukturą przestrzeni nazw (HNS). Postępuj zgodnie z tymi instrukcjami, aby je utworzyć.

  • Wersja 2.6.0 lub wyższa interfejsu wiersza polecenia platformy Azure.

  • Jedno z poniższych uprawnień bezpieczeństwa:

    • Aprowizowana zasada zabezpieczeń Microsoft Entra ID, której przypisano rolę Właściciela danych obiektu blob usługi Storage, z zakresem określonym dla docelowego kontenera, konta magazynowego, nadrzędnej grupy zasobów lub subskrypcji.

    • Użytkownik będący właścicielem kontenera docelowego lub katalogu, do którego planujesz zastosować ustawienia listy ACL. Aby rekursywnie ustawić listy ACL, należy uwzględnić wszystkie elementy podrzędne w kontenerze docelowym lub katalogu.

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

Nawiązywanie połączenia z kontem

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

    Connect-AzAccount
    
  2. Jeśli Twoja tożsamość jest skojarzona z więcej niż jedną subskrypcją i nie zostanie wyświetlony monit o wybranie subskrypcji, ustaw aktywną subskrypcję na tę subskrypcję, która dotyczy konta magazynu, na którym chcesz działać. W tym przykładzie zamień symbol zastępczy <subscription-id> na identyfikator swojej subskrypcji.

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

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

Pobierz listy ACL

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

Ten przykład pobiera listę ACL katalogu głównego kontenera, a następnie wyświetla ją w konsoli.

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

Ten przykład pobiera ACL katalogu, a następnie wyświetla 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 wyświetla listę ACL w konsoli.

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

Uzyskaj dane wyjściowe ACL dla katalogu

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 uruchamiania. Aby uzyskać więcej informacji na temat list kontroli dostępu, zobacz Kontrola dostępu w usłudze Azure Data Lake Storage.

Ustaw ACL

Gdy ustawisz listę ACL, zastępujesz całą listę ACL wraz ze wszystkimi jej 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:

  • Ustaw ACL
  • Cykliczne ustawianie list kontroli dostępu

Ustaw listę ACL

Użyj polecenia cmdlet Set-AzDataLakeGen2ItemAclObject, aby utworzyć listę ACL dla użytkownika, grupy właścicieli lub innych użytkowników. Następnie użyj cmdlet Update-AzDataLakeGen2Item, aby zatwierdzić listę kontroli dostępu (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 ACL jest ustawiana w katalogu dla użytkownika właściciela, grupy właścicielskiej lub innych użytkowników, a następnie wyświetlana w 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ć ACL określonej grupy lub użytkownika, jednostki usługi lub tożsamości zarządzanej, użyj odpowiednich identyfikatorów ich obiektów. Aby na przykład ustawić ACL grupy, użyj polecenia group:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx. Aby ustawić ACL użytkownika, użyj user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.

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

Uzyskaj wynik ACL dla pliku

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.

Rekurencyjne ustawianie list kontroli dostępu

Ustaw listy kontroli dostępu rekursywnie przy użyciu polecenia cmdlet Set-AzDataLakeGen2AclRecursive.

Ten przykład ustawia ACL katalogu o nazwie my-parent-directory. Te wpisy zapewniają użytkownikowi uprawnienia do odczytu, zapisu i wykonywania, zapewniają grupie właściciela tylko uprawnienia do odczytu i wykonywania, a dla wszystkich pozostałych brak dostępu. Ostatni wpis na liście ACL w tym przykładzie przyznaje określonemu użytkownikowi o identyfikatorze obiektu "xxxxxxxx-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 Set-AzDataLakeGen2ItemAclObject. Na przykład: $acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -Permission rwx -DefaultScope.

Aby zobaczyć przykład ustawiający listy kontroli dostępu (ACL) rekursywnie, partiami przy określonym rozmiarze partii, zobacz referencyjny artykuł Set-AzDataLakeGen2AclRecursive.

Zaktualizuj listy ACL

Podczas aktualizacji listy ACL należy ją zmodyfikować, a nie zastępować. 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:

  • Zaktualizuj ACL
  • Rekursywne aktualizowanie list ACL

Zaktualizuj ACL

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

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 aaaaaaaa-bbbb-cccc-1111-222222222222 -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 aaaaaaaa-bbbb-cccc-1111-222222222222 -Permission r-x -DefaultScope.

Rekursywnie aktualizować listy kontroli dostępu

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

W tym przykładzie zaktualizowano wpis listy kontroli dostępu (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ę kontroli dostępu (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ć ACL grupy, użyj group:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx. Aby ustawić listę kontroli dostępu ACL dla użytkownika, użyj user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.

Aby zobaczyć przykład aktualizacji list ACL rekurencyjnie w partiach przez określenie rozmiaru partii, zobacz artykuł referencyjny Update-AzDataLakeGen2AclRecursive.

Usuwanie wpisów listy ACL

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

  • Usuwanie wpisu listy ACL
  • Rekursywnie usuwać wpisy listy ACL

Usuń wpis 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 ACL, utwórz nowy obiekt ACL dla tego wpisu do usunięcia, a następnie użyj tego obiektu w operacji usuwania ACL. Nie pobieraj istniejącej listy ACL, po prostu podaj wpisy ACL do usunięcia.

Usuń wpisy ACL przy użyciu cmdletu 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 kontrolne dostępu (ACL) w partiach przez określenie rozmiaru partii, zobacz artykuł referencyjny 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 ACL bez żadnych negatywnych skutków.

Ten przykład zwraca wyniki do zmiennej, a następnie kieruje nieudane wpisy 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, który ustawia ACL-e 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, który ustawia 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 praktyk rekursywnego ustawiania listy 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 proces ACL. ACL można ponownie zastosować do elementów bez negatywnych skutków.

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

Jeśli wystąpi wyjątek kontroli dostępu podczas uruchamiania rekursywnego procesu ACL, podmiot zabezpieczeń AD może nie mieć wystarczających uprawnień do zastosowania 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ć proces rekurencyjny ACL. ACL można ponownie zastosować do elementów bez negatywnego wpływu.

Dane uwierzytelniające

Zalecamy utworzenie podmiotu zabezpieczeń Microsoft Entra, który ma przypisaną rolę Właściciela danych obiektu blob usługi Storage w zakresie docelowego konta magazynu lub kontenera.

Wydajność

Aby zmniejszyć opóźnienia, zalecamy uruchomienie procesu rekurencyjnego ACL na maszynie wirtualnej Azure, która znajduje się w tym samym regionie co konto magazynowe.

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ż