Поиск по сайту:

Как использовать Azure Automation - [Полное руководство]


Azure Automation является одним из самых популярных инструментов для запуска скриптов PowerShell в облаке. Вы можете не только управлять своей средой Azure с помощью runbooks, но также и своим арендатором Microsoft Office 365, например.

Автоматизация является ключевой частью ИТ, и как системный администратор, вы должны стремиться автоматизировать большинство своих ежедневных/ручных задач. Написание скрипта может занять некоторое время в начале, но в долгосрочной перспективе сэкономит вам много времени.

В этой статье я объясню, как настроить свою учетную запись Azure Automation и как создать свой первый runbook PowerShell в Azure.

Требования к автоматизации Azure

Существует всего несколько требований, чтобы начать запускать свой скрипт PowerShell в Azure:

  • Подписка на Azure (оплата по мере использования)
  • Учетная запись автоматизации Azure

Вы можете начать с бесплатной пробной версии подписки Azure, но подписка с оплатой по мере использования тоже не такая уж дорогая.

Совет

Начиная с сентября 2023 года, мы больше не можем использовать аккаунты RunAs. Убедитесь, что вы перенесли свои рабочие процессы для использования управляемых идентификаторов для аутентификации до этой даты. Прочитайте все о управляемых идентификаторах в этой статье.

Цены на автоматизацию Azure

Цены на Azure Automation основаны на количестве минут, в течение которых выполняется задание. С каждой подпиской вы получаете 500 минут времени выполнения заданий и 744 часа для наблюдателей бесплатно каждый месяц.

Бесплатные единицы в месяцЦена за дополнительные единицы
Время выполнения задания500 минут$0.002 в минуту
Наблюдатели744 часов$0.002 в час

Чтобы дать вам представление, простой скрипт, который проверяет статус MFA у всех пользователей в моем тенанте, занимает всего 1 минуту. Создание командного сайта SharePoint и применение к нему шаблона занимает в общей сложности 30 секунд.

Таким образом, с 500 бесплатными минутами вы сможете автоматизировать большинство своих ежедневных задач 😉 А каждый следующий час стоит всего $0,12.

Начало работы с Azure Automation

Чтобы начать работу с Azure Automation, нам необходимо создать учетную запись Azure Automation и установить соответствующие модули PowerShell.

  1. Войдите в портал Azure

    Перейдите на https://portal.azure.com/ и войдите, используя свои учетные данные Office 365.

  2. Перейдите к услугам учетных записей автоматизации

    Используйте строку поиска, чтобы найти услуги автоматизации аккаунтов

  3. Создайте новую учетную запись автоматизации

    Нажмите Создать, чтобы создать новую учетную запись автоматизации.
    - Дайте своей учетной записи автоматизации имя
    - Выберите вашу подписку (бесплатный пробный период или оплата по мере использования)
    - Создайте или выберите группу ресурсов

    Создание группы ресурсов может занять несколько минут.

  4. Откройте свою учетную запись Azure Automation

    Выберите свою новую учетную запись автоматизации после ее создания.

  5. Установите модули PowerShell

    Прежде чем мы сможем начать создание нашего первого руководства по выполнению, нам сначала необходимо установить необходимые модули PowerShell.

    Выберите модули и нажмите на Просмотр галереи

    Установите следующие модули:

    – PnP.PowerShell
    – AzureAD
    – ExchangeOnlineManagement

Мы теперь создали нашу учетную запись Azure Automation и можем начать с создания нашего первого Runbook.

Аутентификация в Azure Runbook при использовании MFA

Аутентификация в Azure Runbooks всегда является небольшой проблемой. Вы могли бы исключить службы Azure из MFA с помощью правил условного доступа, но это потребовало бы от вас актуализировать все IP-адреса.

Другим вариантом было бы исключить учетную запись службы из MFA, но это не является лучшей практикой. Учетные записи службы могут иметь права глобального администратора, поэтому вы хотите должным образом защитить эти учетные записи.

Так как же вы аутентифицируетесь в AzureAD или Exchange Online в Azure Runbook? Что ж, мы можем использовать учетную запись Azure Run As.

