Share via


Tutorial: Incorporación de una condición de asignación de roles para restringir el acceso a los blobs mediante Azure PowerShell

En la mayoría de los casos, una asignación de roles concede los permisos necesarios para los recursos de Azure. Sin embargo, en algunos casos es posible que desee proporcionar un control de acceso más preciso, para lo que puede agregar una condición de asignación de roles.

En este tutorial, aprenderá a:

  • Agregar una condición a una asignación de roles
  • Restringir el acceso a blobs en función de una etiqueta de índice de blobs

Importante

El control de acceso basado en atributos de Azure (Azure ABAC) está disponible con carácter general (GA) para controlar el acceso a Azure Blob Storage, Azure Data Lake Storage Gen2 y Azure Queues mediante los atributos request, resource, environment, y principal en los niveles de rendimiento de la cuenta de almacenamiento estándar y premium. Actualmente, el atributo de recurso de metadatos del contenedor y el atributo de solicitud de inclusión de blobs de lista se encuentran en VERSIÓN PRELIMINAR. Para información completa sobre el estado de las características de ABAC para Azure Storage, consulte Estado de las características de condición en Azure Storage.

Consulte Términos de uso complementarios para las versiones preliminares de Microsoft Azure para conocer los términos legales que se aplican a las características de Azure que se encuentran en la versión beta, en versión preliminar o que todavía no se han publicado para que estén disponibles con carácter general.

Requisitos previos

Para obtener información sobre los requisitos previos para agregar o editar condiciones de asignación de roles, consulte Requisitos previos de las condiciones.

Condición

En este tutorial, restringirá el acceso a blobs con una etiqueta específica. Por ejemplo, agrega una condición a una asignación de roles para que Chandra solo pueda leer archivos con la etiqueta Project=Cascade.

Diagrama de asignación de roles con una condición.

Si Chandra intenta leer un blob sin la etiqueta Project=Cascade, no se permite el acceso.

Diagrama que muestra el acceso de lectura a blobs con la etiqueta Project=Cascade.

Este es el aspecto de la condición en el código:

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

Paso 1: Requisitos previos de instalación

  1. Abra una ventana de PowerShell.

  2. Use Get-InstalledModule para comprobar las versiones de los módulos instalados.

    Get-InstalledModule -Name Az
    Get-InstalledModule -Name Az.Resources
    Get-InstalledModule -Name Az.Storage
    
  3. Si es necesario, use Install-Module para instalar las versiones necesarias para los módulos Az, Az.Resources y 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. Cierre y vuelva a abrir PowerShell para actualizar la sesión.

Paso 2: Inicio de sesión en Azure

  1. Use el comando Connect-AzAccount y siga las instrucciones que se muestran para iniciar sesión en el directorio como Administrador de acceso de usuario o Propietario.

    Connect-AzAccount
    
  2. Use Get-AzSubscription para enumerar todas las suscripciones.

    Get-AzSubscription
    
  3. Determine el identificador de la suscripción e inicialice la variable.

    $subscriptionId = "<subscriptionId>"
    
  4. Establezca la suscripción como suscripción activa.

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

Paso 3: Creación de un usuario

  1. Use New-MgUser para crear un usuario o buscar uno existente. En este tutorial se usa Chandra como ejemplo.

  2. Inicialice la variable para el identificador de objeto del usuario.

    $userObjectId = "<userObjectId>"
    

Paso 4: Configuración del almacenamiento

  1. Use New-AzStorageAccount para crear una cuenta de almacenamiento compatible con la característica de índice de blobs. Para obtener más información, consulte Administración y búsqueda de datos de Azure Blob con etiquetas de índice de blobs.

  2. Use New-AzStorageContainer para crear un nuevo contenedor de blobs dentro de la cuenta de almacenamiento y establezca el nivel de acceso anónimo en Privado (sin acceso anónimo).

  3. Use Set-AzStorageBlobContent para cargar un archivo de texto en el contenedor.

  4. Agregue la siguiente etiqueta de índice de blobs al archivo de texto. Para obtener más información, consulte Uso de etiquetas de índice de blobs para administrar y buscar datos en Azure Blob Storage.

    Nota:

    Los blobs también admiten la capacidad de almacenar metadatos arbitrarios de clave-valor definidos por el usuario. Aunque los metadatos son similares a las etiquetas de índice de blobs, debe usar etiquetas de índice de blobs con condiciones.

    Clave Value
    Project Cascade
  5. Cargue un segundo archivo de texto en el contenedor.

  6. Agregue la siguiente etiqueta de índice de blobs al segundo archivo de texto.

    Clave Value
    Project Baker
  7. Inicialice las siguientes variables con los nombres que ha usado.

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

