Мониторинг сетей с помощью оповещений и Функции Azure с помощью записи пакетов

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

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

Ресурсы, развернутые в Azure, выполняются непрерывно. Трудно постоянно отслеживать состояние всех ресурсов. Например, что произойдет, если проблема возникает в 2:00?

С помощью Наблюдатель за сетями оповещений и функций из экосистемы Azure можно заранее реагировать на данные и средства для решения проблем в сети.

Необходимые компоненты

Сценарий

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

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

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

Вот рабочий процесс для записи пакетов:

  1. Инцидент активирует оповещение на виртуальной машине.
  2. Оповещение вызывает функцию Azure.
  3. Функция Azure обрабатывает оповещение и запускает сеанс записи пакетов в наблюдателе за сетями.
  4. Запись пакетов выполняется на виртуальной машине и собирает данные.
  5. Файл записи пакетов передается в учетную запись хранения для проверки и диагностики.

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

Данный сценарий:

  • создает функцию Azure, которая запускает запись пакетов;
  • создает правило генерации оповещений на виртуальной машине и настраивает его для вызова функции Azure.

Создание функции Azure

Чтобы создать функцию Azure для обработки оповещения и создания записи пакетов, сначала необходимо создать приложение-функцию:

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

  2. В поле поиска в верхней части портала введите приложение-функцию. Выберите приложение-функцию из результатов поиска.

    Screenshot that shows how to search for function apps in the Azure portal.

  3. Выберите + Создать.

  4. На вкладке "Основы" создания приложения-функции введите или выберите значения для следующих параметров:

    • В разделе "Сведения о проекте" выберите подписку, для которой нужно создать приложение-функцию и группу ресурсов, чтобы содержать это приложение.
    • В разделе " Сведения об экземпляре":
      • В поле "Имя приложения-функции" введите имя приложения-функции. Это имя добавляется с помощью .azurewebsites.net.
      • Для развертывания кода или образа контейнера выберите режим публикации: код или образ контейнера.
      • Для стека среды выполнения выберите стек среды выполнения.
      • Для версии выберите версию стека среды выполнения.
      • Для региона выберите регион, в котором нужно создать приложение-функцию.
    • В разделе "Операционная система" выберите тип используемой операционной системы. Azure рекомендует тип операционной системы на основе выбранного стека среды выполнения.
    • В разделе "Размещение" выберите тип плана, который вы хотите использовать для приложения-функции. Выберите один из следующих вариантов:
      • Потребление (бессерверное): для масштабирования на основе событий для наименьшей стоимости.
      • Функции Premium: для корпоративных бессерверных приложений с масштабированием на основе событий и сетевой изоляцией.
      • Служба приложений план. Для повторного использования вычислений из существующего плана обслуживания приложение Azure.

    Screenshot of the Create Function App page in the Azure portal.

  5. Нажмите кнопку "Рецензирование" и "Создать ", чтобы создать приложение.

Теперь можно создать функцию:

  1. В созданном приложении-функции выберите "Функции" и нажмите кнопку "Создать", чтобы открыть панель "Создать".

    Screenshot of the Create function pane.

  2. Для параметра Среда разработки выберите Разработка на портале.

  3. В разделе Выберите шаблон выберите Триггер HTTP.

  4. В разделе сведений о шаблоне:

    • В поле New Function введите имя функции.
    • Для уровня авторизации выберите "Функция".
  5. Нажмите кнопку создания.

  6. Перейдите к созданной функции и выберите "Код и тест".

    Screenshot of the Code + Test page for a function.

  7. Обновите скрипт и нажмите кнопку "Сохранить".

Настройка проверки подлинности

Чтобы использовать командлеты PowerShell, необходимо настроить проверку подлинности в приложении-функции. Для этого задайте переменные среды и передайте зашифрованный файл ключа в приложение-функцию.

Примечание.

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

С помощью указанного ниже скрипта PowerShell создается файл ключа с именем PassEncryptKey.key, Он также предоставляет зашифрованную версию предоставленного пароля. Этот пароль является тем же паролем, который определен для приложения Microsoft Entra, используемого для проверки подлинности.

#Variables
$keypath = "C:\temp\PassEncryptKey.key"
$AESKey = New-Object Byte[] 32
$Password = "<insert a password here>"

#Keys
[Security.Cryptography.RNGCryptoServiceProvider]::Create().GetBytes($AESKey) 
Set-Content $keypath $AESKey

#Get encrypted password
$secPw = ConvertTo-SecureString -AsPlainText $Password -Force
$AESKey = Get-content $KeyPath
$Encryptedpassword = $secPw | ConvertFrom-SecureString -Key $AESKey
$Encryptedpassword

Извлечение значений переменных среды

Настройте следующие переменные среды, необходимые для доступа к значениям для проверки подлинности:

  • AzureClientID
  • AzureTenant
  • AzureCredPassword

