Udostępnij za pomocą


Samouczek: dodawanie warunku przypisania roli w celu ograniczenia dostępu do obiektów blob przy użyciu programu Azure PowerShell

W większości przypadków przypisanie roli przyznaje uprawnienia potrzebne do zasobów platformy Azure. Jednak w niektórych przypadkach możesz zapewnić bardziej szczegółową kontrolę dostępu, dodając warunek przypisania roli.

W tym poradniku nauczysz się, jak:

  • Dodawanie warunku do przypisania roli
  • Ograniczanie dostępu do obiektów blob na podstawie tagu indeksu obiektów blob

Ważne

Kontrola dostępu oparta na atrybutach platformy Azure (Azure ABAC) jest ogólnie dostępna (GA) do kontrolowania dostępu do usług Azure Blob Storage, Azure Data Lake Storage Gen2 i Azure Queues przy użyciu request, resource, environment i principal w obu poziomach wydajności konta magazynowego: standardowym i premium. Obecnie lista obiektów blob zawiera atrybuty żądania, a także atrybuty żądania migawki dla hierarchicznej przestrzeni nazw, które są w wersji zapoznawczej. Aby uzyskać pełne informacje o stanie funkcji ABAC dla usługi Azure Storage, zobacz Stan warunkowych funkcji w usłudze Azure Storage.

Zobacz dodatkowe warunki użytkowania dla wersji zapoznawczych platformy Microsoft Azure, aby zapoznać się z postanowieniami prawnymi dotyczącymi funkcji platformy Azure, które są w wersji beta, wersji zapoznawczej lub w inny sposób nie zostały jeszcze wydane w wersji ogólnodostępnej.

Wymagania wstępne

Aby uzyskać informacje o wymaganiach wstępnych dotyczących dodawania lub edytowania warunków przypisywania ról, zobacz Warunki wstępne.

Warunek

W tym samouczku ograniczysz dostęp do blobów z określonym tagiem. Na przykład dodasz warunek do przypisania roli, aby usługa Chandra mogła odczytywać tylko pliki z tagiem Project=Cascade.

Diagram przypisania roli z warunkiem.

Jeśli Chandra próbuje odczytać blob bez etykiety Project=Cascade, dostęp jest zabroniony.

Diagram przedstawiający dostęp do odczytu obiektów blob z przypisanym tagiem Project=Cascade.

Oto jak wygląda warunek w kodzie:

