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
Syslog-ng
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
Telepítés
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ó
Logok fogadása
input {
udp {
port => 10000
type => syslog
}
}
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"]
}
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
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
É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 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.gzmajd 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"
http://<Kibana 4 IP>:5601
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.