Tutorial: Hinzufügen einer Bedingung für Rollenzuweisungen zum Einschränken des Zugriffs auf Blobs mithilfe der Azure-Befehlszeilenschnittstelle

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: Anmelden bei Azure

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

    az login
    
  2. Verwenden Sie az account show, um die ID Ihrer Abonnements abzurufen.

    az account show
    
  3. Ermitteln Sie die Abonnement-ID, und initialisieren Sie die Variable.

    subscriptionId="<subscriptionId>"
    

Schritt 2: Erstellen eines Benutzers

  1. Verwenden Sie az ad user create, 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 3: Einrichten des Speichers

Der Zugriff auf Blobspeicher kann über die Azure-Befehlszeilenschnittstelle autorisiert werden. Hierzu können Sie entweder Microsoft Entra-Anmeldeinformationen oder den Speicherkonto-Zugriffsschlüssel verwenden. In diesem Artikel wird die Autorisierung von Blobspeichervorgängen mithilfe von Microsoft Entra gezeigt. Weitere Informationen finden Sie unter Schnellstart: Erstellen, Herunterladen und Auflisten von Blobs mit der Azure-Befehlszeilenschnittstelle.

  1. Erstellen Sie mithilfe von az storage account 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 az storage container innerhalb des Speicherkontos einen neuen Container, und legen Sie die anonyme Zugriffsebene auf Privat (kein anonymer Zugriff) fest.

  3. Verwenden Sie az storage blob upload, 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 4: 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 die Verlaufserweiterung in Bash aktiviert ist, wird aufgrund des Ausrufezeichens (!) unter Umständen die Meldung bash: !: event not found angezeigt. In diesem Fall können Sie die Verlaufserweiterung mit dem Befehl set +H deaktivieren. Verwenden Sie set -H, um die Verlaufserweiterung erneut zu aktivieren.

    In Bash hat ein Dollarzeichen ($) eine besondere Bedeutung für die Erweiterung. Wenn Ihre Bedingung ein Dollarzeichen ($) enthält, müssen Sie diesem ggf. einen umgekehrten Schrägstrich (\) voranstellen. In dieser Bedingung werden beispielsweise Dollarzeichen zum Trennen der Tagschlüsselnamen verwendet. Weitere Informationen zu Regeln für Anführungszeichen in Bash finden Sie unter Doppelte Anführungszeichen.

  4. Initialisieren Sie die Bedingungsversion und -beschreibung.

    conditionVersion="2.0"
    description="Read access to blobs with the tag Project=Cascade"
    
  5. Verwenden Sie az role assignment create, um dem Benutzer in einem Ressourcengruppenbereich die Rolle Storage-Blobdatenleser zuzuweisen.

    az role assignment create --assignee-object-id $userObjectId --scope $scope --role $roleDefinitionId --description "$description" --condition "$condition" --condition-version $conditionVersion
    

    Beispiel für die Ausgabe:

    {
      "canDelegate": null,
      "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'))",
      "conditionVersion": "2.0",
      "description": "Read access to blobs with the tag Project=Cascade",
      "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Authorization/roleAssignments/{roleAssignmentId}",
      "name": "{roleAssignmentId}",
      "principalId": "{userObjectId}",
      "principalType": "User",
      "resourceGroup": "{resourceGroup}",
      "roleDefinitionId": "/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/2a2b9908-6ea1-4ae2-8e65-a410df84e7d1",
      "scope": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}",
      "type": "Microsoft.Authorization/roleAssignments"
    }
    