(
    (
        !(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'
    )
)

Krok 1. Instalowanie wymagań wstępnych

  1. Otwórz okno programu PowerShell.

  2. Użyj polecenia Get-InstalledModule , aby sprawdzić wersje zainstalowanych modułów.

    Get-InstalledModule -Name Az
    Get-InstalledModule -Name Az.Resources
    Get-InstalledModule -Name Az.Storage
    
  3. W razie potrzeby użyj polecenia Install-Module , aby zainstalować wymagane wersje modułów Az, Az.Resources i Az.Storage .

    Install-Module -Name Az -RequiredVersion 5.5.0
    Install-Module -Name Az.Resources -RequiredVersion 3.2.1
    Install-Module -Name Az.Storage -RequiredVersion 2.5.2-preview -AllowPrerelease
    
  4. Zamknij i otwórz ponownie program PowerShell, aby odświeżyć sesję.

Krok 2. Logowanie się do platformy Azure

  1. Użyj polecenia Connect-AzAccount i postępuj zgodnie z instrukcjami wyświetlanymi, aby zalogować się do katalogu jako administrator dostępu użytkowników lub właściciel.

    Connect-AzAccount
    
  2. Użyj polecenia Get-AzSubscription , aby wyświetlić listę wszystkich subskrypcji.

    Get-AzSubscription
    
  3. Określ identyfikator subskrypcji i zainicjuj zmienną.

    $subscriptionId = "<subscriptionId>"
    
  4. Ustaw subskrypcję jako aktywną subskrypcję.

    $context = Get-AzSubscription -SubscriptionId $subscriptionId
    Set-AzContext $context
    

Krok 3. Tworzenie użytkownika

  1. Użyj New-MgUser, aby utworzyć użytkownika lub znaleźć istniejącego użytkownika. W tym samouczku użyto narzędzia Chandra jako przykładu.

  2. Zainicjuj zmienną identyfikatora obiektu użytkownika.

    $userObjectId = "<userObjectId>"
    

Krok 4. Konfigurowanie magazynu

  1. Użyj New-AzStorageAccount, aby utworzyć konto pamięci zgodne z funkcją indeksowania obiektów BLOB. Aby uzyskać więcej informacji, zobacz Zarządzanie danymi obiektów blob platformy Azure i ich znajdowanie za pomocą tagów indeksu.

  2. Użyj New-AzStorageContainer aby utworzyć nowy kontener obiektów blob na koncie magazynu i ustawić poziom dostępu anonimowego na Prywatny (bez dostępu anonimowego).

  3. Użyj Set-AzStorageBlobContent aby przekazać plik tekstowy do kontenera.

  4. Dodaj następujący tag indeksu obiektów blob do pliku tekstowego. Aby uzyskać więcej informacji, zobacz Use blob index tags to manage and find data on Azure Blob Storage (Używanie tagów indeksu obiektów blob do zarządzania danymi i znajdowania ich w usłudze Azure Blob Storage).

    Uwaga / Notatka

    Obiekty blob obsługują również możliwość przechowywania dowolnych metadanych klucz-wartość zdefiniowanych przez użytkownika. Chociaż metadane są podobne do tagów indeksu obiektów blob, należy używać tagów indeksu obiektów blob z warunkami.

    Klawisz Wartość
    Projekt Kaskada
  5. Przekaż drugi plik tekstowy do kontenera.

  6. Dodaj następujący tag indeksu obiektów blob do drugiego pliku tekstowego.

    Klawisz Wartość
    Projekt Piekarz
  7. Zainicjuj następujące zmienne przy użyciu użytych nazw.

    $resourceGroup = "<resourceGroup>"
    $storageAccountName = "<storageAccountName>"
    $containerName = "<containerName>"
    $blobNameCascade = "<blobNameCascade>"
    $blobNameBaker = "<blobNameBaker>"
    

Krok 5. Przypisywanie roli z warunkiem

  1. Zainicjuj zmienne roli Czytelnik danych Blob Storage.

    $roleDefinitionName = "Storage Blob Data Reader"
    $roleDefinitionId = "2a2b9908-6ea1-4ae2-8e65-a410df84e7d1"
    
  2. Zainicjuj zakres grupy zasobów.

    $scope = "/subscriptions/$subscriptionId/resourceGroups/$resourceGroup"
    
  3. Zainicjuj warunek.

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

    W programie PowerShell, jeśli warunek zawiera znak dolara ($), musisz go poprzedzić znakiem backtick (`). Na przykład ten warunek używa znaków dolara do wyznaczenia nazwy klucza tagu.

  4. Zainicjuj wersję i opis warunku.

    $conditionVersion = "2.0"
    $description = "Read access to blobs with the tag Project=Cascade"
    
  5. Użyj New-AzRoleAssignment aby przypisać rolę Czytelnik danych Blob Storage z warunkiem dla użytkownika w zakresie grupy zasobów.

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

    Oto przykład danych wyjściowych:

    RoleAssignmentId   : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/Microso
                         ft.Authorization/roleAssignments/<roleAssignmentId>
    Scope              : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>
    DisplayName        : Chandra
    SignInName         : chandra@contoso.com
    RoleDefinitionName : Storage Blob Data Reader
    RoleDefinitionId   : 2a2b9908-6ea1-4ae2-8e65-a410df84e7d1
    ObjectId           : <userObjectId>
    ObjectType         : User
    CanDelegate        : False
    Description        : Read access to blobs with the tag Project=Cascade
    ConditionVersion   : 2.0
    Condition          : ((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT
                         SubOperationMatches{'Blob.List'})) OR
                         (@Resource[Microsoft.Storage/storageAccounts/blobServices/co
                         ntainers/blobs/tags:Project<$key_case_sensitive$>] StringEquals 'Cascade'))
    

Krok 6. (Opcjonalnie) Wyświetlanie warunku w witrynie Azure Portal

  1. W witrynie Azure Portal otwórz grupę zasobów.

  2. Wybierz pozycję Kontrola dostępu (IAM).

  3. Na karcie Przypisania ról znajdź przypisanie roli.

  4. W kolumnie Warunek wybierz pozycję Widok/Edytuj , aby wyświetlić warunek.

Zrzut ekranu przedstawiający dodawanie warunku przypisania roli w witrynie Azure Portal.

Krok 7. Testowanie warunku

  1. Otwórz nowe okno programu PowerShell.

  2. Użyj polecenia Connect-AzAccount aby zalogować się jako Chandra.

    Connect-AzAccount
    
  3. Zainicjuj następujące zmienne przy użyciu użytych nazw.

    $storageAccountName = "<storageAccountName>"
    $containerName = "<containerName>"
    $blobNameBaker = "<blobNameBaker>"
    $blobNameCascade = "<blobNameCascade>"
    
  4. Użyj New-AzStorageContext, aby łatwiej utworzyć określony kontekst do uzyskania dostępu do konta magazynowego.

    $bearerCtx = New-AzStorageContext -StorageAccountName $storageAccountName
    
  5. Użyj polecenia Get-AzStorageBlob , aby spróbować odczytać plik projektu Baker.

    Get-AzStorageBlob -Container $containerName -Blob $blobNameBaker -Context $bearerCtx 
    

    Oto przykład danych wyjściowych. Zwróć uwagę, że nie można odczytać pliku z powodu dodanego warunku.

    Get-AzStorageBlob : This request is not authorized to perform this operation using this permission. HTTP Status Code:
    403 - HTTP Error Message: This request is not authorized to perform this operation using this permission.
    ErrorCode: AuthorizationPermissionMismatch
    ErrorMessage: This request is not authorized to perform this operation using this permission.
    RequestId: <requestId>
    Time: Sat, 24 Apr 2021 13:26:25 GMT
    At line:1 char:1
    + Get-AzStorageBlob -Container $containerName -Blob $blobNameBaker -Con ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : CloseError: (:) [Get-AzStorageBlob], StorageException
        + FullyQualifiedErrorId : StorageException,Microsoft.WindowsAzure.Commands.Storage.Blob.Cmdlet.GetAzureStorageBlob
       Command
    
  6. Przeczytaj plik projektu Cascade.

    Get-AzStorageBlob -Container $containerName -Blob $blobNameCascade -Context $bearerCtx 
    

    Oto przykład danych wyjściowych. Zwróć uwagę, że możesz odczytać plik, ponieważ ma on tag Project=Cascade.

       AccountName: <storageAccountName>, ContainerName: <containerName>
    
    Name                 BlobType  Length          ContentType                    LastModified         AccessTier SnapshotT
                                                                                                                  ime
    ----                 --------  ------          -----------                    ------------         ---------- ---------
    CascadeFile.txt      BlockBlob 7               text/plain                     2021-04-24 05:35:24Z Hot
    

Krok 8. (Opcjonalnie) Edytowanie warunku

  1. W innym oknie programu PowerShell użyj polecenia Get-AzRoleAssignment , aby uzyskać dodane przypisanie roli.

    $testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectId
    
  2. Edytuj warunek.

    $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' OR @Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<`$key_case_sensitive`$>] StringEquals 'Baker'))"
    
  3. Zainicjuj warunek i opis.

    $testRa.Condition = $condition
    $testRa.Description = "Read access to blobs with the tag Project=Cascade or Project=Baker"
    
  4. Użyj Set-AzRoleAssignment, aby zaktualizować warunek przypisania roli.

    Set-AzRoleAssignment -InputObject $testRa -PassThru
    

    Oto przykład danych wyjściowych:

    RoleAssignmentId   : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/Microso
                         ft.Authorization/roleAssignments/<roleAssignmentId>
    Scope              : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>
    DisplayName        : Chandra
    SignInName         : chandra@contoso.com
    RoleDefinitionName : Storage Blob Data Reader
    RoleDefinitionId   : 2a2b9908-6ea1-4ae2-8e65-a410df84e7d1
    ObjectId           : <userObjectId>
    ObjectType         : User
    CanDelegate        : False
    Description        : Read access to blobs with the tag Project=Cascade or Project=Baker
    ConditionVersion   : 2.0
    Condition          : ((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT
                         SubOperationMatches{'Blob.List'})) OR
                         (@Resource[Microsoft.Storage/storageAccounts/blobServices/co
                         ntainers/blobs/tags:Project<$key_case_sensitive$>] StringEquals 'Cascade' OR @Resource[Microsoft.S
                         torage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>]
                         StringEquals 'Baker'))
    

Krok 9. Czyszczenie zasobów

  1. Użyj Remove-AzRoleAssignment aby usunąć przypisanie roli i warunek, które zostały dodane.

    Remove-AzRoleAssignment -ObjectId $userObjectId -RoleDefinitionName $roleDefinitionName -ResourceGroupName $resourceGroup
    
  2. Usuń utworzone konto pamięci masowej.

  3. Usuń utworzonego użytkownika.

Dalsze kroki