Esercitazione: Aggiungere una condizione di assegnazione di ruolo per limitare l'accesso ai BLOB tramite Azure PowerShell
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.
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: Prerequisiti dell'installazione
Aprire una finestra di PowerShell.
Usare Get-InstalledModule per controllare le versioni dei moduli installati.
Get-InstalledModule -Name Az Get-InstalledModule -Name Az.Resources Get-InstalledModule -Name Az.Storage
Se necessario, usare Install-Module per installare le versioni necessarie per i moduli Az, Az.Resources e Az.Storage.
Install-Module -Name Az -RequiredVersion 5.5.0 Install-Module -Name Az.Resources -RequiredVersion 3.2.1 Install-Module -Name Az.Storage -RequiredVersion 2.5.2-preview -AllowPrerelease
Chiudere e riaprire PowerShell per aggiornare la sessione.
Passaggio 2: Accedere ad Azure
Usare il comando Connect-AzAccount e seguire le istruzioni visualizzate per accedere alla directory come Amministratore accesso utente o Proprietario.
Connect-AzAccount
Usare Get-AzSubscription per elencare tutte le sottoscrizioni.
Get-AzSubscription
Determinare l'ID sottoscrizione e inizializzare la variabile.
$subscriptionId = "<subscriptionId>"
Impostare la sottoscrizione come sottoscrizione attiva.
$context = Get-AzSubscription -SubscriptionId $subscriptionId Set-AzContext $context
Passaggio 3: Creare un utente
Usare New-MgUser 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 4: Configurare l'archiviazione
Usare New-AzStorageAccount 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 di indice BLOB.
Usare New-AzStorageContainer 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 Set-AzStorageBlobContent per caricare un file di testo nel contenitore.
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.
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 5: 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 PowerShell, se la condizione include un segno di dollaro ($), è necessario anteporre un prefisso ('). Ad esempio, questa condizione usa segni di dollaro per delineare il nome della chiave del tag.
Inizializzare la versione e la descrizione della condizione.
$conditionVersion = "2.0" $description = "Read access to blobs with the tag Project=Cascade"
Usare New-AzRoleAssignment per assegnare il ruolo Lettore dei dati del BLOB di archiviazione con una condizione all'utente in un ambito del gruppo di risorse.
New-AzRoleAssignment -ObjectId $userObjectId -Scope $scope -RoleDefinitionId $roleDefinitionId -Description $description -Condition $condition -ConditionVersion $conditionVersion
Ecco un esempio di output:
RoleAssignmentId : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/Microso ft.Authorization/roleAssignments/<roleAssignmentId> Scope : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup> DisplayName : Chandra SignInName : chandra@contoso.com RoleDefinitionName : Storage Blob Data Reader RoleDefinitionId : 2a2b9908-6ea1-4ae2-8e65-a410df84e7d1 ObjectId : <userObjectId> ObjectType : User CanDelegate : False Description : Read access to blobs with the tag Project=Cascade ConditionVersion : 2.0 Condition : ((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/co ntainers/blobs/tags:Project<$key_case_sensitive$>] StringEquals 'Cascade'))
Passaggio 6: (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 7: Testare la condizione
Aprire una nuova finestra di PowerShell.
Usare Connect-AzAccount per accedere come Chandra.
Connect-AzAccount
Inizializzare le variabili seguenti con i nomi usati.
$storageAccountName = "<storageAccountName>" $containerName = "<containerName>" $blobNameBaker = "<blobNameBaker>" $blobNameCascade = "<blobNameCascade>"
Usare New-AzStorageContext per creare un contesto specifico per accedere più facilmente all'account di archiviazione.
$bearerCtx = New-AzStorageContext -StorageAccountName $storageAccountName
Usare Get-AzStorageBlob per provare a leggere il file per il progetto Baker.
Get-AzStorageBlob -Container $containerName -Blob $blobNameBaker -Context $bearerCtx
Ecco un esempio di output. Si noti che non è possibile leggere il file a causa della condizione aggiunta.
Get-AzStorageBlob : This request is not authorized to perform this operation using this permission. HTTP Status Code: 403 - HTTP Error Message: This request is not authorized to perform this operation using this permission. ErrorCode: AuthorizationPermissionMismatch ErrorMessage: This request is not authorized to perform this operation using this permission. RequestId: <requestId> Time: Sat, 24 Apr 2021 13:26:25 GMT At line:1 char:1 + Get-AzStorageBlob -Container $containerName -Blob $blobNameBaker -Con ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : CloseError: (:) [Get-AzStorageBlob], StorageException + FullyQualifiedErrorId : StorageException,Microsoft.WindowsAzure.Commands.Storage.Blob.Cmdlet.GetAzureStorageBlob Command
Leggere il file per il progetto Cascade.
Get-AzStorageBlob -Container $containerName -Blob $blobNameCascade -Context $bearerCtx
Ecco un esempio di output. Si noti che è possibile leggere il file perché contiene il tag Project=Cascade.
AccountName: <storageAccountName>, ContainerName: <containerName> Name BlobType Length ContentType LastModified AccessTier SnapshotT ime ---- -------- ------ ----------- ------------ ---------- --------- CascadeFile.txt BlockBlob 7 text/plain 2021-04-24 05:35:24Z Hot
Passaggio 8: (Facoltativo) Modificare la condizione
Nell'altra finestra di PowerShell usare Get-AzRoleAssignment per ottenere l'assegnazione di ruolo aggiunta.
$testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectId
Modificare 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' OR @Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<`$key_case_sensitive`$>] StringEquals 'Baker'))"
Inizializzare la condizione e la descrizione.
$testRa.Condition = $condition $testRa.Description = "Read access to blobs with the tag Project=Cascade or Project=Baker"
Usare Set-AzRoleAssignment per aggiornare la condizione per l'assegnazione di ruolo.
Set-AzRoleAssignment -InputObject $testRa -PassThru
Ecco un esempio di output:
RoleAssignmentId : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/Microso ft.Authorization/roleAssignments/<roleAssignmentId> Scope : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup> DisplayName : Chandra SignInName : chandra@contoso.com RoleDefinitionName : Storage Blob Data Reader RoleDefinitionId : 2a2b9908-6ea1-4ae2-8e65-a410df84e7d1 ObjectId : <userObjectId> ObjectType : User CanDelegate : False Description : Read access to blobs with the tag Project=Cascade or Project=Baker ConditionVersion : 2.0 Condition : ((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/co ntainers/blobs/tags:Project<$key_case_sensitive$>] StringEquals 'Cascade' OR @Resource[Microsoft.S torage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>] StringEquals 'Baker'))
Passaggio 9: Pulire le risorse
Usare remove-AzRoleAssignment per rimuovere l'assegnazione di ruolo e la condizione aggiunti.
Remove-AzRoleAssignment -ObjectId $userObjectId -RoleDefinitionName $roleDefinitionName -ResourceGroupName $resourceGroup
Eliminare l'account di archiviazione creato.
Eliminare l'utente creato.