Azure: автоматизация назначения Azure Policy для настройки Log Analytics скриптами Azure PowerShell



Обещанные «очень технические» видео по теме Azure на канале – пришло время поделиться некоторыми из личных скриптов и заложенных в них идеях и особенностях реализации той или иной функциональности Azure. В этом видео/посте – поговорим про реализацию автоматического назначения некоторых Azure Policy для конфигурации отправки различными объектами диагностики в Azure Log Analytics при помощи скриптов Azure PowerShell.


Azure: автоматизация назначения Azure Policy для настройки Log Analytics скриптами Azure PowerShell

Почему не с применением ARM Template? – да потому, что «заморочек» в работе с политиками через ARM Template, особенно если говорить о назначении имеющихся политик, да еще и в режиме «исправления» Remediation. Это и огромные нечитаемые «простыни» самого ARM Template вероятными ошибками при копи-пасте и «заморочками» при редактировании, и масса вопросов по описанию в том же (или отдельном) шаблоне всех необходимых учетных записей managed identity (principal) с раздачей им необходимых ролей в том же шаблоне, и процесс поиска и прописывания массы параметров вручную и прочие моменты типа «ручного участия» даже в назначении имен в том же шаблоне… Потому – скрипт, который управляет назначением выбранных политик – является куда меньшим «злом» с точки зрения процесса и более универсальным в работе, чем шаблоны, которые нужно потом очень внимательно править.

И напомню про пару  других моих детальных видео об автоматизации Azure с применением скриптов (с детальным разбором данных скриптов):

  • · Azure – подробный обзор универсального PowerShell скрипта для работы с Azure Log Analytics API – https://youtu.be/2AB-bIQl_4Q
  • · Закон Мерфи для кода или автоматическое копирование файлов между Azure Storage с Azure Logic Apps – https://youtu.be/jvWX6V92aCQ

Но вернемся к представленному Azure PowerShell скрипту, в задачу которого входит назначение политик (стандартных, встроенных в Azure) настройки мониторинга Azure Log Analytics для всех типов сервисов Azure, которые поддерживают данные настройки, на уровне выбранной подписки Azure (хотя в качестве области назначения политик может быть и ресурсная группа, и Management Group). В качестве политики используются встроенные политики Azure Policy, которые соответствуют шаблону имени ‘*diagnostic settings*Log Analytics*’, которые развертываются в режиме Remediation (effect = DeployIfNotExists) для своего типа сервисов.

