Teilen über


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

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

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

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

    az account show
    
  3. Bestimmen 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 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 3: Einrichten von Speicher

Sie können den Zugriff auf Blob Storage über die Azure CLI entweder mit Microsoft Entra-Anmeldeinformationen oder mithilfe des Zugriffsschlüssels für das Speicherkonto autorisieren. In diesem Artikel wird gezeigt, wie Sie Blob Storage-Vorgänge mithilfe der Microsoft Entra-ID autorisieren. Weitere Informationen finden Sie in der Schnellstartanleitung: Erstellen, Herunterladen und Auflisten von Blobs mit Azure CLI

  1. Verwenden Sie az storage account , 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 az storage container , um einen neuen BLOB-Container innerhalb des Speicherkontos zu erstellen und die anonyme Zugriffsebene auf "Privat" (kein anonymer Zugriff) festzulegen.

  3. Verwenden Sie az storage blob upload , 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 4: 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 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 Expansion. Wenn Ihre Bedingung ein Dollarzeichen ($) enthält, müssen Sie sie möglicherweise einem umgekehrten Schrägstrich (\) voranstellen. Diese Bedingung verwendet beispielsweise Dollarzeichen, um den Tagschlüsselnamen zu delineieren. 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 die Rolle Storage Blob Data Reader mit einer Bedingung dem Benutzer auf Gruppenebene der Ressource zuzuweisen.

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

    Hier ist ein Beispiel für das Ergebnis:

    {
      "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"
    }
    

Schritt 5: (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 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 verwendeten Namen.

    storageAccountName="<storageAccountName>"
    containerName="<containerName>"
    blobNameBaker="<blobNameBaker>"
    blobNameCascade="<blobNameCascade>"
    
  4. Verwenden Sie az storage blob show , um zu versuchen, die Eigenschaften der Datei für das Baker-Projekt 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. Beachten Sie, dass Sie die Datei aufgrund der hinzugefügten Bedingung nicht lesen können .

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

    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. Beachten Sie, dass Sie die Eigenschaften der Datei lesen können, da sie das Tag Project=Cascade aufweist.

    {
      "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,
    
      ...
    
    }
    

Schritt 7: (Optional) Bearbeiten der Bedingung

  1. Verwenden Sie im anderen Befehlsfenster az-Rollenzuweisungsliste , 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 mit dem 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. Verwenden Sie az role assignment update, um die Bedingung für die Rollenzuweisung zu aktualisieren.

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

Schritt 8: Bereinigen von Ressourcen

  1. Verwenden Sie az role assignment delete, um die hinzugefügte Rollenzuweisung und Kondition 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