Compartir a través de


Tutorial: Adición de una condición de asignación de roles para restringir el acceso a blobs mediante la CLI de Azure

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 quiera proporcionar un control de acceso más granular agregando 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

Actualmente, el control de acceso basado en atributos de Azure (Azure ABAC) está disponible con carácter general para controlar el acceso solo a Azure Blob Storage, Azure Data Lake Storage Gen2 y Azure Queues mediante los atributos request, resource, environment y principal en el nivel de rendimiento de las cuentas de almacenamiento premium y estándar. Actualmente, el atributo de solicitud de inclusión de blob de lista y el atributo de solicitud de instantánea para el espacio de nombres jerárquico están en PREVIEW. 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.

Prerrequisitos

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

Así es como se ve 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: Inicio de sesión en Azure

  1. Use el comando az login y siga las instrucciones que aparecen para iniciar sesión en el directorio como Administrador de acceso de usuario o Propietario.

    az login
    
  2. Use az account show para obtener el identificador de las suscripciones.

    az account show
    
  3. Determine el identificador de suscripción e inicialice la variable.

    subscriptionId="<subscriptionId>"
    

Paso 2: Creación de un usuario

  1. Use az ad user create para crear un usuario o buscar un usuario existente. En este tutorial se usa Chandra como ejemplo.

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

    userObjectId="<userObjectId>"
    

Paso 3: Configuración del almacenamiento

Puede autorizar el acceso a Blob Storage desde la CLI de Azure con credenciales de Microsoft Entra o mediante la clave de acceso de la cuenta de almacenamiento. En este artículo se muestra cómo autorizar las operaciones de Blob Storage mediante el identificador de Microsoft Entra. Para más información, consulte Inicio rápido: Creación, descarga y enumeración de blobs con la CLI de Azure.

  1. Use az storage account para crear una cuenta de almacenamiento que sea 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 az storage container para crear un nuevo contenedor de blobs dentro de la cuenta de almacenamiento y establecer el nivel de acceso anónimo en Privado (sin acceso anónimo).

  3. Use az storage blob upload para cargar un archivo de texto en el contenedor.

  4. Agregue la siguiente etiqueta de índice de blobs al archivo de texto. Para 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 pares de clave y valor definidos por el usuario. Aunque los metadatos son similares a las etiquetas de índice de blobs, debe usar las etiquetas de índice de blobs para las condiciones.

    Clave Importancia
    Proyecto 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 Importancia
    Proyecto Panadero
  7. Inicialice las siguientes variables con los nombres que usó.

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

Paso 4: 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 Bash, si la expansión del historial está habilitada, es posible que aparezca el mensaje bash: !: event not found debido al signo de exclamación (!). En este caso, puede deshabilitar la expansión del historial con el comando set +H. Para volver a habilitarla, utilice set -H.

    En Bash, un signo de dólar ($) tiene un significado especial para la expansión. Si la condición incluye un signo de dólar ($), es posible que tenga que prefijarlo con una barra diagonal inversa (\). Por ejemplo, esta condición usa signos de dólar para delimitar el nombre de clave de etiqueta. Para más información sobre las reglas de comillas en Bash, consulte Comillas dobles.

  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 az role assignment create para asignar el rol Lector de datos de blobs de almacenamiento con una condición al usuario en un ámbito del grupo de recursos.

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

    A continuación, presentamos un ejemplo de la salida:

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

Paso 5: (Opcional) Visualización de la condición en Azure Portal

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

  2. Seleccione Control de acceso (IAM).

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

  4. En la columna Condición , seleccione Ver o editar para ver la condición.

Captura de pantalla de agregar condición de asignación de roles en el portal de Azure.

Paso 6: Probar la condición

  1. Abra una nueva ventana de comandos.

  2. Use az login para iniciar sesión como Chandra.

    az login
    
  3. Inicialice las siguientes variables con los nombres que usó.

    storageAccountName="<storageAccountName>"
    containerName="<containerName>"
    blobNameBaker="<blobNameBaker>"
    blobNameCascade="<blobNameCascade>"
    
  4. Use az storage blob show para intentar leer las propiedades del archivo del proyecto Baker.

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

    Este es un ejemplo de la salida. Observe que no puede leer el archivo debido a la condición que agregó.

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

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

    Este es un ejemplo de la salida. Observe que puede leer las propiedades del archivo porque tiene la etiqueta 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,
    
      ...
    
    }
    

Paso 7: (Opcional) Editar la condición

  1. En la otra ventana de comandos, use az role assignment list para obtener la asignación de roles que agregó.

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

    La salida será similar a la siguiente:

    [
      {
        "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. Cree un archivo JSON con el siguiente formato y actualice las condition propiedades y 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. Use az role assignment update para actualizar las condiciones de la asignación de roles.

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

Paso 8: Limpieza de recursos

  1. Use az role assignment delete para quitar la asignación de roles y la condición que agregó.

    az role assignment delete --assignee $userObjectId --role "$roleDefinitionName" --resource-group $resourceGroup
    
  2. Elimine la cuenta de almacenamiento que creó.

  3. Elimine el usuario que creó.

Pasos siguientes