ELK - Elasticsearch, Logstash, Kibana

Izvor: SIS Wiki
Skoči na: orijentacija, traži

Tim: Tina Mehanović, Nikolina Leskovar

ELK (Elasticsearch, Logstash, Kibana) je skup alata za lakše pretraživanje i analizu podataka.

ELK [3]

Na slici je prikazana interakcija između Elasticsearch-a, Logstash-a i Kibana-e. Log datoteke za analizu nalaze se na drugom serveru te se zbog sigurnosnih razloga kopiraju na ELK poslužitelj. U našem primjeru log datoteke se nalaze na lokalnom računalu radi jednostavnijeg prikaza korištenja. Logstash osluškuje kopirane datoteke kako bi utvrdio promjenu. Kada se dogodi promjena u log datoteci, Logstash parsira i formatira podatke te ih šalje Elasticsearch-u. Elasticsearch ima ulogu pohrane parsiranih podataka. Kibana šalje upite Elasticsearch-u i prikazuje dobivene rezultate u obliku grafova.


Sadržaj

Instalacija

U nastavku će biti prikazana instalacija ELK stoga prema uputama [1]. Alati su instalirani na operacijskom sustavu Ubuntu 14.04.


Java 7

Najprije treba instalirati Java 7 jer je potrebno za korištenje Elasticsearch-a i Logstash-a. Od strane Elasticsearch-a se preporuča instalacija Oracle Java 7.

   add-apt-repository -y ppa:webupd8team/java
   apt-get update 
   apt-get -y install oracle-java7-installer

Elasticsearch

Kada instaliramo Java 7, može se instalirati Elasticsearch sa sljedećim naredbama:

   wget -O - http://packages.elasticsearch.org/GPG-KEY-elasticsearch | sudo apt-key add -
   echo 'deb http://packages.elasticsearch.org/elasticsearch/1.1/debian stable main' | sudo tee /etc/apt/sources.list.d/elasticsearch.list
   apt-get update 
   apt-get -y install elasticsearch=1.1.1

Nakon instalacije pokrenemo Elasticsearch:

   sudo service elasticsearch restart
   sudo update-rc.d elasticsearch defaults 95 10

Kibana

Kada pokrenemo Elasticsearch možemo instalirati Kibana.

   cd ~; wget https://download.elasticsearch.org/kibana/kibana/kibana-3.0.1.tar.gz
   tar xvf kibana-3.0.1.tar.gz
   vi ~/kibana-3.0.1/config.js