Если у вас уже есть идентификатор приложения, используйте AzureClientIDAzureTenantи AzureCredPassword значения этого приложения. Если у вас его нет, перейдите к разделу "Магазин переменных среды".

AzureClientID

Идентификатор клиента — это идентификатор приложения в идентификаторе Microsoft Entra. Чтобы получить идентификатор клиента, выполните следующие действия.

  1. Если у вас еще нет приложения, выполните следующий командлет, чтобы создать приложение:

    $app = New-AzADApplication -DisplayName "ExampleAutomationAccount_MF" -HomePage "https://exampleapp.com" -IdentifierUris "https://exampleapp1.com/ExampleFunctionsAccount" -Password "<same password as defined earlier>"
    New-AzADServicePrincipal -ApplicationId $app.ApplicationId
    Start-Sleep 15]
    New-AzRoleAssignment -RoleDefinitionName Contributor -ServicePrincipalName $app.ApplicationId
    

    Примечание.

    Пароль, используемый при создании приложения, должен совпадать с паролем, созданным ранее при сохранении файла ключа.

  2. На портале Azure выберите Подписки. Выберите подписку, которую нужно использовать, а затем — пункт Управление доступом (IAM).

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

AzureTenant

Получите идентификатор клиента, выполнив следующий командлет PowerShell:

(Get-AzSubscription -SubscriptionName "<subscriptionName>").TenantId

AzureCredPassword

Значение переменной AzureCredPassword среды — это значение, полученное из следующего примера PowerShell. Этот пример совпадает с приведенным выше разделом "Настройка проверки подлинности ". Необходимое значение — это выходные данные переменной $Encryptedpassword . Это выходные данные — это пароль субъекта-службы, зашифрованный с помощью скрипта PowerShell.

#Variables
$keypath = "C:\temp\PassEncryptKey.key"
$AESKey = New-Object Byte[] 32
$Password = "<insert a password here>"

#Keys
[Security.Cryptography.RNGCryptoServiceProvider]::Create().GetBytes($AESKey) 
Set-Content $keypath $AESKey

#Get encrypted password
$secPw = ConvertTo-SecureString -AsPlainText $Password -Force
$AESKey = Get-content $KeyPath
$Encryptedpassword = $secPw | ConvertFrom-SecureString -Key $AESKey
$Encryptedpassword

Хранение переменных среды

Чтобы сохранить переменные среды, выполните следующие действия.

  1. Перейдите к приложению-функции. Выберите параметры приложения configurations>.

    Screenshot of the tab for application settings.

  2. Добавьте переменные среды и их значения к параметрам приложения и нажмите кнопку Сохранить.

Добавление PowerShell в функцию

Теперь выполните вызовы в Наблюдатель за сетями из функции Azure. Реализация этой функции будет зависеть от конкретных требований. Но в целом поток кода будет выглядеть примерно так:

  1. Обработка входных параметров.
  2. Запрос существующих записей пакетов для проверки ограничений и разрешения конфликтов имен.
  3. Создание записи пакетов с необходимыми параметрами.
  4. Периодически опрашивая запись пакетов, пока она не завершится.
  5. Уведомление пользователя о завершении сеанса записи пакетов.

В следующем примере приведен код PowerShell, который можно использовать в функции. Необходимо заменить значения для subscriptionId, resourceGroupNameи storageAccountName.

# Input bindings are passed in via parameter block 
param($Request, $TriggerMetadata) 

$essentials = $Request.body.data.essentials
$alertContext = $Request.body.data.alertContext 


# Storage account ID to save captures in 
$storageaccountid = "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Storage/storageAccounts/{storageAccountName}" 

# Packet capture variables 
$packetCaptureName = "PSAzureFunction" 
$packetCaptureLimit = 100
$packetCaptureDuration = 30 

# Credentials 
# Set the credentials in the configurations
$tenant = $env:AzureTenant 
$pw = $env:AzureCredPassword 
$clientid = $env:AzureClientId 
$password = ConvertTo-SecureString $pw -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential ($clientid, $password)

Connect-AzAccount -ServicePrincipal -Tenant $tenant -Credential $credential #-WarningAction SilentlyContinue | out-null

if ($alertContext.condition.allOf.metricNamespace -eq "Microsoft.Compute/virtualMachines") { 

    # Get the VM firing this alert 
    $vm = Get-AzVM -ResourceId $essentials.alertTargetIDs[0] 

    # Get the Network Watcher instance in the VM's region 
    $networkWatcher = Get-AzNetworkWatcher -Location $vm.Location  

    # Get existing packet captures 
    $packetCaptures = Get-AzNetworkWatcherPacketCapture -NetworkWatcher $networkWatcher 

    # Remove an existing packet capture created by the function (if it exists) 
    $packetCaptures | ForEach-Object { if ($_.Name -eq $packetCaptureName) 
        {  
            Remove-AzNetworkWatcherPacketCapture -NetworkWatcher $networkWatcher -PacketCaptureName $packetCaptureName 
        } 
    } 
  
    # Initiate packet capture on the VM that fired the alert 
    if ($packetCaptures.Count -lt $packetCaptureLimit) { 
        Write-Output "Initiating Packet Capture" 
        New-AzNetworkWatcherPacketCapture -NetworkWatcher $networkWatcher -TargetVirtualMachineId $vm.Id -PacketCaptureName $packetCaptureName -StorageAccountId $storageaccountid -TimeLimitInSeconds $packetCaptureDuration 
    } 
} 

