ELK - Elasticsearch, Logstash, Kibana
Tim: Tina Mehanović, Nikolina Leskovar
ELK (Elasticsearch, Logstash, Kibana) je skup alata za lakše pretraživanje i analizu podataka.
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.
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