Incorporación o edición de condiciones de asignación de roles de Azure mediante Azure PowerShell

Una condición de asignación de roles de Azure es una comprobación adicional que puede agregar opcionalmente a la asignación de roles para proporcionar un control de acceso más preciso. Por ejemplo, puede agregar una condición que requiera que un objeto tenga una etiqueta específica para leer el objeto. En este artículo se describe cómo agregar, editar, ver o eliminar condiciones para las asignaciones de roles mediante Azure PowerShell.

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.

Agregar una condición

Para agregar una asignación de roles, use el comando New-AzRoleAssignment. El comando New-AzRoleAssignment incluye los siguientes parámetros relacionados con las condiciones.

Parámetro Tipo Description
Condition Cadena Condición bajo la que se puede conceder permiso al usuario.
ConditionVersion Cadena Versión de la sintaxis de la condición. Se debe establecer en 2.0. Si se especifica Condition, se debe especificar también ConditionVersion.

En el ejemplo siguiente se muestra cómo inicializar las variables para asignar el rol Lector de datos de Storage Blob con una condición. La condición comprueba si el nombre del contenedor es igual a "blobs-example-container".

$subscriptionId = "<subscriptionId>"
$resourceGroup = "<resourceGroup>"
$roleDefinitionName = "Storage Blob Data Reader"
$roleDefinitionId = "2a2b9908-6ea1-4ae2-8e65-a410df84e7d1"
$userObjectId = "<userObjectId>"
$scope = "/subscriptions/$subscriptionId/resourceGroups/$resourceGroup"
$description = "Read access if container name equals blobs-example-container"
$condition = "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container'))"
$conditionVersion = "2.0"

Use New-AzRoleAssignment para asignar el rol con una condición.

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

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

