Управление и анализ журналов потоков сетевых групп безопасности с помощью Network Watcher и Grafana

Это важно

30 сентября 2027 г. журналы потоков группы безопасности сети (NSG) будут сняты с использования. В рамках этого вывода из эксплуатации вы больше не сможете создавать новые журналы потоков NSG начиная с 30 июня 2025 года. Мы рекомендуем перейти на использованиежурналов потоков виртуальной сети, которые устраняют ограничения журналов потоков NSG. После даты прекращения поддержки аналитика трафика, использующая журналы потоков NSG, больше не будет поддерживаться, а существующие ресурсы журналов потоков NSG в подписках будут удалены. Однако записи журналов потоков NSG не будут удалены и будут продолжать следовать соответствующим политикам хранения. Дополнительные сведения см. в официальном объявлении.

Журналы потоков для групп безопасности сети (NSG) содержат сведения, которые могут быть полезны для анализа входящего и исходящего IP-трафика в сетевых интерфейсах. Эти журналы потоков отображают входящие и исходящие потоки на основе правил NSG, сетевого интерфейса, к которому относится поток, 5-кортежной информации о потоке (исходный/целевой IP-адрес, исходный/целевой порт, протокол), а также сведения о том, был ли трафик разрешен или отклонен.

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

Сценарий

Журналы потоков для NSG можно включить с помощью Сетевого обозревателя и сохранять их в хранилище Blob Azure. Плагин Logstash используется для подключения и обработки журналов потоков из облачного хранилища и отправки их в Elasticsearch. После хранения журналов потоков в Elasticsearch их можно проанализировать и визуализировать на настраиваемых панелях мониторинга в Grafana.

Наблюдатель за сетями NSG в Grafana

Этапы установки

Включение ведения журнала потоков для групп безопасности сети

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

Рекомендации по настройке

В этом примере Grafana, Elasticsearch и Logstash настроены на сервере Ubuntu LTS, развернутом в Azure. Эта минимальная настройка используется для запуска всех трех компонентов— они работают на одной виртуальной машине. Такая конфигурация актуальна только для тестовых и некритических рабочих нагрузок. Можно разработать Logstash, Elasticsearch и Grafana для независимого масштабирования в нескольких экземплярах. Чтобы получить дополнительные сведения, мы рекомендуем ознакомиться с руководством для каждого из этих компонентов.

Установка Logstash

Вы используете Logstash для сглаживания логов трафика, отформатированных в JSON, до уровня кортежа потока.

Следующие инструкции используются для установки Logstash в Ubuntu. Инструкции по установке этого пакета в Red Hat Enterprise Linux см. в разделе "Установка из репозиториев пакетов " yum".

  1. Введите следующие команды, чтобы установить Logstash.

    curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-5.2.0.deb
    sudo dpkg -i logstash-5.2.0.deb
    
  2. Настройте Logstash, чтобы проанализировать журналы потоков и отправить их в Elasticsearch. Создайте файл logstash.conf следующим образом:

    sudo touch /etc/logstash/conf.d/logstash.conf
    
  3. Добавьте в файл следующее содержимое. Измените имя учетной записи хранения и ключ доступа, чтобы они соответствовали деталям вашей учетной записи хранения.

     input {
       azureblob
       {
         storage_account_name => "mystorageaccount"
         storage_access_key => "VGhpcyBpcyBhIGZha2Uga2V5Lg=="
         container => "insights-logs-networksecuritygroupflowevent"
         codec => "json"
         # Refer https://learn.microsoft.com/azure/network-watcher/network-watcher-read-nsg-flow-logs
         # Typical numbers could be 21/9 or 12/2 depends on the nsg log file types
         file_head_bytes => 12
         file_tail_bytes => 2
         # Enable / tweak these settings when event is too big for codec to handle.
         # break_json_down_policy => "with_head_tail"
         # break_json_batch_count => 2
       }
     }
     filter {
       split { field => "[records]" }
       split { field => "[records][properties][flows]"}
       split { field => "[records][properties][flows][flows]"}
       split { field => "[records][properties][flows][flows][flowTuples]"}
    
       mutate {
         split => { "[records][resourceId]" => "/"}
         add_field => { "Subscription" => "%{[records][resourceId][2]}"
           "ResourceGroup" => "%{[records][resourceId][4]}"
           "NetworkSecurityGroup" => "%{[records][resourceId][8]}"
         }
         convert => {"Subscription" => "string"}
         convert => {"ResourceGroup" => "string"}
         convert => {"NetworkSecurityGroup" => "string"}
         split => { "[records][properties][flows][flows][flowTuples]" => "," }
         add_field => {
           "unixtimestamp" => "%{[records][properties][flows][flows][flowTuples][0]}"
           "srcIp" => "%{[records][properties][flows][flows][flowTuples][1]}"
           "destIp" => "%{[records][properties][flows][flows][flowTuples][2]}"
           "srcPort" => "%{[records][properties][flows][flows][flowTuples][3]}"
           "destPort" => "%{[records][properties][flows][flows][flowTuples][4]}"
           "protocol" => "%{[records][properties][flows][flows][flowTuples][5]}"
           "trafficflow" => "%{[records][properties][flows][flows][flowTuples][6]}"
           "traffic" => "%{[records][properties][flows][flows][flowTuples][7]}"
     "flowstate" => "%{[records][properties][flows][flows][flowTuples][8]}"
     "packetsSourceToDest" => "%{[records][properties][flows][flows][flowTuples][9]}"
     "bytesSentSourceToDest" => "%{[records][properties][flows][flows][flowTuples][10]}"
     "packetsDestToSource" => "%{[records][properties][flows][flows][flowTuples][11]}"
     "bytesSentDestToSource" => "%{[records][properties][flows][flows][flowTuples][12]}"
         }
         add_field => {
           "time" => "%{[records][time]}"
           "systemId" => "%{[records][systemId]}"
           "category" => "%{[records][category]}"
           "resourceId" => "%{[records][resourceId]}"
           "operationName" => "%{[records][operationName]}"
           "Version" => "%{[records][properties][Version]}"
           "rule" => "%{[records][properties][flows][rule]}"
           "mac" => "%{[records][properties][flows][flows][mac]}"
         }
         convert => {"unixtimestamp" => "integer"}
         convert => {"srcPort" => "integer"}
         convert => {"destPort" => "integer"}
         add_field => { "message" => "%{Message}" }
       }
    
       date {
         match => ["unixtimestamp" , "UNIX"]
       }
     }
     output {
       stdout { codec => rubydebug }
       elasticsearch {
         hosts => "localhost"
         index => "nsg-flow-logs"
       }
     }
    

