Создание роли безопасности в Azure

Опубликовано: 30.10.2020
Автор: Виталий Бочкарев
Поддержать автора статьи по этой ссылке

В облачном сервисе 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 в списке настраиваемых ролей подписки.

Create Azure custom roles - 01

 

В этом же месте можно создать новую роль или отредактировать существующую.

Create Azure custom roles - 02
Create Azure custom roles - 03

 

В окнах редактирования роли можно увидеть все параметры, которые выше упоминались в скрипте.

Create Azure custom roles - 04
Create Azure custom roles - 05
Create Azure custom roles - 06
Create Azure custom roles - 07

 

Чтобы использовать новую роль, нужно пройти шаги, показанные на рисунке ниже:
- выбрать объект (подписку, ресурсную группу), к которому применяется правило безопасности,
- переключиться во вкладку IAM (контроль доступа),
- добавить назначение роли,
- выбрать роль,
- выбрать пользователей или группы пользователей,
- сохранить изменения.

Create Azure custom roles - 08