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 request
atrybutów , resource
, environment
i 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.
Jeśli Chandra próbuje odczytać obiekt blob bez tagu Project=Cascade, dostęp nie jest dozwolony.
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
Otwórz okno programu PowerShell.
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
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
Zamknij i otwórz ponownie program PowerShell, aby odświeżyć sesję.
Krok 2. Logowanie się do platformy Azure
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
Użyj polecenia Get-AzSubscription , aby wyświetlić listę wszystkich subskrypcji.
Get-AzSubscription
Określ identyfikator subskrypcji i zainicjuj zmienną.
$subscriptionId = "<subscriptionId>"
Ustaw subskrypcję jako aktywną subskrypcję.
$context = Get-AzSubscription -SubscriptionId $subscriptionId Set-AzContext $context
Krok 3. Tworzenie użytkownika
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.
Zainicjuj zmienną identyfikatora obiektu użytkownika.
$userObjectId = "<userObjectId>"
Krok 4. Konfigurowanie magazynu
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.
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).
Użyj polecenia Set-AzStorageBlobContent , aby przekazać plik tekstowy do kontenera.
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 Przekaż drugi plik tekstowy do kontenera.
Dodaj następujący tag indeksu obiektów blob do drugiego pliku tekstowego.
Key Wartość Projekt Baker 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
Zainicjuj zmienne roli Czytelnik danych obiektu blob usługi Storage.
$roleDefinitionName = "Storage Blob Data Reader" $roleDefinitionId = "2a2b9908-6ea1-4ae2-8e65-a410df84e7d1"
Zainicjuj zakres grupy zasobów.
$scope = "/subscriptions/$subscriptionId/resourceGroups/$resourceGroup"
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.
Zainicjuj wersję i opis warunku.
$conditionVersion = "2.0" $description = "Read access to blobs with the tag Project=Cascade"
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
W witrynie Azure Portal otwórz grupę zasobów.
Wybierz pozycję Kontrola dostępu (IAM) .
Na karcie Przypisania ról znajdź przypisanie roli.
W kolumnie Warunek wybierz pozycję Widok/Edytuj, aby wyświetlić warunek.
Krok 7. Testowanie warunku
Otwórz nowe okno programu PowerShell.
Użyj polecenia Połączenie-AzAccount, aby zalogować się jako Chandra.
Connect-AzAccount
Zainicjuj następujące zmienne przy użyciu użytych nazw.
$storageAccountName = "<storageAccountName>" $containerName = "<containerName>" $blobNameBaker = "<blobNameBaker>" $blobNameCascade = "<blobNameCascade>"
Użyj polecenia New-AzStorageContext , aby łatwiej utworzyć określony kontekst w celu uzyskania dostępu do konta magazynu.
$bearerCtx = New-AzStorageContext -StorageAccountName $storageAccountName
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
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
W innym oknie programu PowerShell użyj polecenia Get-AzRoleAssignment , aby uzyskać dodane przypisanie roli.
$testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectId
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'))"
Zainicjuj warunek i opis.
$testRa.Condition = $condition $testRa.Description = "Read access to blobs with the tag Project=Cascade or Project=Baker"
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
Użyj polecenia Remove-AzRoleAssignment , aby usunąć dodane przypisanie i warunek roli.
Remove-AzRoleAssignment -ObjectId $userObjectId -RoleDefinitionName $roleDefinitionName -ResourceGroupName $resourceGroup
Usuń utworzone konto magazynu.
Usuń utworzonego użytkownika.