В процессе создания нашей учетной записи Azure Automation мы также автоматически создали учетную запись Run as. Учетная запись Run As обеспечивает аутентификацию для Azure Runbooks, автоматизации и управления ресурсами в Azure Resource Manager с использованием самоподписанного сертификата.

Предупреждение

Начиная с сентября 2023 года, мы больше не можем использовать аккаунты RunAs. Убедитесь, что вы перенесли свои рабочие процессы для использования управляемых идентификаторов для аутентификации до этой даты. Прочитайте все о управляемых идентификаторах в этой статье.

Заметка

Сертификат действителен только в течение одного года. Вам нужно будет убедиться, что вы продлили сертификат до его истечения.

Мы собираемся назначить учетной записи Run As правильные разрешения для доступа к AzureAD, Exchange Online и SharePoint. Для начала нам сначала нужно найти objectId учетной записи.

  1. Выберите Запуск от имени учетных записей в вашей учетной записи автоматизации Azure.
  2. Обратите внимание на идентификатор объекта сервисного принципала

Мы собираемся добавлять правильные разрешения по одному. Полный скрипт, который установит все разрешения за один раз, можно найти здесь на моем Github.

Подключение к AzureAD из Azure Runbook

Сначала мы предоставим учетной записи нашего сервисного принципала правильные разрешения для доступа к AzureAD. Убедитесь, что модуль AzureAD установлен локально и откройте PowerShell.

Сначала подключитесь к Azure AD и замените идентификатор объекта сервисного принципала вашим собственным идентификатором объекта.

Connect to Azure AD
Connect-AzureAD

Get the Service Principal based on the object Id
$servicePrincipalObjectId = "6dgw124-0000-1111-1337-abc123def456"

Если вам нужно только читать данные из AzureAD, вы можете предоставить служебному принципалу роль Читателя директории.

Add-AzureADDirectoryRoleMember -ObjectId (Get-AzureADDirectoryRole | where-object {$_.DisplayName -eq "Directory Reader"}).Objectid -RefObjectId $servicePrincipalObjectId

Другой вариант - сделать его Глобальным Администратором, чтобы он мог полностью управлять вашим Active Directory:

Add-AzureADDirectoryRoleMember -ObjectId (Get-AzureADDirectoryRole | where-object {$_.DisplayName -eq "Company Administrator"}).Objectid -RefObjectId $servicePrincipalObjectId

Вы можете перечислить все доступные роли в вашем тенанте с помощью следующей команды

Get-AzureADDirectoryRole

Теперь вы можете подключиться к AzureAD с помощью следующего кода в ваших PowerShell Runbook.

Get the service principal connection details
$spConnection = Get-AutomationConnection -Name AzureRunAsConnection

Connect AzureAd
Connect-AzureAD -TenantId $spConnection.TenantId -ApplicationId $spConnection.ApplicationID -CertificateThumbprint $spConnection.CertificateThumbprint | No-Output

Test connection:
"User count:" 
(Get-AzureADUser).count

Подключитесь к Exchange Online из Runbook Azure

Существует дополнительный шаг, необходимый для предоставления учетной записи сервисного принципала доступа к Exchange Online. Мы должны назначить ей роль администратора Exchange и соответствующие разрешения API.

Connect to Azure AD
Connect-AzureAD

Get the Service Principal based on the object Id
$servicePrincipalObjectId = "6dgw124-0000-1111-1337-abc123def456"

Assign the Exchange Administrator Role
Add-AzureADDirectoryRoleMember -ObjectId (Get-AzureADDirectoryRole | where-object {$_.DisplayName -eq "Exchange Administrator"}).Objectid -RefObjectId $servicePrincipalObjectId

Если у вас нет роли администратора обмена в вашем тенанте, то вы можете активировать её с помощью следующего кода:

if (Get-AzureADDirectoryRole | where-object {$_.DisplayName -eq "Exchange Administrator"} -eq $null) { 
	Enable-AzureADDirectoryRole -RoleTemplateId (Get-AzureADDirectoryRoleTemplate | Where-Object {$_.DisplayName -eq "Exchange Administrator"}).Objectid
}