Paso 5: Asignación de un rol con una condición

  1. Inicialice las variables del rol Lector de datos de blobs de almacenamiento.

    $roleDefinitionName = "Storage Blob Data Reader"
    $roleDefinitionId = "2a2b9908-6ea1-4ae2-8e65-a410df84e7d1"
    
  2. Inicialice el ámbito del grupo de recursos.

    $scope = "/subscriptions/$subscriptionId/resourceGroups/$resourceGroup"
    
  3. Inicialice la condición.

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

    En PowerShell, si la condición incluye un signo de dólar ($), debe agregarle un carácter de acento grave (`) como prefijo. Por ejemplo, esta condición usa signos de dólar para delinear el nombre de la clave de etiqueta.

  4. Inicialice la versión de la condición y la descripción.

    $conditionVersion = "2.0"
    $description = "Read access to blobs with the tag Project=Cascade"
    
  5. Use New-AzRoleAssignment para asignar el rol Lector de datos de blobs de almacenamiento con una condición para el usuario en un ámbito del grupo de recursos.

    New-AzRoleAssignment -ObjectId $userObjectId -Scope $scope -RoleDefinitionId $roleDefinitionId -Description $description -Condition $condition -ConditionVersion $conditionVersion
    

    Este es un ejemplo de la salida:

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

Paso 6: (Opcional) Ver la condición en Azure Portal

  1. En Azure Portal, abra el grupo de recursos.

  2. Seleccione Access Control (IAM) .

  3. En la pestaña Asignaciones de roles, busque la asignación de roles.

  4. En la columna Condición, haga clic en Ver/Editar para ver la condición.

Captura de pantalla de Adición de una condición de asignación de roles en Azure Portal.

Paso 7: Prueba de la condición

  1. Abra una nueva ventana de PowerShell.

  2. Use Connect-AzAccount para iniciar sesión como Chandra.

    Connect-AzAccount
    
  3. Inicialice las siguientes variables con los nombres que ha usado.

    $storageAccountName = "<storageAccountName>"
    $containerName = "<containerName>"
    $blobNameBaker = "<blobNameBaker>"
    $blobNameCascade = "<blobNameCascade>"
    
  4. Use New-AzStorageContext para crear un contexto específico para acceder a la cuenta de almacenamiento más fácilmente.

    $bearerCtx = New-AzStorageContext -StorageAccountName $storageAccountName
    
  5. Use Get-AzStorageBlob para intentar leer el archivo del proyecto Baker.

    Get-AzStorageBlob -Container $containerName -Blob $blobNameBaker -Context $bearerCtx 
    

    Este es un ejemplo de la salida. Tenga en cuenta que no puede leer el archivo debido a la condición que ha agregado.

    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. Lea el archivo del proyecto Cascade.

    Get-AzStorageBlob -Container $containerName -Blob $blobNameCascade -Context $bearerCtx 
    

    Este es un ejemplo de la salida. Observe que sí puede leer el archivo porque tiene la etiqueta 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
    

Paso 8: (Opcional) Edición de la condición

  1. En la otra ventana de PowerShell, use Get-AzRoleAssignment para obtener la asignación de roles que ha agregado.

    $testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectId
    
  2. Edite la condición.

    $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. Inicialice la condición y la descripción.

    $testRa.Condition = $condition
    $testRa.Description = "Read access to blobs with the tag Project=Cascade or Project=Baker"
    
  4. Use Set-AzRoleAssignment para actualizar la condición de la asignación de roles.

    Set-AzRoleAssignment -InputObject $testRa -PassThru
    

    Este es un ejemplo de la salida:

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

Paso 9: Limpieza de recursos

  1. Use Remove-AzRoleAssignment para quitar la asignación de roles y la condición que ha agregado.

    Remove-AzRoleAssignment -ObjectId $userObjectId -RoleDefinitionName $roleDefinitionName -ResourceGroupName $resourceGroup
    
  2. Elimine la cuenta de almacenamiento que ha creado.

  3. Elimine el usuario que ha creado.

Pasos siguientes