Mengelola dan menganalisis log alur kelompok keamanan jaringan menggunakan Network Watcher dan Grafana

Perhatian

Artikel ini mereferensikan CentOS, distribusi Linux yang mendekati status End Of Life (EOL). Harap pertimbangkan penggunaan dan perencanaan Anda yang sesuai. Untuk informasi selengkapnya, lihat panduan Akhir Masa Pakai CentOS.

Log alur Network Security Group (NSG) menyediakan informasi yang dapat digunakan untuk memahami lalu lintas IP masuk dan keluar pada antarmuka jaringan. Log alur ini memperlihatkan alur keluar dan masuk per aturan dasar NSG, NIC yang diterapkan alur ke, informasi 5 tuple tentang alur (IP Sumber/Tujuan, Port Sumber/Tujuan, Protokol), dan apakah lalu lintas diizinkan atau ditolak.

Anda dapat mengaktifkan banyak NSG di jaringan Anda dengan mengaktifkan log alur. Jumlah data pencatatan ini membuatnya sulit untuk mengurai dan mendapatkan wawasan dari log Anda. Artikel ini menyediakan solusi untuk mengelola log alur NSG ini secara terpusat menggunakan Grafana, alat grafik sumber terbuka, ElasticSearch, mesin pencarian dan analitik terdistribusi, dan Logstash, yang merupakan alur pemrosesan data sisi server sumber terbuka.

Skenario

Log alur NSG diaktifkan menggunakan Network Watcher dan disimpan dalam penyimpanan blob Azure. Plugin Logstash digunakan untuk menghubungkan dan memproses log alur dari penyimpanan blob dan mengirimnya ke ElasticSearch. Setelah disimpan di ElasticSearch, log alur dapat dianalisis dan divisualisasikan ke dasbor yang disesuaikan di Grafana.

NSG Network Watcher Grafana

Langkah-langkah penginstalan

Aktifkan pengelogan alur Kelompok Keamanan Jaringan

Untuk skenario ini, Anda harus mengaktifkan Pencatatan Alur Network Security Group pada setidaknya satu Network Security Group di akun Anda. Untuk petunjuk pengaktifan Log Alur Keamanan Jaringan, lihat artikel berikut Pengenalan pengelogan alur untuk Kelompok Keamanan Jaringan.

Pertimbangan penyiapan

Dalam contoh ini Grafana, ElasticSearch, dan Logstash dikonfigurasi pada Ubuntu LTS Server yang disebarkan di Azure. Pengaturan minimal ini digunakan untuk menjalankan ketiga komponen - semuanya berjalan pada VM yang sama. Pengaturan ini hanya boleh digunakan untuk pengujian dan beban kerja non-kritis. Logstash, Elasticsearch, dan Grafana semuanya dapat dirancang untuk menskalakan secara independen di banyak instans. Untuk informasi selengkapnya, lihat dokumentasi masing-masing komponen ini.

Menginstal Logstash

Anda menggunakan Logstash untuk meratakan log alur berformat JSON ke tingkat tuple alur.

Instruksi berikut digunakan untuk menginstal Logstash di Ubuntu. Untuk petunjuk tentang cara menginstal paket ini di RHEL/CentOS, lihat artikel Menginstal dari Repositori Paket - yum .

  1. Untuk menginstal Logstash, jalankan langkah-langkah berikut:

    curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-5.2.0.deb
    sudo dpkg -i logstash-5.2.0.deb
    
  2. Konfigurasikan Logstash untuk mengurai log alur dan mengirimnya ke ElasticSearch. Buat file Logstash.conf menggunakan:

    sudo touch /etc/logstash/conf.d/logstash.conf
    
  3. Tambahkan konten berikut ke file. Ubah nama akun penyimpanan dan kunci akses untuk mencerminkan detail akun penyimpanan Anda:

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

File konfigurasi Logstash yang disediakan terdiri dari tiga bagian: input, filter, dan output. Bagian input menunjuk sumber input log yang akan diproses Logstash - dalam hal ini kita akan menggunakan plugin input "azureblob" (diinstal pada langkah berikutnya) yang akan memungkinkan kita untuk mengakses log alur NSG file JSON yang disimpan dalam penyimpanan blob.

Bagian filter kemudian meratakan setiap file log alur sehingga setiap tupel alur individu dan properti terkait menjadi peristiwa Logstash terpisah.

Akhirnya, bagian output meneruskan setiap peristiwa Logstash ke server ElasticSearch. Jangan ragu untuk memodifikasi file konfigurasi Logstash agar sesuai dengan kebutuhan khusus Anda.

Instal plugin input Logstash untuk penyimpanan Azure Blob

Plugin Logstash ini memungkinkan Anda untuk langsung mengakses log alur dari akun penyimpanan blob yang ditunjuk. Untuk menginstal plug in ini, dari direktori penginstalan Logstash default (dalam hal ini /usr/share/logstash/bin), lakukan langkah berikut:

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

Untuk informasi selengkapnya tentang plug in ini, lihat Plugin input Logstash untuk Azure Storage Blobs.

Instal ElasticSearch

Anda bisa menggunakan skrip berikut untuk menginstal ElasticSearch. Untuk informasi tentang menginstal ElasticSearch, lihat 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

Menginstal Grafana

Untuk menginstal dan menjalankan Grafana, jalankan perintah berikut:

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

Untuk informasi instalasi tambahan, lihat Menginstal di Debian / Ubuntu.

Tambahkan server ElasticSearch sebagai sumber data

Selanjutnya, Anda perlu menambahkan indeks ElasticSearch yang berisi log alur sebagai sumber data. Anda bisa menambahkan sumber data dengan memilih Tambahkan sumber data dan mengisi formulir dengan informasi yang relevan. Sampel konfigurasi ini dapat ditemukan di tangkapan layar berikut:

Tambahkan sumber data

Membuat dasbor

Sekarang setelah Anda berhasil mengonfigurasi Grafana untuk membaca dari indeks ElasticSearch yang berisi log aliran NSG, Anda dapat membuat dan melakukan personalisasi dasbor. Untuk membuat dasbor baru, pilih Buat dasbor pertama Anda. Contoh konfigurasi grafik berikut menunjukkan alur yang disegmentasikan oleh aturan NSG:

Grafik dasbor

Cuplikan layar berikut ini menggambarkan grafik dan bagan yang memperlihatkan alur atas dan frekuensinya. Alur juga ditunjukkan oleh aturan dan alur NSG berdasarkan keputusan. Grafana sangat dapat disesuaikan sehingga Anda disarankan membuat dasbor sesuai dengan kebutuhan pemantauan khusus Anda. Contoh berikut memperlihatkan dasbor umum:

Cuplikan layar yang memperlihatkan contoh konfigurasi grafik dengan alur yang disegmentasikan oleh aturan NSG.

Kesimpulan

Dengan mengintegrasikan Network Watcher dengan ElasticSearch dan Grafana, Anda sekarang memiliki cara yang nyaman dan terpusat untuk mengelola dan memvisualisasikan log aliran NSG serta data lainnya. Grafana memiliki sejumlah fitur grafik canggih lainnya yang juga dapat digunakan untuk mengelola log arus lebih lanjut dan lebih memahami lalu lintas jaringan Anda. Sekarang setelah Anda memiliki instans Grafana yang disiapkan dan terhubung ke Azure, jangan ragu untuk terus menjelajahi fungsionalitas lain yang ditawarkannya.

Langkah berikutnya