Для разрешений API Exchange Online мы можем использовать следующий код:

Get the Office 365 Exchange Online App
$EXOApp = (Get-AzureADServicePrincipal -Filter "AppID eq '00000002-0000-0ff1-ce00-000000000000'")
$servicePrincipal = Get-AzureADServicePrincipal -ObjectId $servicePrincipalObjectId

Get the roles
$permission = $EXOApp.AppRoles | Where-Object { $_.Value -eq 'Exchange.ManageAsApp' }

Create the permission object
$apiPermission = [Microsoft.Open.AzureAD.Model.RequiredResourceAccess]@{
    ResourceAppId  = $EXOApp.AppId ;
    ResourceAccess = [Microsoft.Open.AzureAD.Model.ResourceAccess]@{
        Id   = $permission.Id ;
        Type = "Role"
    }
}
$Application = Get-AzureADApplication | Where-Object {$_.AppId -eq $servicePrincipal.AppId}
$Application | Set-AzureADApplication -ReplyUrls 'http://localhost'
$Application | Set-AzureADApplication -RequiredResourceAccess $apiPermission

Теперь все, что вам нужно сделать, это предоставить согласие администратора на разрешения, которые мы назначили.

  1. Откройте свой Azure Active Directory
  2. Выберите Регистрации приложений
  3. Нажмите на Все приложения и выберите свою учетную запись автоматизации.
  4. Перейдите к Разрешениям API
  5. Нажмите Предоставить согласие администратора

Теперь вы можете подключиться к Exchange Online в вашем Azure Runbook с помощью следующего кода PowerShell:

Get the service principal connection details
$spConnection = Get-AutomationConnection -Name AzureRunAsConnection

Set your tenant name
$tenantName = "contoso.onmicrosoft.com"

Connect to ExchangeOnline
Connect-ExchangeOnline -CertificateThumbprint $spConnection.CertificateThumbprint -AppId $spConnection.ApplicationID -Organization $tenantName

Test connection
(Get-ExoMailbox).count

Подключение к SharePoint/PnPOnline из Azure Runbook

Если вы хотите использовать PnPOnline в своем Azure Runbook, вам необходимо будет предоставить доступ к API SharePoint и, возможно, даже к Graph.

Я использую несколько разрешений для автоматического создания сайтов SharePoint и применения шаблонов с папками по умолчанию. Вам не обязательно нужны все разрешения, но это дает вам представление о том, как их настроить.

Get Office 365 SharePoint Online App
$spApp = (Get-AzureADServicePrincipal -Filter "AppID eq '00000003-0000-0ff1-ce00-000000000000'")

Get the roles
All sites full control
$spSitesControl = $SPApp.AppRoles | Where-Object { $_.Value -eq 'Sites.FullControl.All' }

User read write
$spUserControl= $SPApp.AppRoles | Where-Object { $_.Value -eq 'User.ReadWrite.All' }

TermStore
$spTermControl= $SPApp.AppRoles | Where-Object { $_.Value -eq 'TermStore.ReadWrite.All' }

NOTE: If you format the code below nicely, and copy-paste it, it will make typeID from the Id attribute :s

$spPermission = [Microsoft.Open.AzureAD.Model.RequiredResourceAccess]@{
    ResourceAppId  = $spApp.AppId ;
    ResourceAccess = [Microsoft.Open.AzureAD.Model.ResourceAccess]@{Id   = $spSitesControl.Id;Type = "Role";},
				[Microsoft.Open.AzureAD.Model.ResourceAccess]@{Id   = $spUserControl.Id;Type = "Role";},
				[Microsoft.Open.AzureAD.Model.ResourceAccess]@{Id   = $spTermControl.Id ;Type = "Role";}
}

$Application = Get-AzureADApplication | Where-Object {$_.AppId -eq $servicePrincipal.AppId}
$Application | Set-AzureADApplication -ReplyUrls 'http://localhost'
$Application | Set-AzureADApplication -RequiredResourceAccess $spPermission

