Hálózati biztonsági csoport folyamatnaplóinak kezelése és elemzése a Network Watcher és a Grafana használatával

Figyelemfelhívás

Ez a cikk a CentOS-ra, egy olyan Linux-disztribúcióra hivatkozik, amely közel áll az élettartam (EOL) állapotához. Ennek megfelelően fontolja meg a használatot és a tervezést. További információ: CentOS End Of Life útmutató.

A hálózati biztonsági csoport (NSG) folyamatnaplói olyan információkat tartalmaznak, amelyek a hálózati adapterek bejövő és kimenő IP-forgalmának megértéséhez használhatók. Ezek a folyamatnaplók NSG-szabály alapján jelenítik meg a kimenő és bejövő folyamatokat, a folyamat által érintett hálózati adaptert, a folyamat 5 rekordos adatait (forrás/cél IP-címe, forrás-/célport, protokoll), valamint azt, hogy a forgalom engedélyezve vagy megtagadva volt-e.

A hálózat számos NSG-jével rendelkezhet, amelyeken engedélyezve van a folyamatnaplózás. Ez a naplózási adatmennyiség nehézkessé teszi a naplók elemzését és elemzését. Ez a cikk megoldást nyújt ezeknek az NSG-folyamatnaplóknak a központi kezelésére a Grafana, egy nyílt forráskód gráfkészítő eszköz, az ElasticSearch, az elosztott keresési és elemzési motor és a Logstash használatával, amely egy nyílt forráskód kiszolgálóoldali adatfeldolgozási folyamat.

Eset

Az NSG-folyamatnaplók engedélyezve vannak a Network Watcher használatával, és az Azure Blob Storage-ban vannak tárolva. A Logstash beépülő modul a folyamatnaplók blobtárolóból való csatlakoztatására és feldolgozására szolgál, és elküldi őket az ElasticSearchnek. Miután a folyamatnaplókat az ElasticSearch tárolja, elemezhetők és megjeleníthetők a Grafana testreszabott irányítópultjaiban.

NSG Network Watcher Grafana

A telepítés lépései

Hálózati biztonsági csoport folyamatnaplózásának engedélyezése

Ebben a forgatókönyvben engedélyeznie kell a hálózati biztonsági csoport folyamatnaplózását a fiók legalább egy hálózati biztonsági csoportján. A hálózati biztonsági naplók engedélyezésével kapcsolatos utasításokért tekintse meg a következő cikket a hálózati biztonsági csoportok folyamatnaplózásának bemutatása című cikkben.

Beállítási szempontok

Ebben a példában a Grafana, az ElasticSearch és a Logstash egy Azure-ban üzembe helyezett Ubuntu LTS-kiszolgálón van konfigurálva. Ez a minimális beállítás mind a három összetevő futtatásához használható – mind ugyanazon a virtuális gépen futnak. Ez a beállítás csak teszteléshez és nem kritikus számítási feladatokhoz használható. A Logstash, az Elasticsearch és a Grafana különböző példányok egymástól függetlenül méretezhetők. További információkért tekintse meg az egyes összetevők dokumentációját.

A Logstash telepítése

A Logstash használatával simíthatja a JSON formátumú folyamatnaplókat egy folyamatszintre.

A Logstash Ubuntu-ban való telepítéséhez az alábbi utasítások szolgálnak. A csomag RHEL/CentOS rendszerben való telepítésével kapcsolatos utasításokért tekintse meg a Csomagtárházakból való telepítést ismertető cikket – yum cikket.

  1. A Logstash telepítéséhez futtassa a következő parancsokat:

    curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-5.2.0.deb
    sudo dpkg -i logstash-5.2.0.deb
    
  2. Konfigurálja a Logstash-t a folyamatnaplók elemzéséhez és az ElasticSearchnek való elküldéséhez. Hozzon létre egy Logstash.conf fájlt a következő használatával:

    sudo touch /etc/logstash/conf.d/logstash.conf
    
  3. Adja hozzá a következő tartalmat a fájlhoz. Módosítsa a tárfiók nevét és hozzáférési kulcsát a tárfiók adatainak megfelelően:

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