RoleAssignmentId   : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/Microsoft.Authorization/roleAssignments/<roleAssignmentId>
Scope              : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>
DisplayName        : User1
SignInName         : user1@contoso.com
RoleDefinitionName : Storage Blob Data Reader
RoleDefinitionId   : 2a2b9908-6ea1-4ae2-8e65-a410df84e7d1
ObjectId           : <userObjectId>
ObjectType         : User
CanDelegate        : False
Description        : Read access if container name equals blobs-example-container
ConditionVersion   : 2.0
Condition          : ((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container'))

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. Para obtener más información sobre las reglas de comillas en PowerShell, vea Acerca de las reglas de las comillas.

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

Edición de una condición

Para editar una condición de asignación de roles existente, use Set-AzRoleAssignment. Solo se pueden editar las propiedades Condition, ConditionVersion y Description. El parámetro -PassThru hace que Set-AzRoleAssignment devuelva la asignación de roles actualizada, lo que permite la visualización o el almacenamiento en una variable para su uso posterior.

Hay dos maneras de editar una condición. Puede usar el objeto PSRoleAssignment o un archivo JSON.

Edición de una condición mediante el objeto PSRoleAssignment

  1. Use Get-AzRoleAssignment para obtener la asignación de roles existente con una condición como objeto PSRoleAssignment.

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

    $condition = "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container' OR @Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container2'))"
    
  3. Inicialice la condición y la descripción.

    $testRa.Condition = $condition
    $testRa.Description = "Read access if container name equals blobs-example-container or blobs-example-container2"
    
  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/Microsoft.Authorization/roleAssignments/<roleAssignmentId>
    Scope              : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>
    DisplayName        : User1
    SignInName         : user1@contoso.com
    RoleDefinitionName : Storage Blob Data Reader
    RoleDefinitionId   : 2a2b9908-6ea1-4ae2-8e65-a410df84e7d1
    ObjectId           : <userObjectId>
    ObjectType         : User
    CanDelegate        : False
    Description        : Read access if container name equals blobs-example-container or blobs-example-container2
    ConditionVersion   : 2.0
    Condition          : ((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container' OR @Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container2'))
    

Edición de una condición mediante un archivo JSON

Para editar una condición, también puede proporcionar un archivo JSON como entrada. A continuación se muestra un archivo JSON de ejemplo donde se actualizan Condition y Description. Debe especificar todas las propiedades del archivo JSON para actualizar una condición.

{
    "RoleDefinitionId": "2a2b9908-6ea1-4ae2-8e65-a410df84e7d1",
    "ObjectId": "<userObjectId>",
    "ObjectType": "User",
    "Scope": "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>",
    "Condition": "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container' OR @Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container2'))",
    "ConditionVersion": "2.0",
    "CanDelegate": false,
    "Description": "Read access if container name equals blobs-example-container or blobs-example-container2",
    "RoleAssignmentId": "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/Microsoft.Authorization/roleAssignments/<roleAssignmentId>"
}

Use Set-AzRoleAssignment para actualizar la condición de la asignación de roles.

Set-AzRoleAssignment -InputFile "C:\path\roleassignment.json" -PassThru

Este es un ejemplo de la salida:

RoleAssignmentId   : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/Microsoft.Authorization/roleAssignments/<roleAssignmentId>
Scope              : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>
DisplayName        : User1
SignInName         : user1@contoso.com
RoleDefinitionName : Storage Blob Data Reader
RoleDefinitionId   : 2a2b9908-6ea1-4ae2-8e65-a410df84e7d1
ObjectId           : <userObjectId>
ObjectType         : User
CanDelegate        : False
Description        : Read access if container name equals blobs-example-container or blobs-example-container2
ConditionVersion   : 2.0
Condition          : ((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container' OR @Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container2'))

Editar condiciones en varias asignaciones de roles

Si necesita realizar la misma actualización a varias asignaciones de roles, puede usar un bucle. Los siguientes comandos ejecutan las siguientes tareas:

  • Busca asignaciones de roles en una suscripción con cadenas <find-condition-string-1> o <find-condition-string-2> en la condición.

    $tenantId = "<your-tenant-id>"
    $subscriptionId = "<your-subscription-id>";
    $scope = "/subscriptions/$subscriptionId"
    $findConditionString1 = "<find-condition-string-1>"
    $findConditionString2 = "<find-condition-string-2>"
    Connect-AzAccount -TenantId $tenantId -SubscriptionId $subscriptionId
    $roleAssignments = Get-AzRoleAssignment -Scope $scope
    $foundRoleAssignments = $roleAssignments | Where-Object { ($_.Condition -Match $findConditionString1) -Or ($_.Condition -Match $findConditionString2) }
    

Los siguientes comandos realizan las siguientes tareas:

  • En la condición de las asignaciones de roles encontradas, reemplaza <condition-string> por <replace-condition-string>.

  • Actualiza las asignaciones de roles con los cambios.

    $conditionString = "<condition-string>"
    $conditionStringReplacement = "<condition-string-replacement>"
    $updatedRoleAssignments = $foundRoleAssignments | ForEach-Object { $_.Condition = $_.Condition -replace $conditionString, $conditionStringReplacement; $_ }
    $updatedRoleAssignments | ForEach-Object { Set-AzRoleAssignment -InputObject $_ -PassThru }
    

Si las cadenas incluyen caracteres especiales, como corchetes ([ ]), deberá escapar estos caracteres con una barra diagonal inversa (\).

Visualización de una condición

Para ver una condición de asignación de roles, use Get-AzRoleAssignment. Para más información, consulte Enumeración de asignaciones de roles de Azure mediante Azure PowerShell.

Eliminar una condición

Para eliminar una condición de asignación de roles, edítela y establezca las propiedades Condition y ConditionVersion en una cadena vacía ("") o $null.

Como alternativa, si desea eliminar la asignación de roles y la condición, puede usar el comando Remove-AzRoleAssignment. Para obtener más información, consulte Eliminación de asignaciones de roles.

Pasos siguientes