Предоставленный файл конфигурации Logstash состоит из трех частей: данные входа, фильтр и данные выхода. В секции входных данных описан источник, из которого Logstash получает журналы для обработки – в этом случае мы будем использовать входной плагин "azureblob" (устанавливается на следующих этапах), который позволит нам получить доступ к JSON-файлам журналов потоков NSG, хранящимся в объектном хранилище BLOB.

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

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

Установка плагина для ввода данных в Logstash из объектного хранилища Azure Blob.

Этот подключаемый модуль Logstash позволяет обращаться к журналам потоков непосредственно из настроенной для них учетной записи хранилища BLOB-объектов. Чтобы установить этот подключаемый модуль, из каталога установки Logstash по умолчанию (в этом случае — /usr/share/logstash/bin) выполните следующую команду:

sudo /usr/share/logstash/bin/logstash-plugin install logstash-input-azureblob

Более подробную информацию об этом плагине Logstash для Azure Storage Blobs см. в разделе Logstash input plugin for Azure Storage Blobs.

Установка Elasticsearch

Для установки Elasticsearch можно использовать следующий скрипт. Сведения об установке Elasticsearch см. в статье Elastic Stack.

sudo apt-get install apt-transport-https openjdk-8-jre-headless uuid-runtime pwgen -y
wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb https://packages.elastic.co/elasticsearch/5.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-5.x.list
sudo apt-get update && apt-get install elasticsearch
sudo sed -i s/#cluster.name:.*/cluster.name:\ grafana/ /etc/elasticsearch/elasticsearch.yml
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch.service
sudo systemctl start elasticsearch.service

Установка Grafana

Чтобы установить и запустить Grafana, выполните следующие команды:

wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana_4.5.1_amd64.deb
sudo apt-get install -y adduser libfontconfig
sudo dpkg -i grafana_4.5.1_amd64.deb
sudo service grafana-server start

Для получения дополнительной информации об установке см. Установка в Debian / Ubuntu.

Добавление сервера Elasticsearch в качестве источника данных

Затем необходимо добавить индекс Elasticsearch, содержащий журналы потоков в качестве источника данных. Источник данных можно добавить, выбрав параметр Добавить источник данных и заполнив соответствующую форму.

Создание панели мониторинга

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

График панели мониторинга

Заключение

Интеграция Network Watcher с Elasticsearch и Grafana теперь обеспечивает удобный и централизованный способ управления и визуализации логов потоков NSG, а также других данных. Grafana располагает рядом других мощных графических возможностей, которые можно использовать для дальнейшего управления журналами потоков, а также анализа сетевого трафика. Теперь, когда вы настроили экземпляр Grafana и подключили его к Azure, можно продолжить изучение других функций, предлагаемых Grafana.

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