Zelfstudie: Een voorwaarde voor roltoewijzing toevoegen om de toegang tot blobs te beperken met behulp van Azure CLI

In de meeste gevallen verleent een roltoewijzing de machtigingen die u nodig hebt voor Azure-resources. In sommige gevallen wilt u echter meer gedetailleerd toegangsbeheer bieden door een voorwaarde voor roltoewijzing toe te voegen.

In deze zelfstudie leert u het volgende:

  • Een voorwaarde toevoegen aan een roltoewijzing
  • Toegang tot blobs beperken op basis van een blobindextag

Belangrijk

Op kenmerken gebaseerd toegangsbeheer van Azure (Azure ABAC) is algemeen beschikbaar (GA) voor het beheren van de toegang tot Azure Blob Storage, Azure Data Lake Storage Gen2 en Azure Queues met behulp van request, resourceen environmentprincipal kenmerken in de prestatielagen standard en Premium Storage-account. Momenteel zijn het resourcekenmerk voor containermetagegevens en de lijst-blob inclusief het aanvraagkenmerk in PREVIEW. Zie Status van voorwaardefuncties in Azure Storage voor volledige informatie over de functiestatus van ABAC voor Azure Storage.

Raadpleeg de Aanvullende voorwaarden voor Microsoft Azure-previews voor juridische voorwaarden die van toepassing zijn op Azure-functies die in bèta of preview zijn of die anders nog niet algemeen beschikbaar zijn.

Vereisten

Zie Voorwaarden voor informatie over de vereisten voor het toevoegen of bewerken van voorwaarden voor roltoewijzing.

Conditie

In deze zelfstudie beperkt u de toegang tot blobs met een specifieke tag. U voegt bijvoorbeeld een voorwaarde toe aan een roltoewijzing, zodat Chandra alleen bestanden kan lezen met de tag Project=Cascade.

Diagram van roltoewijzing met een voorwaarde.

Als Chandra probeert een blob te lezen zonder de tag Project=Cascade, is toegang niet toegestaan.

Diagram met leestoegang tot blobs met project=trapsgewijs label.

De voorwaarde ziet er als volgt uit in code:

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

Stap 1: Aanmelden bij Azure

  1. Gebruik de opdracht az login en volg de instructies die worden weergegeven om u aan te melden bij uw directory als User Access Beheer istrator of Owner.

    az login
    
  2. Gebruik az account show om de id van uw abonnementen op te halen.

    az account show
    
  3. Bepaal de abonnements-id en initialiseer de variabele.

    subscriptionId="<subscriptionId>"
    

Stap 2: Een gebruiker maken

  1. Gebruik az ad user create om een gebruiker te maken of een bestaande gebruiker te zoeken. In deze zelfstudie wordt Chandra gebruikt als voorbeeld.

  2. Initialiseer de variabele voor de object-id van de gebruiker.

    userObjectId="<userObjectId>"
    

Stap 3: Opslag instellen

U kunt toegang tot Blob Storage vanuit de Azure CLI autoriseren met Microsoft Entra-referenties of met behulp van de toegangssleutel voor het opslagaccount. In dit artikel wordt beschreven hoe u Blob Storage-bewerkingen kunt autoriseren met behulp van Microsoft Entra-id. Zie quickstart: Blobs maken, downloaden en vermelden met Azure CLI voor meer informatie

  1. Gebruik az storage-account om een opslagaccount te maken dat compatibel is met de blob-indexfunctie. Zie Azure Blob-gegevens beheren en zoeken met blobindextags voor meer informatie.

  2. Gebruik az storage container om een nieuwe blobcontainer te maken in het opslagaccount en stel het anonieme toegangsniveau in op Privé (geen anonieme toegang).

  3. Gebruik az storage blob upload om een tekstbestand te uploaden naar de container.

  4. Voeg de volgende blobindextag toe aan het tekstbestand. Zie Blob-indextags gebruiken voor het beheren en vinden van gegevens in Azure Blob Storage voor meer informatie.

    Notitie

    Blobs bieden ook ondersteuning voor de mogelijkheid om willekeurige door de gebruiker gedefinieerde sleutelwaardemetagegevens op te slaan. Hoewel metagegevens vergelijkbaar zijn met blob-indextags, moet u blobindextags met voorwaarden gebruiken.

    Sleutel Weergegeven als
    Project Cascade
  5. Upload een tweede tekstbestand naar de container.

  6. Voeg de volgende blobindextag toe aan het tweede tekstbestand.

    Sleutel Weergegeven als
    Project Baker
  7. Initialiseer de volgende variabelen met de namen die u hebt gebruikt.

    resourceGroup="<resourceGroup>"
    storageAccountName="<storageAccountName>"
    containerName="<containerName>"
    blobNameCascade="<blobNameCascade>"
    blobNameBaker="<blobNameBaker>"
    