Какие важные блоки в данном скрипте, на что обратить внимание при работе с назначением политик и использованием их в режиме Remediation (исправления) в коде Azure PowerShell:

  • · Простые операции получения списка нужных политик (или инициатив – набора политик) при помощи команды
    $mons = Get-AzPolicyDefinition | Where-Object { $_.Properties.DisplayName -like ‘*diagnostic settings*Log Analytics*’ }
    и работы с данным списком в цикле для каждого элемента.
  • · Проверка параметров для политики – напомню, что у политики есть свои параметры – большинство из которых – например, тот же режим работы политики – параметр Effect – является установленным по умолчанию в рекомендуемое значение, но вот для данного случая существует еще и параметр logAnalytics (которым назначается конкретное хранилище Log Analytics Workspace, куда направляются все логи) и который может иметь различные модификации имен. Потому – в скрипте проводится проверка точного имени параметра по шалону ‘logAnalytics*’ и формирование параметра на основе полученного имени.

    # get right name of policy’s parameter (typicaly named as logAnalytics or logAnalytics_1 or logAnalytics_param ) to setup required Log Analytics as destination storage
    $obj = $mon.Properties.Parameters
    $prop = Get-Member -InputObject $obj -MemberType NoteProperty -Name logAnalytics*
    # build parameter object
    if($prop)
    {
    $asparam = @{$($prop[0].Name)=$($logan.ResourceId)}
    }

  • · Формирование имени для назначения конкретной политики на основе строки описания политики, из которой по шаблонам извлекается название сервиса (описания для всех политик по управлению настройками диагностики стандартные и позволяют достаточно просто получить имя сервиса, для которого политика предназначена), для которого назначается политика, и после, используя полученное название – создается имя типа $name = “{0}-monitoring-assigned-byScript” -f $aname

    # Build the name of assignment based on substring with Azure service type in Policy’s description
    $aname = $mon.Properties.Description.Split(‘ for ‘)[1].Split(‘ to stream ‘)[0]
    $aname = $aname.Replace(‘ ‘, ”)
    # Workaround for some non-standard descriptions 🙂
    if($aname.Length -gt 32)
    {
    $aname = $mon.Properties.Description.Split(‘ for ‘)[1].Split(‘ and stream the logs to ‘)[0]
    $aname = $aname.Replace(‘ ‘, ”)
    }
    $name = “{0}-monitoring-assigned-byScript” -f $aname

  • · Назначение политики в режиме Remediation – обязательное указание параметров локации (параметр команды -Location) и привязки managed identity (-AssignIdentity) – $assignment = New-AzPolicyAssignment -Name $name -PolicyDefinition $mon -Scope $subsId -PolicyParameterObject $asparam -Location westeurope -AssignIdentity
  • · Ожидание создания учетной записи, привязанной к назначенной политики – требуется время, чтобы вновь созданная учетная запись была реплицирована внутри Azure AD и была доступна – поскольку без этого нельзя назначать требуемые роли на следующем шагу.

    # Assignment have to create Service Principal account and we need to check was account created before continue.
    # The new managed identity must complete replication through Azure Active Directory before it can be granted the needed roles.
    $prid = $assignment.Identity.PrincipalId
    $principal = Get-AzADServicePrincipal -ObjectId $prid
    while(!$principal -and $null -eq $principal)
    {
    Start-Sleep -s 10
    $principal = Get-AzADServicePrincipal -ObjectId $prid
    }

  • · Самая важная часть скрипта – при назначении политик через портал Azure выполняет операции по конфигурированию связанной учетной записи – назначение ролей – на фоне в автоматическом режиме, но когда используется PowerShell – команда New-AzPolicyAssignment только создает учетную запись, но не назначает для нее роли, которые потом требуются для выполнения политикой операций по исправлению конфигураций. Потому скрипт берет данные о ролях из описания политик (внутри каждой политики есть описание требуемых ролей (ID) для операций Remediation) и назначает роли для вновь созданных учетных записей. В случае, если речь идет не просто о политике, а об инициативе (наборе политик) – то тут скрипт просматривает еще и набор политик внутри каждой инициативы и уже из описания политики извлекает ID требуемых ролей (об этом вы найдете в конце видео, когда идет сравнение двух скриптов – для назначения политик и инициатив)

    # WARNING!!! workaround for assignment of the policy that requires remediation
    <#

When creating an assignment using the portal, Azure Policy both generates the managed identity and grants it the roles defined in roleDefinitionIds.

In the following conditions, steps to create the managed identity and assign it permissions must be done manually:

While using the SDK (such as Azure PowerShell)

When a resource outside the assignment scope is modified by the template

When a resource outside the assignment scope is read by the template

The following code iterates the policy definition in $policyDef for the roleDefinitionIds and uses New-AzRoleAssignment to grant the new managed identity the roles.

#>

# Get all policy’s definitions inside each policy in Initiative

$polDefs = $mon.policyDefinitionId

foreach( $polDef in $polDefs)

{

$policyDef = Get-AzPolicyDefinition -Id $polDef

# Use the $policyDef to get to the roleDefinitionIds array

$roleDefinitionIds = $policyDef.Properties.policyRule.then.details.roleDefinitionIds

if ($roleDefinitionIds.Count -gt 0)

{

$roleDefinitionIds | ForEach-Object {

$roleDefId = $_.Split(“/”) | Select-Object -Last 1

New-AzRoleAssignment -Scope $subsId -ObjectId $assignment.Identity.PrincipalId -RoleDefinitionId $roleDefId

}

}

}

  • · И, в заключение – назначение задачи по сканированию конфигурации существующих экземпляров сервисов на соответствие политике и исправлению (Remediation), если данное исправление требуется. Так же, как и в предыдущем случае, при назначении политики через интерфейс портала Azure – данная операция назначается в мастере назначения, а в случае использования скриптов – операция Remediation должна быть назначена отдельной командой явно. Кроме того, чтобы следить за ходом выполнения сканирования и исправления – скрипт выводит на экран текст команды с требуемым ID задачи.

    # Create a remediation for a specific assignment


