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.

Z tego samouczka dowiesz się, jak wykonywać następujące czynności:

  • 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 do kontrolowania dostępu do usług Azure Blob Storage, Azure Data Lake Storage Gen2 i Azure Queues przy użyciu requestatrybutów , resource, environmenti principal zarówno w warstwach wydajności konta magazynu w warstwie Standardowa, jak i Premium Storage. Obecnie atrybut zasobu metadanych kontenera i lista obiektów blob dołączania atrybutu żądania są dostępne w wersji zapoznawczej. Aby uzyskać pełne informacje o stanie funkcji ABAC dla usługi Azure Storage, zobacz Stan funkcji warunku w usłudze Azure Storage.

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

Wymagania wstępne

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

Stan

W tym samouczku ograniczysz dostęp do obiektów blob za pomocą określonego tagu. 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ć obiekt blob bez tagu Project=Cascade, dostęp nie jest dozwolony.

Diagram przedstawiający dostęp do odczytu do obiektów blob za pomocą tagu 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 Połączenie-AzAccount i postępuj zgodnie z instrukcjami wyświetlanymi, aby zalogować się do katalogu jako użytkownik access Administracja istrator 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 polecenia 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 polecenia New-AzStorageAccount , aby utworzyć konto magazynu zgodne z funkcją indeksu obiektów blob. Aby uzyskać więcej informacji, zobacz Zarządzanie danymi obiektów blob platformy Azure i znajdowanie ich za pomocą tagów indeksu obiektów blob.

  2. Użyj polecenia 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 polecenia 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

    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.

    Key Wartość
    Projekt Cascade
  5. Przekaż drugi plik tekstowy do kontenera.

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

    Key Wartość
    Projekt Baker
  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 obiektu blob usługi 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ć backtick ('). Na przykład ten warunek używa znaków dolara, aby oznaczyć nazwę klucza tagu.

  4. Zainicjuj wersję i opis warunku.

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

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

    Poniżej przedstawiono przykładowe dane wyjściowe:

    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 Połączenie-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 polecenia New-AzStorageContext , aby łatwiej utworzyć określony kontekst w celu uzyskania dostępu do konta magazynu.

    $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 polecenia Set-AzRoleAssignment , aby zaktualizować warunek przypisania roli.

    Set-AzRoleAssignment -InputObject $testRa -PassThru
    

    Poniżej przedstawiono przykładowe dane wyjściowe:

    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 polecenia Remove-AzRoleAssignment , aby usunąć dodane przypisanie i warunek roli.

    Remove-AzRoleAssignment -ObjectId $userObjectId -RoleDefinitionName $roleDefinitionName -ResourceGroupName $resourceGroup
    
  2. Usuń utworzone konto magazynu.

  3. Usuń utworzonego użytkownika.

Następne kroki