Stap 4: Een rol met een voorwaarde toewijzen

  1. Initialiseer de rolvariabelen opslagblobgegevenslezer .

    roleDefinitionName="Storage Blob Data Reader"
    roleDefinitionId="2a2b9908-6ea1-4ae2-8e65-a410df84e7d1"
    
  2. Initialiseer het bereik voor de resourcegroep.

    scope="/subscriptions/$subscriptionId/resourceGroups/$resourceGroup"
    
  3. Initialiseer de voorwaarde.

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

    Als geschiedenisuitbreiding is ingeschakeld in Bash, ziet u mogelijk het bericht bash: !: event not found vanwege het uitroepteken (!). In dit geval kunt u de geschiedenisuitbreiding uitschakelen met de opdracht set +H. Als u de geschiedenisuitbreiding opnieuw wilt inschakelen, gebruikt u set -H.

    In Bash heeft een dollarteken ($) speciale betekenis voor uitbreiding. Als uw voorwaarde een dollarteken ($) bevat, moet u deze mogelijk vooraf laten gaan door een backslash (\). Deze voorwaarde gebruikt bijvoorbeeld dollartekens om de naam van de tagsleutel af te bakenen. Zie Dubbele aanhalingstekens voor meer informatie over regels voor aanhalingstekens in Bash.

  4. Initialiseer de versie en beschrijving van de voorwaarde.

    conditionVersion="2.0"
    description="Read access to blobs with the tag Project=Cascade"
    
  5. Gebruik az role assignment create om de rol Storage Blob Data Reader met een voorwaarde toe te wijzen aan de gebruiker binnen een resourcegroepbereik.

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

    Hier is een voorbeeld van de uitvoer:

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

Stap 5: (Optioneel) Bekijk de voorwaarde in Azure Portal

  1. Open de resourcegroep in Azure Portal.

  2. Klik op Toegangsbeheer (IAM) .

  3. Zoek op het tabblad Roltoewijzingen de roltoewijzing.

  4. Selecteer Weergeven/bewerken in de kolom Voorwaarde om de voorwaarde weer te geven.

Schermopname van voorwaarde voor roltoewijzing toevoegen in Azure Portal.

Stap 6: De voorwaarde testen

  1. Open een nieuw opdrachtvenster.

  2. Gebruik az login om u aan te melden als Chandra.

    az login
    
  3. Initialiseer de volgende variabelen met de namen die u hebt gebruikt.

    storageAccountName="<storageAccountName>"
    containerName="<containerName>"
    blobNameBaker="<blobNameBaker>"
    blobNameCascade="<blobNameCascade>"
    
  4. Gebruik az storage blob show om de eigenschappen van het bestand voor het Baker-project te lezen.

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

    Hier volgt een voorbeeld van de uitvoer. U ziet dat u het bestand niet kunt lezen vanwege de voorwaarde die u hebt toegevoegd.

    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. Lees de eigenschappen van het bestand voor het project Trapsgewijs.

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

    Hier volgt een voorbeeld van de uitvoer. U ziet dat u de eigenschappen van het bestand kunt lezen omdat het de tag Project=Trapsgewijs heeft.

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

Stap 7: (Optioneel) De voorwaarde bewerken

  1. Gebruik az role assignment list in het andere opdrachtvenster om de roltoewijzing op te halen die u hebt toegevoegd.

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

    De uitvoer lijkt op het volgende:

    [
      {
        "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. Maak een JSON-bestand met de volgende indeling en werk de condition eigenschappen bij 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. Gebruik az role assignment update om de voorwaarde voor de roltoewijzing bij te werken.

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

Stap 8: Resources opschonen

  1. Gebruik az role assignment delete om de roltoewijzing en voorwaarde die u hebt toegevoegd te verwijderen.

    az role assignment delete --assignee $userObjectId --role "$roleDefinitionName" --resource-group $resourceGroup
    
  2. Verwijder het opslagaccount dat u hebt gemaakt.

  3. Verwijder de gebruiker die u hebt gemaakt.

Volgende stappen