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.

Diagramm: Rollenzuweisung mit einer Bedingung

Wenn Chandra versucht, ein Blob ohne das Tag „Project=Cascade“ zu lesen, wird der Zugriff verweigert.

Diagramm: Lesezugriff auf Blobs mit dem Tag „Project=Cascade“

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

  1. Öffnen Sie ein PowerShell-Fenster.

  2. Ü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
    
  3. 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
    
  4. Schließen Sie PowerShell, und öffnen Sie PowerShell wieder, um die Sitzung zu aktualisieren.

Schritt 2: Anmelden bei Azure

  1. Verwenden Sie den Befehl Connect-AzAccount, und befolgen Sie die angezeigten Anweisungen, um sich als Benutzerzugriffsadministrator oder Besitzer bei Ihrem Verzeichnis anzumelden.

    Connect-AzAccount
    
  2. Listen Sie mithilfe von Get-AzSubscription alle Ihre Abonnements auf.

    Get-AzSubscription
    
  3. Ermitteln Sie die Abonnement-ID, und initialisieren Sie die Variable.

    $subscriptionId = "<subscriptionId>"
    
  4. Legen Sie das Abonnement als aktives Abonnement fest.

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

Schritt 3: Erstellen eines Benutzers

  1. Verwenden Sie New-MgUser, um einen Benutzer zu erstellen oder nach einem vorhandenen Benutzer zu suchen. In diesem Tutorial wird Chandra als Beispiel verwendet.

  2. Initialisieren Sie die Variable für die Objekt-ID des Benutzers.

    $userObjectId = "<userObjectId>"
    

Schritt 4: Einrichten des Speichers

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

  2. Erstellen Sie mithilfe von New-AzStorageContainer innerhalb des Speicherkontos einen neuen Container, und legen Sie die öffentliche Zugriffsebene auf Privat (kein anonymer Zugriff) fest.

  3. Verwenden Sie Set-AzStorageBlobContent, um eine Textdatei in den Container hochzuladen.

  4. 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
  5. Laden Sie eine zweite Textdatei in den Container hoch.

  6. Fügen Sie der zweiten Textdatei das folgende Blobindextag hinzu:

    Schlüssel Wert
    Project Baker
  7. 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

  1. Initialisieren Sie die Rollenvariablen Storage-Blobdatenleser.

    $roleDefinitionName = "Storage Blob Data Reader"
    $roleDefinitionId = "2a2b9908-6ea1-4ae2-8e65-a410df84e7d1"
    
  2. Initialisieren Sie den Bereich für die Ressourcengruppe.

    $scope = "/subscriptions/$subscriptionId/resourceGroups/$resourceGroup"
    
  3. 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.

  4. Initialisieren Sie die Bedingungsversion und -beschreibung.

    $conditionVersion = "2.0"
    $description = "Read access to blobs with the tag Project=Cascade"
    
  5. 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

  1. Öffnen Sie die Ressourcengruppe im Azure-Portal.

  2. Wählen Sie Zugriffssteuerung (IAM) aus.

  3. Navigieren Sie auf der Registerkarte „Rollenzuweisungen“ zur Rollenzuweisung.

  4. Klicken Sie in der Spalte Bedingung auf Anzeigen/Bearbeiten, um die Bedingung anzuzeigen.

Screenshot: Bedingung „Rollenzuweisung hinzufügen“ im Azure-Portal

Schritt 7: Testen der Bedingung

  1. Öffnen Sie ein neues PowerShell-Fenster.

  2. Verwenden Sie Connect-AzAccount, um sich als Chandra anzumelden.

    Connect-AzAccount
    
  3. Initialisieren Sie die folgenden Variablen mit den von Ihnen verwendeten Namen:

    $storageAccountName = "<storageAccountName>"
    $containerName = "<containerName>"
    $blobNameBaker = "<blobNameBaker>"
    $blobNameCascade = "<blobNameCascade>"
    
  4. Erstellen Sie mithilfe von New-AzStorageContext einen spezifischen Kontext für den einfacheren Zugriff auf Ihr Speicherkonto.

    $bearerCtx = New-AzStorageContext -StorageAccountName $storageAccountName
    
  5. 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
    
  6. 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

  1. Verwenden Sie im anderen PowerShell-Fenster Get-AzRoleAssignment, um die hinzugefügte Rollenzuweisung abzurufen.

    $testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectId
    
  2. 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'))"
    
  3. Initialisieren Sie die Bedingung und Beschreibung.

    $testRa.Condition = $condition
    $testRa.Description = "Read access to blobs with the tag Project=Cascade or Project=Baker"
    
  4. 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

  1. Verwenden Sie Remove-AzRoleAssignment, um die hinzugefügte Rollenzuweisung und Bedingung zu entfernen.

    Remove-AzRoleAssignment -ObjectId $userObjectId -RoleDefinitionName $roleDefinitionName -ResourceGroupName $resourceGroup
    
  2. Löschen Sie das von Ihnen erstellte Speicherkonto.

  3. Löschen Sie den von Ihnen erstellten Benutzer.

Nächste Schritte