В облачном сервисе 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 (контроль доступа),
- добавить назначение роли,
- выбрать роль,
- выбрать пользователей или группы пользователей,
- сохранить изменения.

