/ Server

Elasticsearch, Logstash, Kibana - Inbetriebnahme

Um Logs unterschiedlicher Anwendungen bequem durchsuchbar zu machen, müssen sie zuerst normaliziert werden, es muss eine Suchmaschine geben, die die gesuchten Daten findet und ein Tool, das die Bedienung bequem macht und Auswertungen grafisch aufbereitet. Das alles bieten entsprechend Logstash, Elasticsearch und Kibana.

In diesem Beitrag dokumentiere ich meine ersten Erfahrungen mit dem Betrieb eines eigenen ELK-Stacks. Elasticsearch, Logstash und Kibana werden auf 2 vServern mit Ubuntu 18.04 mit je 2GB RAM installiert. Der Server, auf dem Kibana installiert wird ist übers Internet erreichbar.

Installation

Auf jedem der beiden Server wird Elastic-Repository hinzugefügt:

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
sudo apt-get install apt-transport-https
echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list

und Openjdk-8 installiert:

sudo apt-get install openjdk-8-jre-headless

Elasticsearch

Auf dem ersten Server wird Elasticsearch installiert:

sudo apt-get update && sudo apt-get install elasticsearch

und registriert als Service:

sudo /bin/systemctl daemon-reload
sudo /bin/systemctl enable elasticsearch.service

Kibana

Zusätzlich zu Elasticsearch wird auf dem ersten Server Kibana installiert:

sudo apt-get update && sudo apt-get install kibana

und registriert:

sudo /bin/systemctl daemon-reload
sudo /bin/systemctl enable kibana

Kibana wird nicht direkt, sondern über einen Ngninx-Proxy veröffentlicht, der auch den Passwortschutz übernimmt.
Nginx und Letsencrypt installieren:

sudo apt-get install nginx apache2-utils letsencrypt

Ein Zertifikat für Kibana generieren (Es wird davon ausgegangen, dass ein DNS-Name für den Server existiert):

sudo certbot certonly -d MEINSERVERNAME

HTTP Auth Kibana Admin anlegen:

sudo htpasswd -c /etc/nginx/htpasswd.users kibanaadmin

Konfiguration anlegen (sudo vim /etc/nginx/sites-available/default):

server {
    listen 443;
    
    ssl on;
    ssl_certificate /etc/letsencrypt/live/MEINSERVERNAME/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/MEINSERVERNAME/privkey.pem;

    server_name example.com;

    auth_basic "Restricted Access";
    auth_basic_user_file /etc/nginx/htpasswd.users;

    location / {
        proxy_pass http://localhost:5601;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;        
    }
}

Kibana muss dann noch neugestartet werden:

sudo service nginx restart

Logstash

Auf dem zweiten Server wird Logstash installiert:

sudo apt-get update
sudo apt-get install logstash

Logstash wird noch nicht gestartet. Im nächsten Abschnitt wird die erste Pipeline angelegt. Ohne, dass eine Pipeline-Konfiguration vorliegt (z.B. in /etc/logstash/conf.d/), ist Logstash nicht einsatzfähig und startet immer wieder neu.

Filebeat

Filebeat wird für den ersten Test auf dem Logstash-Server installiert.

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.2.4-amd64.deb
sudo dpkg -i filebeat-6.2.4-amd64.deb

Auch Filebeat wird noch nicht gestartet, sondern nach Anlage der ersten Konfiguration.

Die erste Konfiguration

Logs in eine lokale Datei schreiben

Für den allerersten Test werden Systemlogs des Logstash-Servers mit Hilfe des Filebeat gesammelt, mit einem Tag "type=system" angereichert und an Logstash gesendet. Logstash soll das Ergebnis dann vorerst in eine Detei schreiben.
Die entsprechende Konfiguration des Filebeat (sudo vim /etc/filebeat/filebeat.yml):

filebeat.prospectors:
- type: log
  paths:
    - /var/log/*
output.logstash:
  hosts: ["localhost:5044"]

Die Konfiguration des Logstash in /etc/logstash/conf.d/first-pipeline.yml:

input {
    beats {
        port => "5044"
    }
}
output {
    file {
	path => "/tmp/logstash-output"
    }
}

Nun können Logstash und Filebeat als Services für die Ausführung beim Systemstart aktiviert werden und gestartet werden:

sudo /bin/systemctl daemon-reload
sudo /bin/systemctl enable filebeat.service
sudo /bin/systemctl enable logstash.service
sudo service filebeat start
sudo service logstash start

Der Inhalt aller Log-Dateien aus /var/log sollte nach einer Weile in /tmp/logstash-output zu sehen sein.

Logs an Elasticsearch senden

Der Inhalt der Logstash-Konfiguration /etc/logstash/conf.d/first-pipeline.yml wird geändert in:

input {
    beats {
        port => "5044"
    }
}
output {
    elasticsearch {
        hosts => ["ELASTICSEARCH_IP:9200"]
    }
}

Lostash muss dann neugestartet werden:

sudo service logstash restart

Ob die Logstash-System-Logs nun in Elasticsearch angekommen sind, kann man prüfen mit:

curl -XGET 'ELASTICSEARCH_IP:9200/logstash-2019.01.18/_search?pretty&q=fields.type:syslog'

Mit diesem Befehl werden Logeinträge vom 2019.01.18 gesucht, die den vom Filebeat gesetzten Tag syslog enthalten. Die Rückgabe sollte Einträge enthalten, wie:

{
        "_index" : "logstash-2019.01.18",
        "_type" : "doc",
        "_id" : "qPpZY2gBOVCXrLuZxuN3",
        "_score" : 0.18232156,
        "_source" : {
          "fields" : {
            "type" : "syslog"
          },
          "tags" : [
            "beats_input_codec_plain_applied"
          ],
          "message" : "Jan 19 00:43:13 localhost sudo: pam_unix(sudo:session): session closed for user root",
          "@version" : "1",
          "prospector" : {
            "type" : "log"
          },
          "offset" : 48980,
          "source" : "/var/log/auth.log",
          "@timestamp" : "2019-01-18T23:43:16.528Z",
          "beat" : {
            "version" : "6.2.4",
            "hostname" : "logstash",
            "name" : "logstash"
          },
          "host" : "logstash"
        }

Fazit

Die einfachste Konfiguration des ELK ist vorbereitet. Filebeat sammelt Logs des Logstash-Servers und leitet sie an den Logstash-Service weiter. Logstash leitet sie an Elasticsearch, welcher über Kibana angefragt werden kann. Für den produktiven Einsatz ist die Konfiguration jedoch noch nicht geeignet. Unter anderem Ausfallsicherheit sowie das richtige Sizing müssen noch umgesetzt werden.

Quelle
https://www.elastic.co/guide