Központi loggyűjtő Logstash, Elasticsearch, Kibana 4

Központi loggyűjtő Syslog-ng, Logstash, Elasticsearch, Kibana 4 segítségével


A jelenlegi leírás a telepítést csak felületesen érinti, a példában Debian 7 64bit Linuxot használtam. A leírás célja, hogy gondolatébresztő legyen egy központi loggyűjtő kiválasztása során.

Amire jó ez a rendszer:

  • Különböző forrásból érkező események feldolgozására, tárolására és megjelenítésére.
  • Különösebb ismeretek és a parancssor ismerete nélküli logelemzésre

Amire nem jó:

  • Logok feldolgozása után riasztások kezelésére.
  • Elkülönített logok és hozzájuk kapocslódó jogosultságok kezelésére
A rendszer fő részei

Syslog-ng


Syslog-ng fogadja a logokat UDP és TCP 514-es porton, itt sok lehetőség van a logok módosítására, feldolgozásáre, stb. Ennek a leírásnak ez nem képezi tárgyát.

Telepítés


apt-get install syslog-ng

Konfiguráció


Az alábbi konfigurációval a sztenderd syslog-ng konfigurációt a jelenlegi példához szükséges beállításokkal kiegészíthetjük:

cat /etc/syslog-ng/conf.d/01-logstash.conf
source s_network {
        tcp();
        udp();
};
destination d_logstash {
    udp("127.0.0.1" port(10000) localport(999));
};
log {
    source(s_network);
    destination(d_logstash);
};



Logstash



A Logstash egy nagyon sokoldalú adatfolyam feldolgozó alaklmazás. Sokoldalúságát annak köszönheti, hogy sokféle formátumú adatot tud fogadni, feldolgozni és küldeni. Sok protokollon kommunikál, így könnyen illeszthető más alkalmazásokhoz.

Telepítés


