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.
Si Chandra intenta leer un blob sin la etiqueta Project=Cascade, no se permite el acceso.
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
Abra una ventana de PowerShell.
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
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
Cierre y vuelva a abrir PowerShell para actualizar la sesión.
Paso 2: Inicio de sesión en Azure
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
Use Get-AzSubscription para enumerar todas las suscripciones.
Get-AzSubscription
Determine el identificador de la suscripción e inicialice la variable.
$subscriptionId = "<subscriptionId>"
Establezca la suscripción como suscripción activa.
$context = Get-AzSubscription -SubscriptionId $subscriptionId Set-AzContext $context
Paso 3: Creación de un usuario
Use New-MgUser para crear un usuario o buscar uno existente. En este tutorial se usa Chandra como ejemplo.
Inicialice la variable para el identificador de objeto del usuario.
$userObjectId = "<userObjectId>"
Paso 4: Configuración del almacenamiento
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.
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).
Use Set-AzStorageBlobContent para cargar un archivo de texto en el contenedor.
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 Cargue un segundo archivo de texto en el contenedor.
Agregue la siguiente etiqueta de índice de blobs al segundo archivo de texto.
Clave Value Project Baker 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
Inicialice las variables del rol Lector de datos de blobs de almacenamiento.
$roleDefinitionName = "Storage Blob Data Reader" $roleDefinitionId = "2a2b9908-6ea1-4ae2-8e65-a410df84e7d1"
Inicialice el ámbito del grupo de recursos.
$scope = "/subscriptions/$subscriptionId/resourceGroups/$resourceGroup"
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.
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"
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
En Azure Portal, abra el grupo de recursos.
Seleccione Access Control (IAM) .
En la pestaña Asignaciones de roles, busque la asignación de roles.
En la columna Condición, haga clic en Ver/Editar para ver la condición.
Paso 7: Prueba de la condición
Abra una nueva ventana de PowerShell.
Use Connect-AzAccount para iniciar sesión como Chandra.
Connect-AzAccount
Inicialice las siguientes variables con los nombres que ha usado.
$storageAccountName = "<storageAccountName>" $containerName = "<containerName>" $blobNameBaker = "<blobNameBaker>" $blobNameCascade = "<blobNameCascade>"
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
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
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
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
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'))"
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"
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
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
Elimine la cuenta de almacenamiento que ha creado.
Elimine el usuario que ha creado.