Teilen über


Lernprogramm: Hinzufügen einer Rollenzuweisungsbedingung zum Einschränken des Zugriffs auf Blobs mithilfe von Azure PowerShell

In den meisten Fällen gewährt eine Rollenzuweisung die Berechtigungen, die Sie für Azure-Ressourcen benötigen. In einigen Fällen sollten Sie jedoch eine genauere Zugriffssteuerung bereitstellen, indem Sie eine Rollenzuweisungsbedingung hinzufügen.

In diesem Tutorial lernen Sie Folgendes:

  • Hinzufügen einer Bedingung zu einer Rollenzuweisung
  • Einschränken des Zugriffs auf Blobs basierend auf einem Blob-Indextag

Von Bedeutung

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 Anforderungsattribut zum Einschluss des Listenblobs und das Anforderungsattribut von Momentaufnahmen für hierarchische Namespaces 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.

Zustand

In dieser Anleitung beschränken Sie den Zugriff auf Blobs mit einem bestimmten Tag. Beispielsweise fügen Sie einer Rollenzuweisung eine Bedingung hinzu, damit Chandra nur Dateien mit dem Tag Project=Cascade lesen kann.

Diagramm der Rollenzuweisung mit einer Bedingung.

Wenn Chandra versucht, ein Blob ohne das Tag Project=Cascade zu lesen, ist der Zugriff nicht zulässig.

Diagramm mit Lesezugriff auf Blobs mit Project=Cascade-Tag.

So sieht die Bedingung im Code 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. Verwenden Sie "Get-InstalledModule ", um Versionen installierter Module zu überprüfen.

    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 sie erneut, um die Sitzung zu aktualisieren.

Schritt 2: Anmelden bei Azure

  1. Verwenden Sie den Befehl "Connect-AzAccount" , und folgen Sie den Anweisungen, die angezeigt werden, um sich bei Ihrem Verzeichnis als Benutzerzugriffsadministrator oder -besitzer anzumelden.

    Connect-AzAccount
    
  2. Verwenden Sie Get-AzSubscription , um alle Ihre Abonnements aufzulisten.

    Get-AzSubscription
    
  3. Bestimmen 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 einen vorhandenen Benutzer zu finden. In diesem Lernprogramm wird Chandra als Beispiel verwendet.

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

    $userObjectId = "<userObjectId>"
    

Schritt 4: Einrichten von Speicher

  1. Verwenden Sie "New-AzStorageAccount ", um ein Speicherkonto zu erstellen, das mit dem Blob-Indexfeature kompatibel ist. Weitere Informationen finden Sie unter Verwalten und Finden von Azure-Blobdaten mit Blobindextags.

  2. Verwenden Sie New-AzStorageContainer , um einen neuen BLOB-Container innerhalb des Speicherkontos zu erstellen und die Anonyme Zugriffsebene auf "Privat" (kein anonymer Zugriff) festzulegen.

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

  4. Fügen Sie der Textdatei den folgenden Blob-Index-Tag hinzu. Weitere Informationen finden Sie unter Verwenden von BLOB-Indextags 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
    Projekt Cascade
  5. Laden Sie eine zweite Textdatei in den Container hoch.

  6. Fügen Sie der zweiten Textdatei den folgenden BLOB-Indextag hinzu.

    Schlüssel Wert
    Projekt Bäcker
  7. Initialisieren Sie die folgenden Variablen mit den 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 des Storage Blob Data Reader .

    $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. Diese Bedingung verwendet beispielsweise Dollarzeichen, um den Tagschlüsselnamen zu delineieren.

  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 die Rolle Storage Blob Data Reader mit einer Bedingung dem Benutzer auf Ebene einer Ressourcengruppe zuzuweisen.

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

    Hier ist ein Beispiel für das Ergebnis:

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

Schritt 6: (Optional) Anzeigen der Bedingung im Azure-Portal

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

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

  3. Suchen Sie auf der Registerkarte "Rollenzuweisungen" die Rolle.

  4. Wählen Sie in der Spalte "Bedingung " die Option "Ansicht/Bearbeiten" aus, um die Bedingung anzuzeigen.

Screenshot der Bedingung

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 verwendeten Namen.

    $storageAccountName = "<storageAccountName>"
    $containerName = "<containerName>"
    $blobNameBaker = "<blobNameBaker>"
    $blobNameCascade = "<blobNameCascade>"
    
  4. Verwenden Sie New-AzStorageContext , um einen bestimmten Kontext für den einfacheren Zugriff auf Ihr Speicherkonto zu erstellen.

    $bearerCtx = New-AzStorageContext -StorageAccountName $storageAccountName
    
  5. Verwenden Sie Get-AzStorageBlob , um die Datei für das Baker-Projekt zu lesen.

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

    Im Anschluss sehen Sie ein Beispiel für die Ausgabe. Beachten Sie, dass Sie die Datei aufgrund der hinzugefügten Bedingung nicht lesen können .

    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 Cascade-Projekt.

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

    Im Anschluss sehen Sie ein Beispiel für die Ausgabe. Beachten Sie, dass Sie die Datei lesen können, da sie das Tag Project=Cascade aufweist.

       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
    

Schritt 8: (Optional) 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. Verwenden Sie Set-AzRoleAssignment , um die Bedingung für die Rollenzuweisung zu aktualisieren.

    Set-AzRoleAssignment -InputObject $testRa -PassThru
    

    Hier ist ein Beispiel für das Ergebnis:

    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 von 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