A Logstash telepítése nagyon egyszerű, csak néhány lépésből áll (http://logstash.net/docs/1.4.2/repositories):

wget -O - http://packages.elasticsearch.org/GPG-KEY-elasticsearch | apt-key add -
echo " deb http://packages.elasticsearch.org/logstash/1.4/debian stable main" > /etc/apt/sources.list.d/logstash.list
apt-get update
apt-get install logstash



Konfiguráció


Jelen példában az UDP 10000-es porton hallgat, a syslog üzenetet, nginx logokat a szabályok alapján átalakítja, majd a meghatározott  módon az Elasticsearch-nek átadja.

Logok fogadása

input {
  udp {
    port => 10000
    type => syslog
  }
}


A Logstash konfigjában (/etc/logstash/conf.d/logstash.conf) először a sztenderd syslog szerint bontjuk fel a kapott logsorokat:

filter {
  grok {
      type => "syslog"
      pattern => [ "<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:[%{POSINT:syslog_pid}])?: %{GREEDYDATA:syslog_message}" ]
      add_field => [ "received_at", "%{@timestamp}" ]
      add_field => [ "received_from", "%{@source_host}" ]
    add_tag => ["Syslog"]
  }
  syslog_pri { }
  date {
    type => "syslog"
    match => [ "syslog_timestamp", "MMM  d HH:mm:ss.SSS","MMM  d HH:mm:ss", "MMM dd HH:mm:ss.SSS","MMM dd HH:mm:ss","dd/MMM/yyyy:HH:mm:ss +0100","yyyy/MM/dd HH:mm:ss" ]
  }
  mutate {
      type => "syslog"
      exclude_tags => "_grokparsefailure"
      replace => [ "@source_host", "%{syslog_hostname}" ]
      replace => [ "@message", "%{syslog_message}" ]
  }
  mutate {
      type => "syslog"
      remove => [ "syslog_hostname", "syslog_message", "syslog_timestamp" , "received_from"]
  }



Ezt követően az igy kapott facility és priority szerint tudjuk tovább bontani a logokat. Ezért fontos, hogy a bejegyzések forrásánál megfelelően be
legyen állítva a facility és priority.
Az NginX accesslog, errorlog feldolgozására szolgáló pattern így néz ki:

  if [syslog_facility] == "local1" or [syslog_facility] == "user-level" {
    grok{
        type => "syslog"
        # Nginx log:
        pattern => ["%{SYSLOGTIMESTAMP:syslog_timestamp} %{IPORHOST:http_host} %{IPORHOST:clientip} (%{NUMBER:bytes}|-) (%{NUMBER:user-identifier}|-) [%{HTTPDATE:timestamp}] "(?:%{WORD:verb} %{NOTSPACE:request} (?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})" %{NUMBER:response} (?:%{NUMBER:bytes}|"-") (%{QS:referrer}||"-")"]
    }
    mutate {
        remove_tag => ["_grokparsefailure"]
        remove_tag => ["Syslog"]
        add_tag => ["Nginx"]
    }
  }
}


A logstash sokféle kimenetet támogat, ebben a példában a gyakran használt Elasticsearch és fájl kimenetet mutatom be:

output {
  elasticsearch {
    host => "localhost"
    protocol => "http"
  }
  if [type] == "syslog" and "_grokparsefailure" in [tags] {
    file { path => "/var/log/logstash/failed_syslog_events-%{+YYYY-MM-dd}.log" }
  }
}


Hasznos tudnivalók


1. A Logstash konfigját így tudjuk ellenőrizni:

logstash --configtest -f /etc/logstash/conf.d/*

 Ezt érdemes minden módosítás után megtenni, mert az indulásakor nem jelez hibát, esetleg leáll a Java processz :-).

2.  A logstash számára az ulimit értéket érdemes megnövelni a /etc/init.d/logstash init szkript ulimit sorának szerkesztésével:
 pl.: ulimit -n 32768

3. A konfiguráció elsőre elég összetettnek tűnik, de a fenti pattern remélem segít elindulni a saját készítésében.

4. A mutate hasznos eszköz, mert a logokon tudunk segítségével változtatni. Itt az add_tag és remove_tag lehetőségeit használjuk.
5. Az egyes bejegyzésekhez tetszőlegesen lehet tag-et adni és elvenni, így a Kibana-ban ez szerint könnyű elkülöníteni a logokat.
6. A patternek szintaktiákja így néz ki :

%{BEJEGYZÉS_FAJTÁJA:bejegyzés neve}

A BEJEGYZÉS_FAJTÁJA mező csak meghatározott értéket vehet fel. Pontos listát nem találtam, se a /opt/logstash/patterns alatti fájlokból lehet
lesni. Mindenesetre a SYSLOGTIMESTAMP,IPORHOST, WORD,NUMBER értékekkel sokmindent le lehet fedni.

A bejegyzés neve tetszőleges lehet, pontos szabályokat itt sem találtam, de kis- nagybetűk, számok biztosan lehetnek.

7. Pattern készítéséhez jó segédeszköz a következő:
https://grokdebug.herokuapp.com/
Ez azért jó, mert több input logsort lehet beilleszteni, cserébe ami itt működik, az a Logstash-ben nem mindig:
http://grokconstructor.appspot.com/do/match

A Logstash konfig innen letölthető egy köszönöm jólesik...



Elasticsearch


Telepítés


A telepítés szintén egyszerű (http://www.elastic.co/guide/en/elasticsearch/reference/current/setup-repositories.html):

wget -qO - https://packages.elasticsearch.org/GPG-KEY-elasticsearch | apt-key add -
echo "deb http://packages.elasticsearch.org/elasticsearch/1.5/debian stable main" | > /etc/apt/sources.list.d/elasticsearch.list
apt-get update
apt-get install elasticsearch
update-rc.d elasticsearch defaults 95 10


vagy (ha nem működik a repo, mint ennek a bejegyzésnek az írása során :-) )

wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.5.0.deb
dpkg -i elasticsearch-1.5.0.deb
update-rc.d elasticsearch defaults 95 10


Érdemes telepíteni a head nevű Elasticsearch modult, amely segítségével egyszerűen kereshetünk benne. A telepítése ennek is nagyon egyszerű:

cd /usr/share/elasticsearch/bin
./plugin -install mobz/elasticsearch-head

Így lehet elérni:

http://<Elasticsearch DB IP>:9200/_plugin/head/

Konfiguráció


Alap konfigurációval működik, az egyetlen változtatása a /etc/elasticsearch/elasticsearch.yml-ban:

discovery.zen.ping.multicast.enabled: false

Ha ez be van kapcsolva, akkor feltérképezi a többi Elasticsearch node-ot, de a Kibana 4 csak 1.4.4-es, vagy újabb verzióval megy, ezért nem indul el enélkül, ha talál korábbi verziójú Elasticsearch node-ot a hálózatban.

Érdekes megjegyezni, hogy az Elasticsearch alapesetben nem támogat AAA-t (authentication, authorization, accounting)  Erre nyújt megoldást az Elasticsearch Sield, ami nagyon sok lehetőséget tartogat, de a licenc díja is magas.


Kibana


A jelenleg stable állapotú logstash (1.4.2) tartalmaz egy logstash-web init szkripttel indítható Kibana 3-at, de a fejlesztés alatt álló 1.5-ös verzóban egyelőre ez nem elérhető. Ettől függetlenül megjelent a Kibana 4.0.1-es verziója, ami a Logstash-től külön telepíthető.
A Kibana 4 egy Node.js alkalmazás, így supervisord-vel futtatható.

Telepítés

wget https://download.elasticsearch.org/kibana/kibana/kibana-4.0.1-linux-x64.tar.gz
majd kitömörítettem az opt alá és egy symlinkkel fedtem el a verziót, így a verzióváltáskor ezzel már nem kell foglalkozni:
tar -xzf kibana-4.0.1-linux-x64.tar.gz
ln -s kibana-4.0.1-linux-x64 kibana
apt-get install supervisor


Konfiguráció


A logstash-web indulását akadályozzuk meg:
update-rc.d logstash-web remove

Supervidord konfig (/etc/supervisor/conf.d/kibana4.conf)
[program:Kibana4]
command = /opt/kibana/node/bin/node /opt/kibana/src/bin/kibana
directory = /opt/kibana
user = elasticsearch
autostart = true
autorestart = true
stdout_logfile = syslog
stderr_logfile = syslog
environment = CONFIG_PATH="/opt/kibana/config/kibana.yml", NODE_ENV="production"

A supervisord indítását követően (/etc/init.d/supervisor start) a Kibana4 felülete a kiszolgáló 5601/tcp portján elérhető.

http://<Kibana 4 IP>:5601

A Kibana4 számára az index patternek beállítása az első tennivalónk. Ezt egyszer, a telepítés után kell megtenni, valamint akkor, ha pl a logstash-ben változtatunk a patterneken. Ekkor frissíteni kell az index patterneket.

A beállításra péda:
  • Pipáljuk be a következőt: Use event times to create index names
  • valamint alul a legördülő listában a @timestamp-ot válasszuk ki
  • Create

A Discover-re kattintva láthatjuk a beérkezett és feldolgozott logokat.

Remélem hasznos volt a bejegyzés, várom a visszajelzéseket.


Kulcsszavak: Linux, syslog, Monitoring, Kibana, Elasitcsearch, Logstash, Syslog-ng

Új hozzászólás: