Condividi tramite


Guida pratica: Aggiungere una condizione di assegnazione di ruolo per limitare l'accesso ai BLOB tramite Azure CLI

Nella maggior parte dei casi, un'assegnazione di ruolo concede le autorizzazioni necessarie alle risorse di Azure. Tuttavia, in alcuni casi potrebbe essere necessario fornire un controllo di accesso più granulare aggiungendo una condizione di assegnazione di ruolo.

In questa esercitazione si apprenderà come:

  • Aggiungere una condizione a un'assegnazione di ruolo
  • Limitare l'accesso ai BLOB in base a un tag indice BLOB

Importante

Il controllo degli accessi in base all'attributo di Azure (Azure ABAC) è disponibile a livello generale per il controllo dell'accesso ad Archiviazione BLOB di Azure, Azure Data Lake Storage Gen2 e Code di Azure tramite gli attributi request, resource, environment e principal nei livelli di prestazioni dell'account di archiviazione Standard e Premium. Il BLOB di elenco include attualmente l'attributo di richiesta e l'attributo di richiesta snapshot per lo spazio dei nomi gerarchico, disponibili in ANTEPRIMA. Per informazioni complete sullo stato della funzionalità di controllo degli accessi in base all'attributo (ABAC) per Archiviazione di Azure, vedere Stato delle funzionalità relative alle condizioni in Archiviazione di Azure.

Vedere le condizioni per l'utilizzo supplementari per le anteprime di Microsoft Azure per termini legali aggiuntivi che si applicano a funzionalità di Azure in versione beta, in anteprima o in altro modo non ancora disponibili a livello generale.

Prerequisiti

Per informazioni sui prerequisiti per l'aggiunta o la modifica di condizioni di assegnazione di ruolo, vedere Prerequisiti per le condizioni.

Condizione

In questa esercitazione si limita l'accesso ai BLOB con un tag specifico. Ad esempio, si aggiunge una condizione a un'assegnazione di ruolo in modo che Chandra possa leggere solo i file con il tag Project=Cascade.

Diagramma dell'assegnazione di ruolo con una condizione.

Se Chandra tenta di leggere un BLOB senza il tag Project=Cascade, l'accesso non è consentito.

Diagramma che mostra l'accesso in lettura ai BLOB con il tag Project=Cascade.

Ecco l'aspetto della condizione nel codice:

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

Passaggio 1: Accedere ad Azure

  1. Usare il comando az login e seguire le istruzioni visualizzate per accedere alla directory come Amministratore accesso utenti o Proprietario.

    az login
    
  2. Usare az account show per ottenere l'ID delle sottoscrizioni.

    az account show
    
  3. Determinare l'ID sottoscrizione e inizializzare la variabile.

    subscriptionId="<subscriptionId>"
    

Passaggio 2: Creare un utente

  1. Usare az ad user create per creare un utente o trovare un utente esistente. Questa esercitazione usa Chandra come esempio.

  2. Inizializzare la variabile per l'ID oggetto dell'utente.

    userObjectId="<userObjectId>"
    

Passaggio 3: Configurare l'archiviazione

È possibile autorizzare l'accesso all'archiviazione BLOB dall'interfaccia della riga di comando di Azure con le credenziali di Microsoft Entra o usando la chiave di accesso dell'account di archiviazione. Questo articolo illustra come autorizzare le operazioni di archiviazione BLOB usando Microsoft Entra ID. Per altre informazioni, vedere Avvio rapido: Creare, scaricare ed elencare BLOB con l'interfaccia della riga di comando di Azure

  1. Usare az storage account per creare un account di archiviazione compatibile con la funzionalità di indice BLOB. Per altre informazioni, vedere Gestire e trovare i dati BLOB di Azure con tag indice BLOB.

  2. Usare az storage container per creare un nuovo contenitore BLOB all'interno dell'account di archiviazione e impostare il livello di accesso anonimo su Privato (nessun accesso anonimo).

  3. Usare az storage blob upload per caricare un file di testo nel contenitore.

  4. Aggiungere il tag di indice BLOB seguente al file di testo. Per altre informazioni, vedere Usare i tag indice BLOB per gestire e trovare dati in Archiviazione BLOB di Azure.

    Annotazioni

    I BLOB supportano anche la possibilità di archiviare metadati chiave-valore arbitrari definiti dall'utente. Anche se i metadati sono simili ai tag indice BLOB, è necessario usare i tag indice BLOB con le condizioni.

    Chiave Valore
    Progetto Cascade
  5. Caricare un secondo file di testo nel contenitore.

  6. Aggiungere il tag di indice BLOB seguente al secondo file di testo.

    Chiave Valore
    Progetto Baker
  7. Inizializzare le variabili seguenti con i nomi usati.

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

