Esercitazione: Aggiungere una condizione di assegnazione di ruolo per limitare l'accesso ai BLOB tramite l’interfaccia della riga di comando di Azure
Nella maggior parte dei casi, un'assegnazione di ruolo concede le autorizzazioni necessarie alle risorse di Azure. In alcuni casi, tuttavia, potrebbe essere necessario fornire un controllo di accesso più granulare aggiungendo una condizione di assegnazione di ruolo.
In questa esercitazione apprenderai a:
- 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 è disponibile a livello generale per controllare l'accesso a Archiviazione BLOB di Azure, Azure Data Lake Archiviazione Gen2 e Code di Azure usando request
gli attributi , resource
environment
, e principal
nei livelli di prestazioni dell'account di archiviazione Standard e Premium. Attualmente, l'attributo della risorsa dei metadati del contenitore e l'attributo di richiesta di inclusione del BLOB di elenco sono 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.
Se Chandra tenta di leggere un BLOB senza il tag Project=Cascade, l'accesso non è consentito.
Di seguito è riportato 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
Usare il comando az login e seguire le istruzioni visualizzate per accedere alla directory come Amministratore accesso utente o Proprietario.
az login
Usare az account show per ottenere l'ID delle sottoscrizioni.
az account show
Determinare l'ID sottoscrizione e inizializzare la variabile.
subscriptionId="<subscriptionId>"
Passaggio 2: Creare un utente
Usare az ad user create per creare un utente o trovare un utente esistente. Questa esercitazione usa Chandra come esempio.
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 mostra come autorizzare le operazioni di archiviazione usando ID Microsoft Entra. Per altre informazioni, vedere Avvio rapido: Creare, scaricare ed elencare BLOB con l'interfaccia della riga di comando di Azure
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.
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).
Usare az storage blob upload per caricare un file di testo nel contenitore.
Aggiungere il tag 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.
Nota
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 tag indice BLOB con condizioni.
Chiave valore Project Cascade Caricare un secondo file di testo nel contenitore.
Aggiungere il tag indice BLOB seguente al secondo file di testo.
Chiave valore Project Baker 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
Inizializzare le variabili del ruolo Lettore di dati BLOB di archiviazione.
roleDefinitionName="Storage Blob Data Reader" roleDefinitionId="2a2b9908-6ea1-4ae2-8e65-a410df84e7d1"
Inizializzare l'ambito per il gruppo di risorse.
scope="/subscriptions/$subscriptionId/resourceGroups/$resourceGroup"
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 è abilitata l'espansione della cronologia, è 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 comandoset +H
. Per abilitare nuovamente l'espansione della cronologia, usareset -H
.In Bash, il simbolo di dollaro ($) ha un significato speciale per l'espansione. Se la condizione include un simbolo di dollaro ($), potrebbe essere necessario anteporre una barra rovesciata (\). Ad esempio, questa condizione usa simboli di dollaro per delineare il nome della chiave del tag. Per altre informazioni sulle regole per le virgolette in Bash, vedere Virgolette doppie.
Inizializzare la versione e la descrizione della condizione.
conditionVersion="2.0" description="Read access to blobs with the tag Project=Cascade"
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
Ecco un esempio di 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
Nel portale di Azure aprire il gruppo di risorse.
Seleziona Controllo di accesso (IAM).
Nella scheda Assegnazioni di ruolo trovare l'assegnazione di ruolo.
Nella colonna Condizione selezionare Visualizza/Modifica per visualizzare la condizione.
Passaggio 6: Testare la condizione
Aprire una nuova finestra di comando.
Usare az login per accedere come Chandra.
az login
Inizializzare le variabili seguenti con i nomi usati.
storageAccountName="<storageAccountName>" containerName="<containerName>" blobNameBaker="<blobNameBaker>" blobNameCascade="<blobNameCascade>"
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
Di seguito è riportato un esempio di output. Tenere presente 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.
Leggere le proprietà del file per il progetto Cascade.
az storage blob show --account-name $storageAccountName --container-name $containerName --name $blobNameCascade --auth-mode login
Di seguito è riportato un esempio di output. Tenere presente che è possibile leggere il file perché contiene 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
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" } ]
Creare un file JSON con il formato seguente e aggiornare le proprietà
condition
edescription
.{ "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" }
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
Usare az role assignment delete per rimuovere l'assegnazione di ruolo e la condizione aggiunti.
az role assignment delete --assignee $userObjectId --role "$roleDefinitionName" --resource-group $resourceGroup
Eliminare l'account di archiviazione creato.
Eliminare l'utente creato.