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.
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: Anmelden bei Azure
Verwenden Sie den Befehl az login, und befolgen Sie die angezeigten Anweisungen, um sich als Benutzerzugriffsadministrator oder Besitzer bei Ihrem Verzeichnis anzumelden.
az login
Verwenden Sie az account show, um die ID Ihrer Abonnements abzurufen.
az account show
Ermitteln Sie die Abonnement-ID, und initialisieren Sie die Variable.
subscriptionId="<subscriptionId>"
Schritt 2: Erstellen eines Benutzers
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.
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.
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.
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.
Verwenden Sie az storage blob upload, 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 4: 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 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 Befehlset +H
deaktivieren. Verwenden Sieset -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.
Initialisieren Sie die Bedingungsversion und -beschreibung.
conditionVersion="2.0" description="Read access to blobs with the tag Project=Cascade"
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
Ö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 6: Testen der Bedingung
Öffnen Sie ein neues Befehlsfenster.
Verwenden Sie az login, um sich als Chandra anzumelden.
az login
Initialisieren Sie die folgenden Variablen mit den von Ihnen verwendeten Namen:
storageAccountName="<storageAccountName>" containerName="<containerName>" blobNameBaker="<blobNameBaker>" blobNameCascade="<blobNameCascade>"
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.
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
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" } ]
Erstellen Sie eine JSON-Datei im folgenden Format, und aktualisieren Sie die Eigenschaften
condition
unddescription
.{ "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" }
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
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
Löschen Sie das von Ihnen erstellte Speicherkonto.
Löschen Sie den von Ihnen erstellten Benutzer.