Снова вам нужно будет предоставить администраторское согласие на разрешения:

  1. Откройте свой Azure Active Directory
  2. Выберите Регистрации приложений
  3. Нажмите на Все приложения и выберите свою учетную запись автоматизации.
  4. Перейдите к Разрешениям API
  5. Нажмите Предоставить согласие администратора

Чтобы подключиться к PnPOnline, вы можете использовать следующий код в вашем Azure Runbook:

Get the service principal connection details
$spConnection = Get-AutomationConnection -Name AzureRunAsConnection

Connect to PnPOnline
Connect-PnPOnline -ClientId $spConnection.ApplicationID -Url "https://contoso.sharepoint.com" -Tenant contoso.onmicrosoft.com -Thumbprint $spConnection.CertificateThumbprint

Test connection
(get-pnptenantsite).count

Мне также нужен был доступ к Graph, поэтому я добавил и разрешения API для этого:

#
Get Graph App
#
$graphApp = (Get-AzureADServicePrincipal -Filter "AppID eq '00000003-0000-0000-c000-000000000000'")

Group read write
$graphGroupControl = $graphApp.AppRoles | Where-Object { $_.Value -eq 'Group.ReadWrite.All' }

User read write
$graphUserControl = $graphApp.AppRoles | Where-Object { $_.Value -eq 'User.ReadWrite.All' }

NOTE: If you format the code below nicely, and copy-paste it, it will make typeID from the Id attribute :s
$graphPermission = [Microsoft.Open.AzureAD.Model.RequiredResourceAccess]@{
    ResourceAppId  = $graphApp.AppId ;
    ResourceAccess = [Microsoft.Open.AzureAD.Model.ResourceAccess]@{Id   = $graphGroupControl.Id;Type = "Role";},
				[Microsoft.Open.AzureAD.Model.ResourceAccess]@{Id   = $graphUserControl.Id;Type = "Role";}
}

$Application = Get-AzureADApplication | Where-Object {$_.AppId -eq $servicePrincipal.AppId}
$Application | Set-AzureADApplication -ReplyUrls 'http://localhost'
$Application | Set-AzureADApplication -RequiredResourceAccess $graphPermission

Снова предоставьте согласие администратора в Azure AD.

Если вы подключили PnPOnline, то вы можете легко получить токен доступа для подключения к Graph:

User Graph
$accessToken = Get-PnPAccessToken

$header = @{
  "Content-Type" = "application/json"
  Authorization = "Bearer $accessToken"
}

Get users to test Graph
Invoke-RestMethod -Uri "https://graph.microsoft.com/v1.0/users/" -Method Get -Headers $header

Результат со всеми разрешениями в Azure Active Directory должен выглядеть так:

Вы также можете добавить разрешения в портале Azure к вашей учетной записи сервисного принципала. Это может быть более удобно, если вы не знаете точное название разрешения, которое ищете.

В Azure Active Directory:

  1. Выберите Регистрации приложений
  2. Нажмите на Все приложения и выберите свою учетную запись автоматизации.
  3. Перейдите к разрешениям API
  4. Нажмите Добавить разрешение
  5. Выберите API, который вам нужен, например, SharePoint.
  6. Выберите Разрешения приложения и выберите необходимые вам разрешения.

Использование переменных в Runbook'ах Azure Automation

Прежде чем мы начнем создавать наш первый Runbook, мы сначала взглянем на использование переменных. Вы можете определить глобальные переменные в своем аккаунте автоматизации, которые вы можете использовать и изменять в своих Runbook. Вы можете создать различные типы переменных, и они также могут быть зашифрованы.

Если вы прокрутите вниз в своей учетной записи Azure Automation, вы найдете переменные в разделе Общие ресурсы.

  1. Откройте Переменные
  2. Нажмите на Добавить переменную
  3. Дайте вашей переменной имя
  4. Выберите тип (Строка, Булев, Дата и время, Целое число, Не указано)
  5. Введите значение
  6. Выберите Зашифрованный или нет

Создание Runbook в Azure

С учетом того, что учетная запись Azure Automation настроена и все разрешения назначены, мы можем начать создавать наш первый Runbook.