Passaggio 4: Assegnare un ruolo con una condizione

  1. Inizializzare le variabili del ruolo Lettore di dati BLOB di archiviazione.

    roleDefinitionName="Storage Blob Data Reader"
    roleDefinitionId="2a2b9908-6ea1-4ae2-8e65-a410df84e7d1"
    
  2. Inizializzare l'ambito per il gruppo di risorse.

    scope="/subscriptions/$subscriptionId/resourceGroups/$resourceGroup"
    
  3. Inizializzare la condizione.

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

    In Bash, se l'espansione della cronologia è abilitata, è possibile che venga visualizzato il messaggio bash: !: event not found a causa del punto esclamativo (!). In questo caso, è possibile disabilitare l'espansione della cronologia con il comando set +H. Per riabilitare l'espansione della cronologia, utilizzare set -H.

    In Bash, un segno di dollaro ($) ha un significato speciale per l'espansione. Se la condizione include un segno di dollaro ($), potrebbe essere necessario anteporre una barra rovesciata (\). Ad esempio, questa condizione usa segni di dollaro per delineare il nome della chiave del tag. Per altre informazioni sulle regole per le virgolette in Bash, vedere Virgolette doppie.

  4. Inizializzare la versione e la descrizione della condizione.

    conditionVersion="2.0"
    description="Read access to blobs with the tag Project=Cascade"
    
  5. Usare az role assignment create per assegnare il ruolo Lettore di dati BLOB di archiviazione con una condizione all'utente in un ambito del gruppo di risorse.

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

    Di seguito è riportato un esempio dell'output:

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

Passaggio 5: (Facoltativo) Visualizzare la condizione nel portale di Azure

  1. Nel portale di Azure aprire il gruppo di risorse.

  2. Seleziona Controllo di accesso (IAM).

  3. Nella scheda Assegnazioni di ruolo trovare l'assegnazione di ruolo.

  4. Nella colonna Condizione selezionare Visualizza/Modifica per visualizzare la condizione.

Screenshot dell'opzione Aggiungi condizione di assegnazione di ruolo nel portale di Azure.

Passaggio 6: Testare la condizione

  1. Aprire una nuova finestra di comando.

  2. Usare az login per accedere come Chandra.

    az login
    
  3. Inizializzare le variabili seguenti con i nomi usati.

    storageAccountName="<storageAccountName>"
    containerName="<containerName>"
    blobNameBaker="<blobNameBaker>"
    blobNameCascade="<blobNameCascade>"
    
  4. Usare az storage blob show per provare a leggere le proprietà del file per il progetto Baker.

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

    Ecco un esempio dell'output. Si noti che non è possibile leggere il file a causa della condizione aggiunta.

    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. Leggi le proprietà del file relativo al progetto Cascade.

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

    Ecco un esempio dell'output. Si noti che è possibile leggere le proprietà del file perché ha il tag 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,
    
      ...
    
    }
    

Passaggio 7: (Facoltativo) Modificare la condizione

  1. Nell'altra finestra di comando usare az role assignment list per ottenere l'assegnazione di ruolo aggiunta.

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

    L'output è simile al seguente:

    [
      {
        "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. Creare un file JSON con il formato seguente e aggiornare le condition proprietà e 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. Usare az role assignment update per aggiornare la condizione per l'assegnazione di ruolo.

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

Passaggio 8: Pulire le risorse

  1. Usare az role assignment delete per rimuovere l'assegnazione di ruolo e la condizione aggiunta.

    az role assignment delete --assignee $userObjectId --role "$roleDefinitionName" --resource-group $resourceGroup
    
  2. Eliminare l'account di archiviazione creato.

  3. Eliminare l'utente creato.

Passaggi successivi