Dela via


Självstudie: Lägga till ett rolltilldelningsvillkor för att begränsa åtkomsten till blobar med hjälp av Azure CLI

I de flesta fall ger en rolltilldelning de behörigheter du behöver för Azure-resurser. I vissa fall kanske du dock vill ge mer detaljerad åtkomstkontroll genom att lägga till ett rolltilldelningsvillkor.

I den här självstudien lär du dig att:

  • Lägga till ett villkor i en rolltilldelning
  • Begränsa åtkomsten till blobar baserat på en blobindextagg

Viktigt!

Azure-attributbaserad åtkomstkontroll (Azure ABAC) är allmänt tillgänglig (GA) för att styra åtkomsten till Azure Blob Storage, Azure Data Lake Storage Gen2 och Azure Queues med hjälp av request, resourceoch environmentprincipal attribut på prestandanivåerna för både standard- och Premium Storage-konton. För närvarande finns resursattributet för containermetadata och listbloben med begärandeattributet i FÖRHANDSVERSION. Fullständig information om funktionsstatus för ABAC för Azure Storage finns i Status för villkorsfunktioner i Azure Storage.

Juridiska villkor för Azure-funktioner i betaversion, förhandsversion eller som av någon annan anledning inte har gjorts allmänt tillgängliga ännu finns i kompletterande användningsvillkor för Microsoft Azure-förhandsversioner.

Förutsättningar

Information om kraven för att lägga till eller redigera rolltilldelningsvillkor finns i Villkorskrav.

Villkor

I den här självstudien begränsar du åtkomsten till blobar med en specifik tagg. Du kan till exempel lägga till ett villkor i en rolltilldelning så att Chandra bara kan läsa filer med taggen Project=Cascade.

Diagram över rolltilldelning med ett villkor.

Om Chandra försöker läsa en blob utan taggen Project=Cascade tillåts inte åtkomst.

Diagram som visar läsåtkomst till blobar med Project=Cascade-tagg.

Så här ser villkoret ut i kod:

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

Steg 1: Logga in på Azure

  1. Använd kommandot az login och följ anvisningarna som visas för att logga in på din katalog som administratör för användaråtkomst eller ägare.

    az login
    
  2. Använd az account show för att hämta ID för dina prenumerationer.

    az account show
    
  3. Fastställ prenumerations-ID:t och initiera variabeln.

    subscriptionId="<subscriptionId>"
    

Steg 2: Skapa en användare

  1. Använd az ad user create för att skapa en användare eller hitta en befintlig användare. I den här självstudien används Chandra som exempel.

  2. Initiera variabeln för användarens objekt-ID.

    userObjectId="<userObjectId>"
    

Steg 3: Konfigurera lagring

Du kan auktorisera åtkomst till Blob Storage från Azure CLI antingen med Microsoft Entra-autentiseringsuppgifter eller med hjälp av åtkomstnyckeln för lagringskontot. Den här artikeln visar hur du auktoriserar bloblagringsåtgärder med hjälp av Microsoft Entra-ID. Mer information finns i Snabbstart: Skapa, ladda ned och lista blobar med Azure CLI

  1. Använd az storage-kontot för att skapa ett lagringskonto som är kompatibelt med blobindexfunktionen. Mer information finns i Hantera och hitta Azure Blob-data med blobindextaggar.

  2. Använd az storage container för att skapa en ny blobcontainer i lagringskontot och ange den anonyma åtkomstnivån till Privat (ingen anonym åtkomst).

  3. Använd az storage blob upload för att ladda upp en textfil till containern.

  4. Lägg till följande blobindextagg i textfilen. Mer information finns i Använda blobindextaggar för att hantera och hitta data i Azure Blob Storage.

    Kommentar

    Blobar stöder också möjligheten att lagra godtyckliga användardefinierade nyckelvärdesmetadata. Även om metadata liknar blobindextaggar måste du använda blobindextaggar med villkor.

    Tangent Värde
    Project Cascade
  5. Ladda upp en andra textfil till containern.

  6. Lägg till följande blobindextagg i den andra textfilen.

    Tangent Värde
    Project Baker
  7. Initiera följande variabler med de namn som du använde.

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

Steg 4: Tilldela en roll med ett villkor

  1. Initiera rollvariablerna för Storage Blob Data Reader .

    roleDefinitionName="Storage Blob Data Reader"
    roleDefinitionId="2a2b9908-6ea1-4ae2-8e65-a410df84e7d1"
    
  2. Initiera omfånget för resursgruppen.

    scope="/subscriptions/$subscriptionId/resourceGroups/$resourceGroup"
    
  3. Initiera villkoret.

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

    Om historikexpansionen är aktiverad i Bash kan meddelandet bash: !: event not found visas på grund av utropstecken (!). I det här fallet kan du inaktivera historikexpansion med kommandot set +H. Om du vill återaktivera historikexpansion använder du set -H.

    I Bash har ett dollartecken ($) en särskild betydelse för expansion. Om villkoret innehåller ett dollartecken ($) kan du behöva prefixet med ett omvänt snedstreck (\). Det här villkoret använder till exempel dollartecken för att definiera taggnyckelnamnet. Mer information om regler för citattecken i Bash finns i Dubbla citattecken.

  4. Initiera villkorsversionen och beskrivningen.

    conditionVersion="2.0"
    description="Read access to blobs with the tag Project=Cascade"
    
  5. Använd az role assignment create för att tilldela rollen Storage Blob Data Reader med ett villkor till användaren i ett resursgruppsomfång.

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

    Här är ett exempel på utdata:

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

Steg 5: (Valfritt) Visa villkoret i Azure-portalen

  1. Öppna resursgruppen i Azure-portalen.

  2. Välj Åtkomstkontroll (IAM) .

  3. Leta upp rolltilldelningen på fliken Rolltilldelningar.

  4. I kolumnen Villkor väljer du Visa/redigera för att visa villkoret.

Skärmbild av Lägg till rolltilldelningsvillkor i Azure-portalen.

Steg 6: Testa villkoret

  1. Öppna ett nytt kommandofönster.

  2. Använd az login för att logga in som Chandra.

    az login
    
  3. Initiera följande variabler med de namn som du använde.

    storageAccountName="<storageAccountName>"
    containerName="<containerName>"
    blobNameBaker="<blobNameBaker>"
    blobNameCascade="<blobNameCascade>"
    
  4. Använd az storage blob show för att försöka läsa egenskaperna för filen för Baker-projektet.

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

    Här är ett exempel på utdata. Observera att du inte kan läsa filen på grund av villkoret du lade till.

    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. Läs egenskaperna för filen för Cascade-projektet.

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

    Här är ett exempel på utdata. Observera att du kan läsa egenskaperna för filen eftersom den har taggen Project=Cascade.

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

Steg 7: (Valfritt) Redigera villkoret

  1. I det andra kommandofönstret använder du az role assignment list för att hämta rolltilldelningen som du har lagt till.

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

    De utdata som genereras liknar följande:

    [
      {
        "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. Skapa en JSON-fil med följande format och uppdatera condition egenskaperna och 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. Använd az role assignment update för att uppdatera villkoret för rolltilldelningen.

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

Steg 8: Rensa resurser

  1. Använd az role assignment delete för att ta bort rolltilldelningen och villkoret som du lade till.

    az role assignment delete --assignee $userObjectId --role "$roleDefinitionName" --resource-group $resourceGroup
    
  2. Ta bort lagringskontot som du skapade.

  3. Ta bort den användare som du skapade.

Nästa steg