Добавление или изменение условий назначения ролей Azure с помощью Azure PowerShell

Условие назначения роли Azure — это дополнительная проверка, которую вы можете при желании добавить к назначенной роли, чтобы обеспечить более детальный контроль доступа. Например, можно добавить условие, которое требует наличия у объекта конкретного тега, чтобы объект можно было считать. В этой статье объясняется, как добавлять, изменять, просматривать и удалять условия для назначений ролей с помощью Azure PowerShell.

Необходимые компоненты

Дополнительные сведения о предварительных требованиях для добавления и изменения условий назначения ролей см. в разделе Требования к условиям.

Добавить условие

Чтобы добавить условие назначения роли, используйте команду New-AzRoleAssignment. Команда New-AzRoleAssignment поддерживает перечисленные ниже параметры условий.

Параметр Тип Описание:
Condition Строка Условие, при котором пользователю может быть предоставлено разрешение.
ConditionVersion Строка Версия синтаксиса условия. Должно быть задано значение 2.0. Если указан аргумент Condition, необходимо также задать аргумент ConditionVersion.

В следующем примере показано, как инициализировать переменные для назначения роли читателя данных BLOB-объекта хранилища с условием. Условие проверяет, равно ли имя контейнера значению "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"

Чтобы назначить роль с условием, используйте команду New-AzRoleAssignment.

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

Ниже приведен пример выхода.

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

В PowerShell, если условие содержит знак доллара ($), может потребоваться добавить перед ним обратную галочку (`). Например, в следующем условии для обозначения имени ключа тега используются знаки доллара. Дополнительные сведения о правилах для кавычек в PowerShell см. в разделе Сведения о правилах заключения в кавычки.

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

Изменение условия

Чтобы изменить существующее условие назначения роли, используйте команду Set-AzRoleAssignment. Изменять можно только свойства Condition, ConditionVersion и Description. С параметром -PassThru команда Set-AzRoleAssignment возвращает обновленное назначение роли, что позволяет отобразить или сохранить эти данные в переменной для дальнейшего использования.

Изменить условие можно двумя способами. Для этого можно воспользоваться объектом PSRoleAssignment или JSON-файлом.

Изменение условия с помощью объекта PSRoleAssignment

  1. С помощью команды Get-AzRoleAssignment получите существующее назначение роли с условием в виде объекта PSRoleAssignment.

    $testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectId
    
  2. Измените условие.

    $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. Инициализируйте условие и описание.

    $testRa.Condition = $condition
    $testRa.Description = "Read access if container name equals blobs-example-container or blobs-example-container2"
    
  4. Используйте Set-AzRoleAssignment, чтобы обновить условие для назначения роли.

    Set-AzRoleAssignment -InputObject $testRa -PassThru
    

    Ниже приведен пример выхода.

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

Изменение условия с помощью JSON-файла

Чтобы изменить условие, в качестве входных данных также можно указать JSON-файл. Ниже приведен пример JSON-файла, в котором обновляются свойства Condition и Description. Для изменении условия необходимо указать в файле JSON все свойства.

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

Используйте Set-AzRoleAssignment, чтобы обновить условие для назначения роли.

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

Ниже приведен пример выхода.

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

Изменение условий в нескольких назначениях ролей

Если необходимо выполнить одно обновление для нескольких назначений ролей, можно использовать цикл. Следующие команды выполняют следующую задачу:

  • Находит назначения ролей в подписке с <find-condition-string-1> или <find-condition-string-2> строками в условии.

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

Следующие команды выполняют следующие задачи:

  • В условии найденных назначений ролей заменится <condition-string><replace-condition-string>на .

  • Обновления назначения ролей с изменениями.

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

Если строки включают специальные символы, такие как квадратные скобки ([ ]), вам потребуется экранировать эти символы с обратной косой чертой (\).

Просмотр условия

Чтобы просмотреть условие назначения роли, используйте команду Get-AzRoleAssignment. Дополнительные сведения см. в статье о просмотре назначений ролей Azure с помощью PowerShell.

Удаление условия

Чтобы удалить условие назначения роли, измените его, задав для свойств Condition иConditionVersion пустую строку ("") или значение $null.

Кроме того, если вам нужно удалить назначение роли вместе с условием, можно использовать команду Remove-AzRoleAssignment. Дополнительные сведения см. в статье Удаление назначений ролей Azure.

Следующие шаги