В облачном сервисе Microsoft Azure очень много встроенных ролей безопасности, которые можно использовать для тонкой настройки прав доступа к объектам. Но бывают такие ситуации, когда необходимо создать что-специфическое, например мне потребовалось создать такую группу безопасности, которая разрешала бы чтение всех объектов в ресурсной группе, а так же давала разрешение на просмотр графиков мониторинга, остановку и запуск любой виртуальной машины в этой ресурсной группе, но в то же самое время нужно ограничить возможность редактировать настройки виртуальной машины.
Группу можно создать 2 способами:
- скриптом Powershell (справка к этому методу тут),
- через графическую оболочку Azure (справка тут).
Ниже приведен пример скрипта PowerShell, который создает роль для администраторов виртуальных машин со следующими правами:
- чтение всех объектов: */read,
- просмотр графиков мониторинга: Microsoft.OperationalInsights/workspaces/search/action,
- запуск, перезагрузка, выключение и остановка виртуальных машин: Microsoft.Compute/virtualMachines/start/action, Microsoft.Compute/virtualMachines/powerOff/action, Microsoft.Compute/virtualMachines/restart/action, Microsoft.Compute/virtualMachines/deallocate/action.
# ------------------------------------------------------------------------------------------------ # ----- Значение переменных по умолчанию ----- # Имя подписки, в которой создать роль $Subscription = "AAA-Production" $SubscriptionID = "abcdef4-1234-5678-91ab-eda6a57eabcd" # Имя шаблона, имя и описание новой роли $RoleTemlate = "Reader" $RoleName = "Virtual Machine Power Administrator" $RoleDescription = "View Virtual Machines in the portal and manage power" # ------------------------------------------------------------------------------------------------ # ----- Функции ----- # Проверка доступа к порталу Azure и подключение к нему, если он отключен Function AzureLogin($Subscription) { Switch ($Subscription) { "AGC-Production" { $SubscriptionId = "c36d9eb4-1e51-4fc9-be3d-eda6a57e1415" } Default { Write-Host "Unknown subscription" -BackgroundColor Red } } $context = Get-AzContext If (!$context -or ($context.Subscription.Id -ne $SubscriptionId)) { Write-Host "Check login window behind the script console" Connect-AzAccount -Subscription $SubscriptionId } Else { Try { Get-AzResourceGroup -ErrorAction Stop | Out-Null } Catch [System.ArgumentException] { Write-Host "Check login window behind the script console" Connect-AzAccount -Subscription $SubscriptionId } Catch { $($_.Exception.GetType().Name) Write-Host $error[0].Exception.Message } Write-Host "SubscriptionId '$Subscription' already connected" } Write-Host } # ------------------------------------------------------------------------------------------------ # ----- Основная программа ----- # Вход в портал Azure AzureLogin -Subscription $Subscription # Получение списка ролей, созданных администратором Write-Host "List of custom roles created by the administrator:" -BackgroundColor Blue $CustomRoles = Get-AzRoleDefinition | Where-Object {$_.IsCustom -eq $true} ForEach ($CurrentRole in $CustomRoles) { Write-Host $CurrentRole.Name } Write-Host # Просмотр текущих разрешений роли #Get-AzRoleDefinition $RoleName | ConvertTo-Json #(Get-AzRoleDefinition "Monitoring Reader").Actions # Получение свойств встроенной роли, чтобы взять ее за основу своей роли $role = Get-AzRoleDefinition $RoleTemlate Write-Host "The template name:" -BackgroundColor Blue Write-Host $RoleTemlate Write-Host # Сброс Id роли, чтобы не перезаписать её $role.Id = $null # Просмотр текущих разрешений роли Write-Host "The template permissions:" -BackgroundColor Blue Write-Host $role.Actions -Separator "`n" Write-Host # Сохранить разрешения из шаблона или стереть $Confirmation = $null While("yes", "y", "no", "n" -notcontains $Confirmation) { $Confirmation = (Read-Host "Do you want to keep the template permissions? [Y]es or [N]o").ToLower() } If (($Confirmation -eq "no") -or ($Confirmation -eq "n")) { $role.Actions.Clear() } Else { } # Задать новое имя группы и её описание $role.Name = $RoleName $role.Description = $RoleDescription Write-Host "The updated role name:" -BackgroundColor Blue Write-Host $RoleName Write-Host # Добавить новые разрешения для группы $role.Actions.Add("*/read") $role.Actions.Add("Microsoft.Compute/virtualMachines/start/action") $role.Actions.Add("Microsoft.Compute/virtualMachines/powerOff/action") $role.Actions.Add("Microsoft.Compute/virtualMachines/restart/action") $role.Actions.Add("Microsoft.Compute/virtualMachines/deallocate/action") $role.Actions.Add("Microsoft.OperationalInsights/workspaces/search/action") Write-Host "The updated role permissions:" -BackgroundColor Blue Write-Host $role.Actions -Separator "`n" Write-Host # Задать область действия группы - только определенная подписка $role.AssignableScopes.Clear() $role.AssignableScopes.Add("/subscriptions/" & $SubscriptionID) Write-Host "The updated role scope:" -BackgroundColor Blue Write-Host $role.AssignableScopes -Separator "`n" Write-Host # Сохранить разрешения из шаблона или стереть $Confirmation = $null While("yes", "y", "no", "n" -notcontains $Confirmation) { $Confirmation = (Read-Host "Do you want to save $RoleName? [Y]es or [N]o").ToLower() } If (($Confirmation -eq "yes") -or ($Confirmation -eq "y")) { # Создать новую группу или исправить существующую на основе созданного шаблона If ($null -eq (Get-AzRoleDefinition $RoleName)) { Write-Host Write-Host "Creating the role" -BackgroundColor Blue New-AzRoleDefinition -Role $role } Else { $role.Id = (Get-AzRoleDefinition $RoleName).Id Write-Host Write-Host "Updating the role" -BackgroundColor Blue Set-AzRoleDefinition -Role $role } } Else { Break # Stop the script execution }
В результате работы скрипта появится специальная роль Virtual Machine Power Administrator, которую можно назначить администраторам серверов.
Эту роль, созданную скриптом, можно найти в портале Azure в списке настраиваемых ролей подписки.
В этом же месте можно создать новую роль или отредактировать существующую.
В окнах редактирования роли можно увидеть все параметры, которые выше упоминались в скрипте.
Чтобы использовать новую роль, нужно пройти шаги, показанные на рисунке ниже:
- выбрать объект (подписку, ресурсную группу), к которому применяется правило безопасности,
- переключиться во вкладку IAM (контроль доступа),
- добавить назначение роли,
- выбрать роль,
- выбрать пользователей или группы пользователей,
- сохранить изменения.