(Optional) Schritt 5: 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 6: Testen der Bedingung

  1. Öffnen Sie ein neues Befehlsfenster.

  2. Verwenden Sie az login, um sich als Chandra anzumelden.

    az login
    
  3. Initialisieren Sie die folgenden Variablen mit den von Ihnen verwendeten Namen:

    storageAccountName="<storageAccountName>"
    containerName="<containerName>"
    blobNameBaker="<blobNameBaker>"
    blobNameCascade="<blobNameCascade>"
    
  4. Versuchen Sie, mithilfe von az storage blob show die Eigenschaften der Datei für das Projekt „Baker“ zu lesen.

    az storage blob show --account-name $storageAccountName --container-name $containerName --name $blobNameBaker --auth-mode login
    

    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.

    You do not have the required permissions needed to perform this operation.
    Depending on your operation, you may need to be assigned one of the following roles:
        "Storage Blob Data Contributor"
        "Storage Blob Data Reader"
        "Storage Queue Data Contributor"
        "Storage Queue Data Reader"
    
    If you want to use the old authentication method and allow querying for the right account key, please use the "--auth-mode" parameter and "key" value.
    
  5. Lesen Sie die Eigenschaften der Datei für das Projekt „Cascade“.

    az storage blob show --account-name $storageAccountName --container-name $containerName --name $blobNameCascade --auth-mode login 
    

    Im Anschluss sehen Sie ein Beispiel für die Ausgabe. Wie Sie sehen, können Sie die Eigenschaften der Datei lesen, da sie über das Tag „Project=Cascade“ verfügt.

    {
      "container": "<containerName>",
      "content": "",
      "deleted": false,
      "encryptedMetadata": null,
      "encryptionKeySha256": null,
      "encryptionScope": null,
      "isAppendBlobSealed": null,
      "isCurrentVersion": null,
      "lastAccessedOn": null,
      "metadata": {},
      "name": "<blobNameCascade>",
      "objectReplicationDestinationPolicy": null,
      "objectReplicationSourceProperties": [],
      "properties": {
        "appendBlobCommittedBlockCount": null,
        "blobTier": "Hot",
        "blobTierChangeTime": null,
        "blobTierInferred": true,
        "blobType": "BlockBlob",
        "contentLength": 7,
        "contentRange": null,
    
      ...
    
    }
    

(Optional) Schritt 7: Bearbeiten der Bedingung

  1. Verwenden Sie im anderen Befehlsfenster az role assignment list, um die hinzugefügte Rollenzuweisung abzurufen.

    az role assignment list --assignee $userObjectId --resource-group $resourceGroup
    

    Die Ausgabe sieht in etwa wie folgt aus:

    [
      {
        "canDelegate": null,
        "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'))",
        "conditionVersion": "2.0",
        "description": "Read access to blobs with the tag Project=Cascade",
        "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Authorization/roleAssignments/{roleAssignmentId}",
        "name": "{roleAssignmentId}",
        "principalId": "{userObjectId}",
        "principalName": "chandra@contoso.com",
        "principalType": "User",
        "resourceGroup": "{resourceGroup}",
        "roleDefinitionId": "/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/2a2b9908-6ea1-4ae2-8e65-a410df84e7d1",
        "roleDefinitionName": "Storage Blob Data Reader",
        "scope": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}",
        "type": "Microsoft.Authorization/roleAssignments"
      }
    ]
    
  2. Erstellen Sie eine JSON-Datei im folgenden Format, und aktualisieren Sie die Eigenschaften condition und description.

    {
        "canDelegate": null,
        "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'))",
        "conditionVersion": "2.0",
        "description": "Read access to blobs with the tag Project=Cascade or Project=Baker",
        "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Authorization/roleAssignments/{roleAssignmentId}",
        "name": "{roleAssignmentId}",
        "principalId": "{userObjectId}",
        "principalName": "chandra@contoso.com",
        "principalType": "User",
        "resourceGroup": "{resourceGroup}",
        "roleDefinitionId": "/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/2a2b9908-6ea1-4ae2-8e65-a410df84e7d1",
        "roleDefinitionName": "Storage Blob Data Reader",
        "scope": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}",
        "type": "Microsoft.Authorization/roleAssignments"
    }
    
  3. Aktualisieren Sie mithilfe von az role assignment update die Bedingung für die Rollenzuweisung.

    az role assignment update --role-assignment "./path/roleassignment.json"
    

Schritt 8: Bereinigen der Ressourcen

  1. Verwenden Sie az role assignment delete, um die hinzugefügte Rollenzuweisung und Bedingung zu entfernen.

    az role assignment delete --assignee $userObjectId --role "$roleDefinitionName" --resource-group $resourceGroup
    
  2. Löschen Sie das von Ihnen erstellte Speicherkonto.

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

Nächste Schritte