A megadott Logstash konfigurációs fájl három részből áll: a bemenetből, a szűrőből és a kimenetből. A bemeneti szakasz kijelöli a Logstash által feldolgozandó naplók bemeneti forrását – ebben az esetben egy "azureblob" bemeneti beépülő modult fogunk használni (a következő lépésekben telepítve), amely lehetővé teszi számunkra a blobtárolóban tárolt NSG-folyamatnapló JSON-fájljainak elérését.

A szűrőszakasz ezután simítja az egyes folyamatnapló-fájlokat, hogy az egyes folyamatok és a hozzá tartozó tulajdonságok külön Logstash-eseménysé alakulnak.

Végül a kimeneti szakasz minden Logstash-eseményt továbbít az ElasticSearch-kiszolgálónak. Nyugodtan módosíthatja a Logstash konfigurációs fájlját az igényeinek megfelelően.

Az Azure Blob Storage Logstash bemeneti beépülő moduljának telepítése

Ez a Logstash beépülő modul lehetővé teszi a folyamatnaplók közvetlen elérését a kijelölt Blob Storage-fiókból. A beépülő modul telepítéséhez az alapértelmezett Logstash telepítési könyvtárból (ebben az esetben a /usr/share/logstash/bin) futtassa a következő parancsot:

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

Erről a beépülő modulról további információt az Azure Storage-blobokhoz készült Logstash bemeneti beépülő modulban talál.

Az ElasticSearch telepítése

Az ElasticSearch telepítéséhez az alábbi szkriptet használhatja. Az ElasticSearch telepítésével kapcsolatos információkért lásd: 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

A Grafana telepítése

A Grafana telepítéséhez és futtatásához futtassa a következő parancsokat:

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

További telepítési információkért lásd a Debian/Ubuntu telepítése című témakört.

Az ElasticSearch-kiszolgáló hozzáadása adatforrásként

Ezután hozzá kell adnia a folyamatnaplókat tartalmazó ElasticSearch-indexet adatforrásként. Adatforrás hozzáadásához válassza az Adatforrás hozzáadása lehetőséget, és töltse ki az űrlapot a megfelelő információkkal. A konfiguráció mintája az alábbi képernyőképen található:

Adatforrás hozzáadása

Irányítópult létrehozása

Most, hogy sikeresen konfigurálta a Grafana-t az NSG-folyamatnaplókat tartalmazó ElasticSearch-indexből való olvasásra, irányítópultokat hozhat létre és személyre szabhat. Új irányítópult létrehozásához válassza az Első irányítópult létrehozása lehetőséget. Az alábbi mintadiagram-konfiguráció az NSG-szabály szerint szegmentált folyamatokat mutatja be:

Irányítópult-diagram

Az alábbi képernyőkép egy grafikont és diagramot ábrázol, amely a felső folyamatokat és azok gyakoriságát mutatja. A folyamatokat az NSG-szabály és a folyamatok is megjelenítik döntés alapján. A Grafana nagymértékben testre szabható, ezért javasoljuk, hogy az adott monitorozási igényeknek megfelelően hozzon létre irányítópultokat. Az alábbi példa egy tipikus irányítópultot mutat be:

Képernyőkép az NSG-szabály által szegmentált folyamatok mintagráf-konfigurációjáról.

Összegzés

A Network Watcher és az ElasticSearch és a Grafana integrálásával mostantól kényelmes és központosított módon kezelheti és vizualizálhatja az NSG-folyamatnaplókat és más adatokat. A Grafana számos egyéb hatékony gráfkezelési funkcióval rendelkezik, amelyek a folyamatnaplók további kezelésére és a hálózati forgalom jobb megértésére is használhatók. Most, hogy beállított egy Grafana-példányt, és csatlakozott az Azure-hoz, nyugodtan folytassa a további funkciók megismerését.

Következő lépések