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 requestgli attributi , resourceenvironment, 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.

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: Prerequisiti dell'installazione

  1. Aprire una finestra di PowerShell.

  2. Usare Get-InstalledModule per controllare le versioni dei moduli installati.

    Get-InstalledModule -Name Az
    Get-InstalledModule -Name Az.Resources
    Get-InstalledModule -Name Az.Storage
    
  3. 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
    
  4. Chiudere e riaprire PowerShell per aggiornare la sessione.

Passaggio 2: Accedere ad Azure

  1. Usare il comando Connect-AzAccount e seguire le istruzioni visualizzate per accedere alla directory come Amministratore accesso utente o Proprietario.

    Connect-AzAccount
    
  2. Usare Get-AzSubscription per elencare tutte le sottoscrizioni.

    Get-AzSubscription
    
  3. Determinare l'ID sottoscrizione e inizializzare la variabile.

    $subscriptionId = "<subscriptionId>"
    
  4. Impostare la sottoscrizione come sottoscrizione attiva.

    $context = Get-AzSubscription -SubscriptionId $subscriptionId
    Set-AzContext $context
    

Passaggio 3: Creare un utente

  1. Usare New-MgUser 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 4: Configurare l'archiviazione

  1. 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.

  2. 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).

  3. Usare Set-AzStorageBlobContent 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.

    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
  5. Caricare un secondo file di testo nel contenitore.

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

    Chiave valore
    Project Baker
  7. 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

  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 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.

  4. Inizializzare la versione e la descrizione della condizione.

    $conditionVersion = "2.0"
    $description = "Read access to blobs with the tag Project=Cascade"
    
  5. 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

  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 nella portale di Azure.

Passaggio 7: Testare la condizione

  1. Aprire una nuova finestra di PowerShell.

  2. Usare Connect-AzAccount per accedere come Chandra.

    Connect-AzAccount
    
  3. Inizializzare le variabili seguenti con i nomi usati.

    $storageAccountName = "<storageAccountName>"
    $containerName = "<containerName>"
    $blobNameBaker = "<blobNameBaker>"
    $blobNameCascade = "<blobNameCascade>"
    
  4. Usare New-AzStorageContext per creare un contesto specifico per accedere più facilmente all'account di archiviazione.

    $bearerCtx = New-AzStorageContext -StorageAccountName $storageAccountName
    
  5. 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
    
  6. 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

  1. Nell'altra finestra di PowerShell usare Get-AzRoleAssignment per ottenere l'assegnazione di ruolo aggiunta.

    $testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectId
    
  2. 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'))"
    
  3. Inizializzare la condizione e la descrizione.

    $testRa.Condition = $condition
    $testRa.Description = "Read access to blobs with the tag Project=Cascade or Project=Baker"
    
  4. 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

  1. Usare remove-AzRoleAssignment per rimuovere l'assegnazione di ruolo e la condizione aggiunti.

    Remove-AzRoleAssignment -ObjectId $userObjectId -RoleDefinitionName $roleDefinitionName -ResourceGroupName $resourceGroup
    
  2. Eliminare l'account di archiviazione creato.

  3. Eliminare l'utente creato.

Passaggi successivi