В вашей учетной записи Azure Automation вы найдете Runbooks. В вашей учетной записи уже есть несколько учебных runbook'ов, но мы собираемся создать новый.

  1. Нажмите на Создать план выполнения
  2. Дайте вашему плану действий значащее имя
  3. Выберите PowerShell для типа Runbook и, возможно, описание, которое объясняет, что делает этот runbook.
  4. Нажмите на Создать

В этом примере мы собираемся создать Руководство, которое отключает SMTP-аутентификацию для всех пользователей, кроме нескольких учетных записей приложений. Если вы хотите узнать больше о защите вашего кабинета Office 365, обязательно прочитайте эти советы.

Ваш новый Runbook открывается, который по сути является пустым скриптом PowerShell. С левой стороны вы найдете обзор доступных CMDLets, список ваших Runbooks (вы можете запускать другие runbooks из своего runbook) и ресурсы.

Активы могут быть переменными, которые вы объявили в своем аккаунте автоматизации, подключениями, сохраненными учетными данными и сертификатами.

Чтобы отключить SMTP-аутентификацию, мы собираемся подключиться к Exchange Online. Для этого нам понадобится соединение Azure Run As и имя арендатора, которое я добавил в переменную.

Теперь мы можем подключиться к Exchange Online с помощью следующего кода, если вы установили права доступа, как описано в начале:

Get the automation account and tenant name
$spConnection  = Get-AutomationConnection -Name 'AzureRunAsConnection'
$tenantName    = Get-AutomationVariable -Name 'tenantName'

Connect to ExchangeOnline
Connect-ExchangeOnline -CertificateThumbprint $spConnection.CertificateThumbprint -AppId $spConnection.ApplicationID -Organization $tenantName

$exclusions = @("sa_signatureTool",
                "sa_otherImportantTool"
                )

$mailboxes = Get-CASMailbox | Where-Object {$_.SmtpClientAuthenticationDisabled -ne $true -and $_.Identity -notin $exclusions}

$mailboxes

foreach ($mailbox in $mailboxes) {
    try {
        Set-CASMailbox -Identity $mailbox.Identity -SmtpClientAuthenticationDisabled $true

        [PSCustomObject]@{
            UserPrincipalName  = $mailbox.Identity
            SmtpClientAuthenticationDisabled = $true
        }
    }
    catch {
        [PSCustomObject]@{
            UserPrincipalName = $mailbox.Identity
            SmtpClientAuthenticationDisabled = $false
        }
    }
}

Close the connection
Disconnect-ExchangeOnline -Confirm:$false

Перед публикацией руководства вы можете сначала протестировать его в панели тестирования. Это действительно полезно при редактировании существующих руководств, вы можете протестировать ваши изменения перед публикацией, сохраняя при этом рабочую версию.

Расписание автоматизации Azure

Вы можете запланировать выполнение вашего runbook так, чтобы он автоматически запускался через установленный интервал. После публикации вашего runbook нажмите на Ссылка на расписание.

Нажмите на Связать расписание с вашим рабочим процессом, чтобы выбрать (или создать) расписание для вашего Azure Runbook. Одно расписание может использоваться для нескольких рабочих процессов в вашей учетной записи Azure Automation.

Мы должны создать наше первое расписание:

  1. Нажмите на Добавить расписание
  2. Дайте вашему расписанию имя
  3. Установите дату и время начала
  4. Сделайте это повторяющимся (или выполните только один раз)
  5. Нажмите на Создать

После того как вы создали распорядок, нажмите ОК, чтобы применить его к вашему рабочему процессу. Вы можете добавить несколько распорядков к вашему рабочему процессу, если хотите.

Ваш рабочий процесс теперь должен автоматически выполняться в соответствии с расписанием, которое вы создали. Вы увидите общий обзор задач на экране обзора рабочего процесса.

Заключение

Когда вы создаете руководства по запуску, всегда убедитесь, что закрываете соединения, когда задачи завершены. В противном случае вы можете запросто использовать все соединения с Exchange Online, например.

Надеюсь, эта статья помогла вам начать создавать ваши Runbook'и в Azure и/или настроить аутентификацию для Office 365.

Если у вас есть вопросы, просто оставьте комментарий ниже.