U konfiguracijskoj datoteci potrebno je promijeniti broj porta(9200) u 80. To je potrebno jer ćemo pristupati Kibani sa porta 80. Također, potrebno je kreirati mapu te kopirati Kibana datoteke jer ćemo koristiti Nginx kojeg ćemo u nastavku instalirati.

   elasticsearch: "http://"+window.location.hostname+":80",
   mkdir -p /var/www/kibana3
   cp -R ~/kibana-3.0.1/* /var/www/kibana3/

Nginx

Nginx je HTTP i reverse proxy server. Korisnik mora biti u mogućnosti direktno pristupiti Elasticsearch-u te je zbog toga potrebno i konfigurirati Nginx.

   apt-get install nginx
   cd ~; wget https://gist.githubusercontent.com/thisismitch/2205786838a6a5d61f55/raw/f91e06198a7c455925f6e3099e3ea7c186d0b263/nginx.conf
   vi nginx.conf

U konfiguracijskoj datoteci je potrebno izmjeniti:

   server_name 127.0.0.1;
   root /var/www/kibana3;

Nakon što pokrenemo Nxinx možemo pristupiti Kibani preko IP adrese na kojoj se nalazi Logstash server.

   cp nginx.conf /etc/nginx/sites-available/default
   service nginx restart

Logstash

Potrebno je kreirati "Logstash source list" te zatim instalirati Logstash.

   echo 'deb http://packages.elasticsearch.org/logstash/1.4/debian stable main' | sudo tee /etc/apt/sources.list.d/logstash.list
   apt-get update 
   apt-get install logstash=1.4.2-1-2c0f5a1

Generiranje SSL certifikata

Budući da ćemo koristiti Logstash Forwarder za slanje logova sa servera na naš Logstash server, potrebno je kreirati SSL certifikat i par ključeva. Logstash Forwarder koristi taj certifikat za provjeru identiteta Logstash servera. Sljedećim naredbama kreiramo direktorij u kojem će biti pohranjeni certifikat i privatni ključ te ih nakon toga generiramo:

   mkdir -p /etc/pki/tls/certs
   mkdir /etc/pki/tls/private
   cd /etc/pki/tls; sudo openssl req -x509 -batch -nodes -days 3650 -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt

Konfiguracija

   vi /etc/logstash/conf.d/01-lumberjack-input.conf

Potrebno je konfigurirati Logstash. "lumberjack" je protokol kojeg će koristiti Longstash Forwarder. Osluškivati će na tcp portu 5000 te će koristiti SSL certifikat i privatni ključ koji je prethodno kreiran.

             input {
             lumberjack {
             port => 5000
             type => "logs"
             ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
             ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
              }
              }

Zatim je potrebno kreirati konfiguracijsku datoteku u koju ćemo dodati filter za syslog poruku. Taj filter traži logove koji su označeni kao "syslog" (po Logstash Forwarder-u) te će pokušati strukturirati sve nadolazeće logove i omogućiti postavljanje upita nad istima.

   vi /etc/logstash/conf.d/10-syslog.conf
           filter {
           if [type] == "syslog" {
           grok {
           match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
           add_field => [ "received_at", "%{@timestamp}" ]
           add_field => [ "received_from", "%{host}" ]
            }
          syslog_pri { }
          date {
          match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
          }
           }
        }

Potrebno je kreirati još jednu konfiguracijsku datoteku za pohranjivanje logova u Elasticsearch. S tom će konfiguracijom Logstash prihvatiti i logove kojih nema prema filteru, ali ti podaci neće biti strukturirani.

   vi /etc/logstash/conf.d/30-lumberjack-output.conf
          output {
          elasticsearch { host => localhost }
          stdout { codec => rubydebug }
          }
   
   service logstash restart

Logstash Forwarder

Za svaki server s kojeg želimo poslati podatke na Logstash server potrebno je ponavljati iduće korake. S Logstash servera je potrebno kopirati SSL certifikat na server. Nakon toga potrebno je kreirati "Logstash Forwarder source list" na serveru koji koristi isti javni ključ kao i Elasticsearch. Nakon toga potrebno je instalirati Logstash Forwarder paket.

   cp /etc/pki/tls/certs/logstash-forwarder.crt /tmp
   echo 'deb http://packages.elasticsearch.org/logstashforwarder/debian stable main' | sudo tee /etc/apt/sources.list.d/logstashforwarder.list
   apt-get update
   apt-get install logstash-forwarder

Potrebno je instalirati "Logstash Forwarder init script" da se pokreće kod podizanja i nakon toga kopirati SSL certifikat na određenu lokaciju

   cd /etc/init.d/; sudo wget https://raw.github.com/elasticsearch/logstash-forwarder/master/logstash-forwarder.init -O logstash-forwarder
   chmod +x logstash-forwarder
   update-rc.d logstash-forwarder defaults
   mkdir -p /etc/pki/tls/certs
   cp /tmp/logstash-forwarder.crt /etc/pki/tls/certs/

Konfiguracija

Na serveru je potrebno kreirati i izmijeniti konfiguracijsku datoteku koja je JSON formata. Potrebno je izmijeniti liniju "logstash_server_private_IP" te upisati adresu servera sa kojeg se šalju logovi. U našem primjeru to je isti server na kojem se nalazi i Logstash server.

  vi /etc/logstash-forwarder
     {
      "network": {
      "servers": [ "logstash_server_private_IP:5000" ],
      "timeout": 15,
      "ssl ca": "/etc/pki/tls/certs/logstash-forwarder.crt"
      },
      "files": [
        {
      "paths": [
       "/var/log/syslog",
       "/var/log/auth.log"
      ],
     "fields": { "type": "syslog" }
      }
     ]
    } 


  service logstash-forwarder restart

Logstash

Logstash je alat koji prima log datoteke sa servera, centralizira dobivene logove, obrađuje ih i šalje Elasticsearchu na pohranu. Jedini uvjet koji zahtjeva ovaj alat je da na serveru na kojemu se izvršava bude instalirani Java runtime. Sljedećom naredbom pokreće se Logstash. U primjeru ispod unesen je tekst sadržaja "good night" te alat vraća istu tu poruku zapisanu u zadanom strukturiranom zapisu.

  bin/logstash -e 'input { stdin { } } output { stdout { codec => rubydebug } }'
  good night
  {
     "message" => "good night",
     "@timestamp" => "2014-12-18T23:48:05.335Z",
     "@version" => "1",
     "host" => "laptop"
  }

Prethodni primjer dobar je samo za testiranje alata, ali kad bi sve logove morali unositi naredbenim retkom nebi bilo praktično za korištenje. Zbog toga je potrebno instalirati Logstash Forwarder na svaki server s kojega želimo preuzimati log datoteke. U postavkama Logstash Forwardera definira se veza prema Logstash serveru i odrede se datoteke koje će se slati. Osnovna svojstva koja se definiraju u konfiguraciji Logstasha su ulazi (eng. inputs), izlazi (eng. outputs), kodeksi (eng. codecs) i filteri (eng. filters).

Ulazi
Ulazi su mehanizmi koji služe za prosljeđivanje podataka Logstashu. Najpoznatiji mehanizmi za prijenos podataka su sljedeći:
- file - čitanje iz datoteke u datotečnom sustavu,
- syslog - osluškivanje na portu 514 za syslog poruke,
- redis - čitanje sa redis poslužitelja,
- lumberjack - događaji koji su poslani lumberjack protokolom, logstash forwarder.
Izlazi
Izlazi su zadnja faza u Logstash cjevovodu. Najčešće korišteni izlazi su sljedeći:
- elasticsearch - alat koji sprema parsirane podatke,
- file - zapis podataka u datoteku na disku,
- graphite - šalje podatke o događajima graphitu, open source alat za spremanje i prikaz podataka u obliku grafova, alat je dostupan na: http://graphite.wikidot.com/.
Kodeksi
Kodeksi služe za strukturiranje zapisa. Neki od primjera su: json, msgpack...
- json - strukturiranje podataka u json formatu,
- multiline - spajanje više događaja u jedan
Filteri
Filteri se koriste za obradu podataka s ciljem obavljanja određene radnje. Često se koriste u kombinaciji s uvjetima, te se radnje obavljaju samo ako su zadovoljeni postavljeni uvjeti. Neki korisni filteri:
- grok - parsira nestrukturirane log datoteke nad kojima se onda mogu postavljati upiti,
- mutate - omogućuje "mutacije" nad poljima (preimenovanje, uklanjanje ili mijenjanje polja),
- drop - brisanje događaja,
- clone - kopira događaj, moguće je dodavati ili oduzimati polja,
- geoip - daje informacije o geografskoj lokaciji IP adrese.

Elasticsearch

Elasticsearch služi za brzo pretraživanje i spremanje podataka dobivenih iz Logstasha. Za pohranu podataka koristi JSON format. Osnovni koncepti Elasticsearcha su indeksiranje, pretraživanje i agregacija.
Indeksiranje (eng. indexing)
Indeksiranje u Elasticsearchu odnosi se na sami čin pohrane podataka. Svaki spremljeni dokument pripada nekom tipu a svaki tip pripada indexu. Elasticsearch klaster može sadržavati više indexa, indexi se sastoje od više tipova, svaki tip može imati više dokumenata te svaki dokument se može sastojati od više polja. Taj odnos se može usporediti sa relacijskim bazama podataka:

Relacijske BP ⇒ BP ⇒ Tablice ⇒ Redovi ⇒ Stupci
Elasticsearch ⇒ Indexi ⇒ Tipovi ⇒ Dokumenti ⇒ Polja .

Na primjer,index može biti naziv neke organizacije, tip zaposlenici, tipu zaposlenici pripada više dokumenata, u svakom dokumentu nalaze se podaci o pojedinom zaposleniku.

Pretraživanje (eng. search)
Nakon pohrane podataka slijedi pretraživanje. Za prikaz cjelog JSON dokumenta koristi se GET naredba nakon koje se navodi index, tip i identifikator jsona ako tražimo podatke o točno određenom dokumentu (npr.: GET /naziv_organizacije/zaposlenici/1). Ako želimo prikazati sve dokumente iz nekog tipa umjesto json identifikatora koristimo _search (GET /naziv_organizacije/zaposlenici/_search). Za složenija pretraživanja koristi se "query DSL (Domain Specific Language)". Sljedećim upitom prikazat će se podaci o zaposlenicima koji u polju ime imaju vrijednost Ana.

   GET /naziv_organizacije/zaposlenici/_search
   {
      "query" : {
         "match" : {
             "ime" : "Ana"
           }
       }
    }  
 

Agregacija (eng. aggregation)
Ova funkcionalnost Elasticsearcha omogućava generiranje analitičkih rezultata nad podacima. Sljedeći primjer prikazuje korištenje agregacije, rezultat će vratiti broj zaposlenika prema kategoriji interesa (slično kao GROUP BY u SQLu).

   GET /naziv_organizacije/zaposlenici/_search
   {
     "aggs": {
       "interesi zaposlenika": {
         "terms": { "field": "interesi" }
       }
     }
   }

Kibana

Kibana je web grafičko sučelje za Logstash i Elasticsearch. Sastoji se od redova u kojim su grafički prikazani podaci iz logova. U redove se dodaju paneli koji prikazuju prethodne filtere i upite. Filterima se odredi što želimo vidjeti na dijagramima u panelima. Jedan od filtera je i odabir vremenskog raspona za koji želimo vidjeti logove. Moguće je filtrirati prema bilo kojem polju. Upiti se sastoje od jedne ili više riječi. Na slici je prikazan primjer korištenja Kibana.

Kibana

Literatura

       [1] http://www.elasticsearch.org/
       [2] https://www.digitalocean.com/community/tutorials/how-to-use-logstash-and-kibana-to-centralize-and-visualize-logs-on-ubuntu-14-04
       [3] https://www.enalean.com/en/Elasticsearch-Logstash-Kibana-ELK-for-Tuleap-downloads
       [4] http://logstash.net/docs/1.4.2/tutorials/getting-started-with-logstash
       [5] http://packetbeat.com/docs/kibana-filtering-vs-queries.html
Osobni alati
Imenski prostori
Inačice
Radnje
Orijentacija
Traka s alatima