Adicionar ou editar as condições da atribuição de função do Azure usando o Azure PowerShell

Uma condição de atribuição de função do Azure é uma verificação adicional que você pode adicionar opcionalmente à atribuição de função para fornecer um controle de acesso mais refinado. Por exemplo, você pode adicionar uma condição que exige que um objeto tenha uma marca específica para ler o objeto. Este artigo descreve como adicionar, editar, listar ou excluir condições para as atribuições de função usando o Azure PowerShell.

Pré-requisitos

Para obter informações sobre os pré-requisitos para adicionar ou editar condições de atribuição de função, confira Pré-requisitos das condições.

Adicionar uma condição

Para adicionar uma condição de atribuição de função, use New-AzRoleAssignment. O comando New-AzRoleAssignment inclui os parâmetros a seguir relacionados às condições.

Parâmetro Tipo Descrição
Condition String Condição sob a qual o usuário pode receber permissão.
ConditionVersion String Versão da sintaxe da condição. Deve ser definido como 2.0. Se Condition for especificado, ConditionVersion também precisará ser especificado.

O exemplo a seguir mostra como inicializar as variáveis para atribuir a função Leitor de Dados do Blob do Armazenamento com uma condição. A condição verifica se o nome do contêiner é 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 atribuir a função com uma condição.

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

Veja um exemplo da saída:

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

No PowerShell, se a condição incluir um cifrão ($), você precisará prefixá-lo com um símbolo de acento grave (`). Por exemplo, a condição a seguir usa cifrões para descrever o nome da chave de marca. Para obter mais informações sobre regras para aspas no PowerShell, confira Sobre as regras de aspas.

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

Editar uma condição

Para editar uma condição de atribuição de função existente, use Set-AzRoleAssignment. Somente as propriedades Condition, ConditionVersion e Description podem ser editadas. O parâmetro -PassThru faz com que Set-AzRoleAssignment retorne a atribuição de função atualizada, o que permite a visualização ou o armazenamento em uma variável para uso posterior.

Há dois modos de editar uma condição. Você pode usar o objeto PSRoleAssignment ou um arquivo JSON.

Editar uma condição usando o objeto PSRoleAssignment

  1. Use Get-AzRoleAssignment para obter a atribuição de função existente com uma condição como um objeto PSRoleAssignment.

    $testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectId
    
  2. Edite a condição.

    $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. Inicialize a condição e a descrição.

    $testRa.Condition = $condition
    $testRa.Description = "Read access if container name equals blobs-example-container or blobs-example-container2"
    
  4. Use Set-AzRoleAssignment para atualizar a condição da atribuição de função.

    Set-AzRoleAssignment -InputObject $testRa -PassThru
    

    Veja um exemplo da saída:

    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 uma condição usando um arquivo JSON

Para editar uma condição, você também pode fornecer um arquivo JSON como entrada. Veja a seguir um exemplo de arquivo JSON em que Condition e Description são atualizados. Você precisa especificar todas as propriedades no arquivo JSON para atualizar uma condição.

{
    "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 atualizar a condição da atribuição de função.

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

Veja um exemplo da saída:

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 condições em várias atribuições de função

Se você precisar fazer a mesma atualização para várias atribuições de função, poderá usar um loop. Os comandos a seguir executam a seguinte tarefa:

  • Localiza atribuições de função em uma assinatura com cadeias de caracteres <find-condition-string-1> ou <find-condition-string-2> na condição.

    $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) }
    

Os comandos a seguir executam as seguintes tarefas:

  • Na condição das atribuições de função encontradas, substitui <condition-string> por <replace-condition-string>.

  • Atualiza as atribuições de função com as alterações.

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

Se as cadeias de caracteres incluírem caracteres especiais, como colchetes ([ ]), você precisará escapar desses caracteres com uma barra invertida (\).

Listar uma condição

Para listar uma condição de atribuição de função, use Get-AzRoleAssignment. Para obter mais informações, confira Listar as atribuições de função do Azure usando o Azure PowerShell.

Excluir uma condição

Para excluir uma condição de atribuição de função, edite-a e defina as propriedades Condition e ConditionVersion como uma cadeia de caracteres vazia ("") ou $null.

Como alternativa, se você quiser excluir a atribuição de função e a condição, use o comando Remove-AzRoleAssignment. Para saber mais, confira Remover atribuições de função do Azure.

Próximas etapas