Share via


Tutorial: Incorporación de una condición de asignación de roles para restringir el acceso a los 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 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

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 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: Inicio de sesión en Azure

  1. Use el comando az login y siga las instrucciones que se muestran 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 la suscripción e inicialice la variable.

    subscriptionId="<subscriptionId>"
    

Paso 2: Creación de un usuario

  1. Use az ad user create 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 3: Configuración del almacenamiento

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

  1. Use az storage account 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 az storage container para crear un contenedor de blobs en la cuenta de almacenamiento y establecer el nivel de acceso anónimo en Private (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 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 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 vea 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 habilitar la expansión del historial, 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 agregarle una barra diagonal inversa (\) como prefijo. Por ejemplo, esta condición usa signos de dólar para rodear el nombre de la 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
    

    Este es 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 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 la adición de una condición de asignación de roles en Azure Portal

Paso 6: Prueba de la condición

  1. Abra una nueva ventana de comando

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

    az login
    
  3. Inicialice las siguientes variables con los nombres que ha usado.

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

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

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

    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) Edición de la condición

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

    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 formato siguiente y actualice las propiedades condition 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 la condición 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 ha agregado.

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

  3. Elimine el usuario que ha creado.

Pasos siguientes