Используйте следующий код PowerShell, если используется старая схема:

# Input bindings are passed in via parameter block 
param($Request, $TriggerMetadata)
$details = $Request.RawBody | ConvertFrom-Json


# Process alert request body 
$requestBody = $Request.Body.data

# Storage account ID to save captures in 
$storageaccountid = "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Storage/storageAccounts/{storageAccountName}" 

# Packet capture variables 
$packetCaptureName = "PSAzureFunction" 
$packetCaptureLimit = 100
$packetCaptureDuration = 30 

# Credentials 
# Set the credentials in the configurations
$tenant = $env:AzureTenant 
$pw = $env:AzureCredPassword 
$clientid = $env:AzureClientId 

$password = ConvertTo-SecureString $pw -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential ($clientid, $password)

Connect-AzAccount -ServicePrincipal -Tenant $tenant -Credential $credential #-WarningAction SilentlyContinue | out-null

if ($requestBody.context.resourceType -eq "Microsoft.Compute/virtualMachines") { 

    # Get the VM firing this alert 
    $vm = Get-AzVM -ResourceGroupName $requestBody.context.resourceGroupName -Name $requestBody.context.resourceName 

    # Get the Network Watcher instance in the VM's region 
    $networkWatcher = Get-AzNetworkWatcher -Location $vm.Location  

    # Get existing packet captures 
    packetCaptures = Get-AzNetworkWatcherPacketCapture -NetworkWatcher $networkWatcher 

    # Remove an existing packet capture created by the function (if it exists) 
    $packetCaptures | ForEach-Object { if ($_.Name -eq $packetCaptureName) 
        {  
            Remove-AzNetworkWatcherPacketCapture -NetworkWatcher $networkWatcher -PacketCaptureName $packetCaptureName 
        } 
    } 

    # Initiate packet capture on the VM that fired the alert 
    if ($packetCaptures.Count -lt $packetCaptureLimit) { 
        Write-Output "Initiating Packet Capture" 
        New-AzNetworkWatcherPacketCapture -NetworkWatcher $networkWatcher -TargetVirtualMachineId $requestBody.context.resourceId -PacketCaptureName $packetCaptureName -StorageAccountId $storageaccountid -TimeLimitInSeconds $packetCaptureDuration 
    } 
}                               

Настройка оповещения на виртуальной машине

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

Создание правила для оповещения

Перейдите к существующей виртуальной машине и добавьте правило генерации оповещений. На странице "Создание правила генерации оповещений" выполните следующие действия.

  1. На панели "Выбор сигнала" найдите имя сигнала и выберите его. В этом примере параметр Network Out Total является выбранным сигналом. Он обозначает количество байтов на всех сетевых интерфейсах виртуальной машины.

  2. На вкладке "Условия" задайте следующие значения и нажмите кнопку "Далее".

    Параметр Value
    Threshold Статические
    Тип агрегирования По средней
    Оператор Больше
    Пороговое значение 3
    Проверка каждого 1 минута
    Период обратного просмотра 5 мин
  3. На вкладке "Действия" выберите "Создать группу действий".

  4. На странице "Создание группы действий" выберите значения "Подписка", "Группа ресурсов" и "Регион". Также введите имя группы действий и отображаемое имя, а затем нажмите кнопку "Далее: уведомления".

  5. На вкладке "Уведомления" для типа действия выберите функцию Azure.

  6. На панели функций Azure выберите подписку, группу ресурсов, приложение-функцию и значения функций Azure.

    Screenshot of the page for creating an action group and the pane for details about an Azure function.

  7. В разделе "Включить общий ползунок схемы оповещений " нажмите кнопку "Нет". Затем выберите OK.

Проверьте результаты.

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

Если файл записи хранится локально, его можно получить, войдите на виртуальную машину.

Инструкции по скачиванию файлов из учетных записей хранения Azure см. в кратком руководстве по Хранилище BLOB-объектов Azure клиентской библиотеке для .NET. Вы также можете использовать средство служба хранилища Azure Обозреватель.

После скачивания записи его можно просмотреть с помощью таких средств, как Wireshark , которые могут считывать CAP-файл .

Следующий шаг

Узнайте, как просматривать записи пакетов, считывая и анализируя файлы записи пакетов Наблюдатель за сетями.