Zarządzanie dziennikami przepływów sieciowych grup zabezpieczeń i analizowanie ich przy użyciu usługi Network Watcher i narzędzia Grafana

Uwaga

W tym artykule odwołuje się do systemu CentOS — dystrybucji systemu Linux, która zbliża się do stanu zakończenia życia (EOL). Rozważ odpowiednie użycie i planowanie. Aby uzyskać więcej informacji, zobacz wskazówki dotyczące zakończenia życia systemu CentOS.

Dzienniki przepływu sieciowej grupy zabezpieczeń zawierają informacje, których można użyć do zrozumienia ruchu przychodzącego i wychodzącego IP w interfejsach sieciowych. Te dzienniki przepływu pokazują przepływy wychodzące i przychodzące na podstawie reguły sieciowej grupy zabezpieczeń, karta sieciowa, do którego ma zastosowanie przepływ, 5 krotki dotyczące przepływu (źródłowy/docelowy adres IP, port źródłowy/docelowy, protokół) i jeśli ruch był dozwolony lub blokowany.

W sieci może być dostępnych wiele sieciowych grup zabezpieczeń z włączonym rejestrowaniem przepływu. Ta ilość danych rejestrowania sprawia, że kłopotliwe jest analizowanie i uzyskiwanie szczegółowych informacji z dzienników. Ten artykuł zawiera rozwiązanie do centralnego zarządzania tymi dziennikami przepływów sieciowej grupy zabezpieczeń przy użyciu narzędzia Grafana, narzędzia do tworzenia grafów typu open source, elasticSearch, aparatu rozproszonego wyszukiwania i analizy oraz usługi Logstash, który jest potokiem przetwarzania danych po stronie serwera typu open source.

Scenariusz

Dzienniki przepływu sieciowej grupy zabezpieczeń są włączone przy użyciu usługi Network Watcher i są przechowywane w usłudze Azure Blob Storage. Wtyczka logstash służy do łączenia i przetwarzania dzienników przepływu z magazynu obiektów blob i wysyłania ich do usługi ElasticSearch. Gdy dzienniki przepływu są przechowywane w usłudze ElasticSearch, można je analizować i wizualizować w dostosowanych pulpitach nawigacyjnych w narzędziu Grafana.

Sieciowa grupa zabezpieczeń Network Watcher Grafana

Kroki instalacji

Włączanie rejestrowania przepływu sieciowej grupy zabezpieczeń

W tym scenariuszu na koncie musi być włączone rejestrowanie przepływu sieciowej grupy zabezpieczeń w co najmniej jednej sieciowej grupie zabezpieczeń. Aby uzyskać instrukcje dotyczące włączania dzienników przepływu zabezpieczeń sieci, zapoznaj się z następującym artykułem Wprowadzenie do rejestrowania przepływu dla sieciowych grup zabezpieczeń.

Zagadnienia dotyczące konfiguracji

W tym przykładzie narzędzie Grafana, ElasticSearch i Logstash są konfigurowane na serwerze Ubuntu LTS Wdrożonym na platformie Azure. Ta minimalna konfiguracja jest używana do uruchamiania wszystkich trzech składników — wszystkie są uruchomione na tej samej maszynie wirtualnej. Ta konfiguracja powinna być używana tylko do testowania i niekrytycznych obciążeń. Usługa Logstash, Elasticsearch i Grafana mogą być zaprojektowane tak, aby można je było skalować niezależnie w wielu wystąpieniach. Aby uzyskać więcej informacji, zobacz dokumentację dla każdego z tych składników.

Instalowanie usługi Logstash

Usługa Logstash umożliwia spłaszczenie dzienników przepływu sformatowanego w formacie JSON na poziomie krotki przepływu.

Poniższe instrukcje służą do instalowania usługi Logstash w systemie Ubuntu. Aby uzyskać instrukcje dotyczące sposobu instalowania tego pakietu w systemie RHEL/CentOS, zapoznaj się z artykułem Instalowanie z repozytoriów pakietów — yum .

  1. Aby zainstalować usługę Logstash, uruchom następujące polecenia:

    curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-5.2.0.deb
    sudo dpkg -i logstash-5.2.0.deb
    
  2. Skonfiguruj usługę Logstash, aby przeanalizować dzienniki przepływu i wysłać je do usługi ElasticSearch. Utwórz plik Logstash.conf przy użyciu:

    sudo touch /etc/logstash/conf.d/logstash.conf
    
  3. Dodaj następującą zawartość do pliku. Zmień nazwę konta magazynu i klucz dostępu, aby odzwierciedlić szczegóły konta magazynu:

     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"
       }
     }
    