$name = “Remediation_{0}-monitoring-assigned-byScript” -f $aname

$remtask = Start-AzPolicyRemediation -Name $name -PolicyAssignmentId $assignment.ResourceId -ResourceDiscoveryMode ReEvaluateCompliance

Start-Sleep -s 30

Get-AzPolicyRemediation -Id $remtask.Id

Write-Host “`r`nRemediation task $($remtask.Id) was configured!`r`n`t>>> Check state (ProvisioningState property) by >>> ‘Get-AzPolicyRemediation -Id $($remtask.Id)’ command`r`n”

Как я уже упоминал и в тексте, и в видео – при разработке собственных скриптов на базе данного примера рекомендую обратить внимание на то, как в скрипте автоматически генерируются имена для назначений – шаблоны будут отличаться, как формируется переменная с параметрами, которые используются для передачи политики (они, естественно, отличаются от политики к политике) и, конечно же, какие различия между скриптом, который назначает политики и тем, который назначает инициативы – там тоже есть свои нюансы.

Полный исходный код обоих скриптов, рассмотренных в видео – найдете в аттачменте к данном посту.


Другие доклады по облачным и серверным технологиям у меня на канале:

  • · ИТ-карьера – “ОТКРЫТОЕ СОБЕСЕДОВАНИЕ” – начинаем новый сезон 2021 – приглашаются все желающие – https://youtu.be/h0hk03xX_Z0
  • · Azure AZ-900 – онлайн семинар MUK – построение гибридной инфры с Azure Arc и Windows Admin Center – https://youtu.be/vJhuo7bc-Pg
  • · Azure AZ-900 – онлайн семинар MUK – Azure Security Center – обзор возможностей и конфигурирование – https://youtu.be/1Z3Z6XqJZsM
  • · Azure AZ-900-онлайн семинар MUK-Azure Infrastructure as Code IaC, ARM templates, BICEP, Azure DevOps – https://youtu.be/UOEmloeetfY
  • · Azure AZ-900 – онлайн семинар MUK – Microsoft Power Virtual Agents – создание эффективных чат-ботов – https://youtu.be/mez50o_m0oE
  • · Azure SALES – онлайн-семинар MUK – продажа сервисов Azure для различных сценариев кибербезопасности – https://youtu.be/YF7yKgCVLAA
  • · Azure AZ-900 – онлайн-семинар MUK – обзор Azure Automation, Monitor, Log Analytics, Logic Apps – https://youtu.be/a6VGeDUNYt4
  • · Azure SALES – онлайн-семинар MUK – что такое PaaS службы баз данных Azure SQL и Azure Data Platform – https://youtu.be/38Y-TxFFqT4
  • · Azure SALES – онлайн-семинар MUK – планирование миграции в Azure, стоимость и службы гибридой инфра – https://youtu.be/j_LqwHeLDPY
  • · Azure – онлайн-семинар MUK – планирование миграции в Azure с Azure Migrate, построение гибридой инфра – https://youtu.be/vnQOSPrunKc
  • · Закон Мерфи для кода или автоматическое копирование файлов между Azure Storage с Azure Logic Apps – https://youtu.be/jvWX6V92aCQ
  • · Azure Global AI Bootcamp (UAE) – рус.версия по Cognitive services с PowerShell, Functions, Logic Apps – https://youtu.be/7J4veWZqtpY
  • · Azure – онлайн-семинар MUK – использование сервисов Azure (Logic Apps, Functions, Cognitive) для RPA – https://youtu.be/YQiCfiivpBc
  • · Azure – онлайн-семинар MUK – основы Power Platform создание решений на Power Apps, Flows, Chatbots – https://youtu.be/DECMirInQ2I
  • · Что такое облачные технологии и подготовка к экзамену Microsoft AZ-900 Azure Fundamentals – http://bit.ly/Exam-Az-900
Реклама

Напишіть відгук

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out /  Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out /  Змінити )

З’єднання з %s