Tutorial: Hinzufügen einer Bedingung für Rollenzuweisungen zum Einschränken des Zugriffs auf Blobs mithilfe von Azure PowerShell
In den meisten Fällen gewährt eine Rollenzuweisung die für Azure-Ressourcen benötigten Berechtigungen. Manchmal ist jedoch unter Umständen eine präzisere Zugriffssteuerung erforderlich, was durch Hinzufügen einer Rollenzuweisungsbedingung erreicht werden kann.
In diesem Tutorial lernen Sie Folgendes:
- Hinzufügen einer Bedingung zu einer Rollenzuweisung
- Einschränken des Zugriffs auf Blobs basierend auf einem Blobindextag
Wichtig
Die attributbasierte Zugriffssteuerung (Attribute-Based Access Control, ABAC) in Azure ist allgemein verfügbar, um den Zugriff auf Azure Blob Storage, Azure Data Lake Storage Gen2 und Azure-Warteschlangen mithilfe der Attribute request
, resource
, environment
und principal
sowohl auf der standardmäßigen als auch auf der Premium-Speicherkonto-Leistungsstufe zu steuern. Derzeit befinden sich das Ressourcenattribut für Containermetadaten und das Listen-BLOB-Anforderungsattribut in der VORSCHAU. Vollständige Informationen zum Status des ABAC-Features für Azure Storage finden Sie unter Status der Bedingungsfeatures in Azure Storage.
Die zusätzlichen Nutzungsbestimmungen für Microsoft Azure-Vorschauen enthalten rechtliche Bedingungen. Sie gelten für diejenigen Azure-Features, die sich in der Beta- oder Vorschauversion befinden oder aber anderweitig noch nicht zur allgemeinen Verfügbarkeit freigegeben sind.
Voraussetzungen
Informationen zu den Voraussetzungen für das Hinzufügen oder Bearbeiten von Rollenzuweisungsbedingungen finden Sie unter Voraussetzungen für Bedingungen.
Bedingung
In diesem Tutorial wird der Zugriff auf Blobs mit einem bestimmten Tag eingeschränkt. Hierzu wird beispielsweise einer Rollenzuweisung eine Bedingung hinzugefügt, die dafür sorgt, dass von Chandra nur Dateien mit dem Tag „Project=Cascade“ gelesen werden können.
Wenn Chandra versucht, ein Blob ohne das Tag „Project=Cascade“ zu lesen, wird der Zugriff verweigert.
Im Code sieht die Bedingung wie folgt aus:
(
(
!(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'
)
)
Schritt 1: Installieren der erforderlichen Komponenten
Öffnen Sie ein PowerShell-Fenster.
Überprüfen Sie mithilfe von Get-InstalledModule die Versionen der installierten Module.
Get-InstalledModule -Name Az Get-InstalledModule -Name Az.Resources Get-InstalledModule -Name Az.Storage
Verwenden Sie bei Bedarf Install-Module, um die erforderlichen Versionen für die Module Az, Az.Resources und Az.Storage zu installieren.
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
Schließen Sie PowerShell, und öffnen Sie PowerShell wieder, um die Sitzung zu aktualisieren.
Schritt 2: Anmelden bei Azure
Verwenden Sie den Befehl Connect-AzAccount, und befolgen Sie die angezeigten Anweisungen, um sich als Benutzerzugriffsadministrator oder Besitzer bei Ihrem Verzeichnis anzumelden.
Connect-AzAccount
Listen Sie mithilfe von Get-AzSubscription alle Ihre Abonnements auf.
Get-AzSubscription
Ermitteln Sie die Abonnement-ID, und initialisieren Sie die Variable.
$subscriptionId = "<subscriptionId>"
Legen Sie das Abonnement als aktives Abonnement fest.
$context = Get-AzSubscription -SubscriptionId $subscriptionId Set-AzContext $context
Schritt 3: Erstellen eines Benutzers
Verwenden Sie New-MgUser, um einen Benutzer zu erstellen oder nach einem vorhandenen Benutzer zu suchen. In diesem Tutorial wird Chandra als Beispiel verwendet.
Initialisieren Sie die Variable für die Objekt-ID des Benutzers.
$userObjectId = "<userObjectId>"
Schritt 4: Einrichten des Speichers
Erstellen Sie mithilfe von New-AzStorageAccount ein Speicherkonto, das mit der Blobindexfunktion kompatibel ist. Weitere Informationen finden Sie unter Verwalten und Finden von Azure-Blobdaten mit Blobindextags.
Erstellen Sie mithilfe von New-AzStorageContainer innerhalb des Speicherkontos einen neuen Container, und legen Sie die öffentliche Zugriffsebene auf Privat (kein anonymer Zugriff) fest.
Verwenden Sie Set-AzStorageBlobContent, um eine Textdatei in den Container hochzuladen.
Fügen Sie der Textdatei das folgende Blobindextag hinzu. Weitere Informationen finden Sie unter Verwenden von Blobindextags zum Verwalten und Suchen von Daten in Azure Blob Storage.
Hinweis
Von Blobs wird auch das Speichern beliebiger benutzerdefinierter Schlüssel-Wert-Metadaten unterstützt. Metadaten sind zwar mit Blobindextags vergleichbar, für Bedingungen müssen jedoch Blobindextags verwendet werden.
Schlüssel Wert Project Cascade Laden Sie eine zweite Textdatei in den Container hoch.
Fügen Sie der zweiten Textdatei das folgende Blobindextag hinzu:
Schlüssel Wert Project Baker Initialisieren Sie die folgenden Variablen mit den von Ihnen verwendeten Namen:
$resourceGroup = "<resourceGroup>" $storageAccountName = "<storageAccountName>" $containerName = "<containerName>" $blobNameCascade = "<blobNameCascade>" $blobNameBaker = "<blobNameBaker>"
Schritt 5: Zuweisen einer Rolle mit einer Bedingung
Initialisieren Sie die Rollenvariablen Storage-Blobdatenleser.
$roleDefinitionName = "Storage Blob Data Reader" $roleDefinitionId = "2a2b9908-6ea1-4ae2-8e65-a410df84e7d1"
Initialisieren Sie den Bereich für die Ressourcengruppe.
$scope = "/subscriptions/$subscriptionId/resourceGroups/$resourceGroup"
Initialisieren Sie die Bedingung.
$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'))"
Wenn Ihre Bedingung ein Dollarzeichen ($) enthält, müssen Sie ihm in PowerShell ein umgekehrtes einfaches Anführungszeichen (`) voranstellen. In dieser Bedingung werden beispielsweise Dollarzeichen zum Trennen der Tagschlüsselnamen verwendet.
Initialisieren Sie die Bedingungsversion und -beschreibung.
$conditionVersion = "2.0" $description = "Read access to blobs with the tag Project=Cascade"
Verwenden Sie New-AzRoleAssignment, um dem Benutzer in einem Ressourcengruppenbereich die Rolle Storage-Blobdatenleser zuzuweisen.
New-AzRoleAssignment -ObjectId $userObjectId -Scope $scope -RoleDefinitionId $roleDefinitionId -Description $description -Condition $condition -ConditionVersion $conditionVersion
Beispiel für die Ausgabe:
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'))
(Optional) Schritt 6: Anzeigen der Bedingung im Azure-Portal
Öffnen Sie die Ressourcengruppe im Azure-Portal.
Wählen Sie Zugriffssteuerung (IAM) aus.
Navigieren Sie auf der Registerkarte „Rollenzuweisungen“ zur Rollenzuweisung.
Klicken Sie in der Spalte Bedingung auf Anzeigen/Bearbeiten, um die Bedingung anzuzeigen.
Schritt 7: Testen der Bedingung
Öffnen Sie ein neues PowerShell-Fenster.
Verwenden Sie Connect-AzAccount, um sich als Chandra anzumelden.
Connect-AzAccount
Initialisieren Sie die folgenden Variablen mit den von Ihnen verwendeten Namen:
$storageAccountName = "<storageAccountName>" $containerName = "<containerName>" $blobNameBaker = "<blobNameBaker>" $blobNameCascade = "<blobNameCascade>"
Erstellen Sie mithilfe von New-AzStorageContext einen spezifischen Kontext für den einfacheren Zugriff auf Ihr Speicherkonto.
$bearerCtx = New-AzStorageContext -StorageAccountName $storageAccountName
Versuchen Sie, mithilfe von Get-AzStorageBlob die Datei für das Projekt „Baker“ zu lesen.
Get-AzStorageBlob -Container $containerName -Blob $blobNameBaker -Context $bearerCtx
Im Anschluss sehen Sie ein Beispiel für die Ausgabe. Wie Sie sehen, können Sie die Datei aufgrund der hinzugefügten Bedingung nicht lesen.
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
Lesen Sie die Datei für das Projekt „Cascade“.
Get-AzStorageBlob -Container $containerName -Blob $blobNameCascade -Context $bearerCtx
Im Anschluss sehen Sie ein Beispiel für die Ausgabe. Wie Sie sehen, können Sie die Datei lesen, da sie über das Tag „Project=Cascade“ verfügt.
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
(Optional) Schritt 8: Bearbeiten der Bedingung
Verwenden Sie im anderen PowerShell-Fenster Get-AzRoleAssignment, um die hinzugefügte Rollenzuweisung abzurufen.
$testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectId
Bearbeiten Sie die Bedingung.
$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'))"
Initialisieren Sie die Bedingung und Beschreibung.
$testRa.Condition = $condition $testRa.Description = "Read access to blobs with the tag Project=Cascade or Project=Baker"
Aktualisieren Sie mithilfe von Set-AzRoleAssignment die Bedingung für die Rollenzuweisung.
Set-AzRoleAssignment -InputObject $testRa -PassThru
Beispiel für die Ausgabe:
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'))
Schritt 9: Bereinigen der Ressourcen
Verwenden Sie Remove-AzRoleAssignment, um die hinzugefügte Rollenzuweisung und Bedingung zu entfernen.
Remove-AzRoleAssignment -ObjectId $userObjectId -RoleDefinitionName $roleDefinitionName -ResourceGroupName $resourceGroup
Löschen Sie das von Ihnen erstellte Speicherkonto.
Löschen Sie den von Ihnen erstellten Benutzer.