Podany plik konfiguracji usługi Logstash składa się z trzech części: danych wejściowych, filtru i danych wyjściowych. Sekcja danych wejściowych wyznacza źródło wejściowe dzienników, które będą przetwarzane przez usługę Logstash — w tym przypadku użyjemy wtyczki wejściowej "azureblob" (zainstalowanej w następnych krokach), która umożliwi nam dostęp do plików JSON dziennika przepływu sieciowej grupy zabezpieczeń przechowywanych w magazynie obiektów blob.

Następnie sekcja filtru spłaszcza każdy plik dziennika przepływu, tak aby każda pojedyncza krotka przepływu i skojarzone z nią właściwości stały się oddzielnym zdarzeniem usługi Logstash.

Na koniec sekcja danych wyjściowych przekazuje każde zdarzenie usługi Logstash do serwera ElasticSearch. Możesz zmodyfikować plik konfiguracji usługi Logstash zgodnie z twoimi potrzebami.

Instalowanie wtyczki wejściowej usługi Logstash dla usługi Azure Blob Storage

Ta wtyczka usługi Logstash umożliwia bezpośredni dostęp do dzienników przepływu z wyznaczonego konta magazynu obiektów blob. Aby zainstalować tę wtyczkę, uruchom polecenie z domyślnego katalogu instalacyjnego logstash (w tym przypadku /usr/share/logstash/bin):

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

Aby uzyskać więcej informacji na temat tej wtyczki, zobacz Logstash input plugin for Azure Storage Blobs (Wtyczka wejściowa usługi Logstash dla obiektów blob usługi Azure Storage).

Instalowanie programu ElasticSearch

Do zainstalowania programu ElasticSearch można użyć następującego skryptu. Aby uzyskać informacje na temat instalowania programu ElasticSearch, zobacz 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

Instalowanie narzędzia Grafana

Aby zainstalować i uruchomić aplikację Grafana, uruchom następujące polecenia:

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

Aby uzyskać dodatkowe informacje o instalacji, zobacz Instalowanie w systemie Debian/Ubuntu.

Dodawanie serwera ElasticSearch jako źródła danych

Następnie należy dodać indeks ElasticSearch zawierający dzienniki przepływu jako źródło danych. Źródło danych można dodać, wybierając pozycję Dodaj źródło danych i wypełniając formularz odpowiednimi informacjami. Przykład tej konfiguracji można znaleźć na poniższym zrzucie ekranu:

Dodaj źródło danych

Tworzenie pulpitu nawigacyjnego

Po pomyślnym skonfigurowaniu narzędzia Grafana do odczytu z indeksu ElasticSearch zawierającego dzienniki przepływu sieciowej grupy zabezpieczeń możesz tworzyć i personalizować pulpity nawigacyjne. Aby utworzyć nowy pulpit nawigacyjny, wybierz pozycję Utwórz pierwszy pulpit nawigacyjny. Poniższa przykładowa konfiguracja grafu przedstawia przepływy podzielone według reguły sieciowej grupy zabezpieczeń:

Wykres pulpitu nawigacyjnego

Poniższy zrzut ekranu przedstawia wykres i wykres przedstawiający najważniejsze przepływy i ich częstotliwość. Przepływy są również wyświetlane przez regułę sieciowej grupy zabezpieczeń i przepływy według decyzji. Aplikacja Grafana jest wysoce dostosowywalna, dlatego zaleca się tworzenie pulpitów nawigacyjnych zgodnie z konkretnymi potrzebami monitorowania. W poniższym przykładzie przedstawiono typowy pulpit nawigacyjny:

Zrzut ekranu przedstawiający przykładową konfigurację grafu z przepływami podzielone na segmenty według reguły sieciowej grupy zabezpieczeń.

Podsumowanie

Dzięki integracji usługi Network Watcher z usługami ElasticSearch i Grafana masz teraz wygodny i scentralizowany sposób zarządzania dziennikami przepływów sieciowej grupy zabezpieczeń oraz wizualizowania ich, a także innych danych. Narzędzie Grafana oferuje wiele innych zaawansowanych funkcji grafu, które mogą być również używane do dalszego zarządzania dziennikami przepływów i lepszego zrozumienia ruchu sieciowego. Teraz, gdy masz już skonfigurowane wystąpienie narzędzia Grafana i nawiązane połączenie z platformą Azure, możesz kontynuować eksplorowanie innych funkcji, które oferuje.

Następne kroki