Table of Contents

ELK stack v 6.2.1

Project owner: Cyberian

Tento projekt není prozatím celý hotový.

Cíl využití je sběr syslogů, vyhledávání v nich a jejich vizualizace na OS Debian 9.3.0 Objem logů se v mém projektu odhaduje na asi 30GB za 1 měsíční časové okno

Prozatimní přehled portů:

Kibana 5601
Elasticsearch 9200
Logstash 5044(Logstash Beats server), 9600 (Api end point)
Nginx 80(reverse proxy na 5601)

HW vs služby, které na něm poběží:

1. PC: CPU 2,2Ghz(2 vlákna), RAM 4GB (800MHz), HDD 160GB IP: 10.2, ElasticSearch, Kibana, Unify controller(offtopic)
2. PC: CPU i3 3.3Ghz (4 vlákna), RAM 4GB(1333MHz), HDD 500GB IP: 10.3,Logstash

Java

Začneme instalací nutného zla na obou PC a to Javy 1.8.0 (pokud hodláte vyvíjet, pak JDK):

apt-get update
apt-get install default-jre

Pokud nebude default-jre k dispozici pak:

echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu xenial main" | tee /etc/apt/sources.list.d/webupd8team-java.list
echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu xenial main" | tee -a /etc/apt/sources.list.d/webupd8team-java.list
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys EEA14886
apt-get update
apt-get install oracle-java8-installer

Příkazem

java –version

zkontrolujeme, zda skutečně máme verzi 1.8.0. Pokud ne, pak instalovat oracle-java8-set-default

ElasticSearch

Pozor na verzi, neinstalovat zbrkle :). Měl jsem v apt prehistorickou verzi 1.6.2. Přidáme tedy repozitář no novou verzi. Což je v době tohoto návodu 6.2.1. Udržujte vždy verze všech 3 služeb stejné, jinak vás čekají ošklivé komplikace. Nejprve si přidáme apt-key:

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | apt-key add -
apt-get install apt-transport-https

poznámka: -qO - je quiet a výstup wgetu do stdout odkud ho posíláme trubkou do apt-key Přidáme si depozitář na elasticsearch 6.x:

echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | tee -a /etc/apt/sources.list.d/elastic-6.x.list
apt-get install -y elasticsearch

Edit konfigurace (omlouvám se všem uživatelům “vi” editoru, používám nano od dob co jsem poprvé viděl OpenVMS přes VT200):

nano /etc/elasticsearch/elasticsearch.yml

Nastavit si network host na IP daného PC, případně pokud hodláte mít všechny služby na jednom PC, pak na localhost, aby se nikdo nemohl přihlásit z venku. Warn: Přes http API je totiž možné server klidně i vypnout :)

Po uložení provést restart služby a její přidání do příslušného runlevelu. Na Debianu 9 je systemd.

service elasticsearch restart
update-rc.d elasticsearch defaults 95 10
systemctl enable elasticsearch

Ke kontrole:

*Zkontrolovat zda po startu systému startuje elasticsearch

systemctl status elasticsearch

*Zkontrolovat zda se zobrazí při http přístupu na port 9200 něco podobného:

Kibana

Nyní nainstalujeme kibanu:

apt-get -y install kibana
nano /etc/kibana/kibana.yml

na začátku doporučuji měnit pouze server.host ať si nekomplikujete řešení případných chyb

Nastavíme službu na start při spuštění:

update-rc.d kibana defaults 96 9
systemctl enable kibana
systemctl start kibana

Nginx

Nainstalujeme nginx a zvolíme si vlastního uživatele pro přístup k webovému rozhraní kibany v rámci nginx:

apt-get install nginx apache2-utils
htpasswd -c /etc/nginx/htpasswd.users kibanaadmin

Editujeme konfig:

nano /etc/nginx/sites-available/default

a do něj zapíšeme:

server {
    listen 80;
    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;        
    }
}

Následně restartovat službu. A zkusit zvenku připojení na webový port. Mělo by to vyžadovat uživatele a heslo, které jsme si předchvilkou zakládali. To by nás mělo dostat na webovou stránku, kde se nám načte rozhraní Kibany (grafický pruh). Chyby Kibany budeme prozatím ignorovat. Později se k ní vrátíme.

Pokud není vidět pruh s logem kibany a namísto toho např error 502 bad gateway, pak je něco špatně

V tomto případě použijeme příkaz:

Journalctl –f –u kibana.service

Tím se nám vypíše žurnál vyfiltrovaný na jméno této služby a pročteme si, co se událo.

kibana měla, možná ještě má bug v tom, že pokud jste příliš aktivním adminem a povolíte vlastní nastavení proměnné pid.file: v /etc/kibana.yml tak skončíte chybou na nemožnost vytvoření takového souboru. Musel by se pak upravit startovací skript pro démona kibanu v init.d, nicméně znalí budou vědět a začátečník se dotoho nepustí a proměnnou si v konfigu zakomentuje zpátky .)

Logstash

Repozitář pro logstash zadávat již nemusíme. Pro balík ELK je společná cesta artifacts.elastic.co/packages/6.x/apt a tu už jsme zadali u Elasticsearch.

apt-get update
Apt-get –y install logstash

Dále nainstalujeme grok k parsování dat:

apt-get –y install grok

Generování SSL certifikátů

mkdir -p /etc/pki/tls/certs
mkdir /etc/pki/tls/private

Nastavit tyto dvě cesty i do /etc/kibana/kibana.yml (server.ssl.enabled: true, ssl.certificate a ssl.key)

nano /etc/ssl/opsnssl.cnf

Pod návěstí [ v3_ca] zapsat:

subjectAltName = IP: 192.168.10.2

Vytvoření certifikátů:

Cd /etc/pki/tls
openssl req -config /etc/ssl/openssl.cnf -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt

Nastavit práva pro uživatele a skupinu kibana a logstash. Ostatním odepřít čtení (chmod 750)

Konfigurace Logstash

Konfigurační soubory jsou ve formátu json, takže pozor na mezery a odsazení. Vytvoříme konfigurační soubory pro vstup, filtraci a výstup do elasticsearch.

Vstup

Vytvoříme soubor 02-beats-input.conf:

Nano /etc/logstash/conf.d/02-beats-input.conf

S obsahem:

input {
  beats {
    port => 5044
    ssl => true
    ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
    ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
  }
}

Filtr

Vytvoříme soubor 10-syslog-filter.conf:

Nano /etc/logstash/conf.d/10-syslog-filter.conf

S obsahem:

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" ]
    }
  }
}

Tento filter se dívá po logu typu „syslog“ skrze FileBeat a pokouší se použít grok k parsování příchozích syslog logů k tomu, aby je udělal strukturované a dotazovatelné.

Nyní vytvoříme konfigurační soubor 30-elasticsearch-output.conf:

Výstup

nano /etc/logstash/conf.d/30-elasticsearch-output.conf
    output {
      elasticsearch {
        hosts => ["localhost:9200"]  # pokud je logstash na jinem serveru, pak sem zadat IP: 192.168.10.2+port
        sniffing => true
        manage_template => false
        index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
        document_type => "%{[@metadata][type]}"
      }
    }

Tato konfigurace nastavuje logstash tak, aby beat data ukládal na elasticsearch, který běží na 192.168.10.2:9200

Pokud bude potřeba přidat filtry pro jiné aplikace, které používají vstup z FileBeat, pak je potřeba řadit konfigurační soubory mezi 02- až 30-


Restartovat logstash a povolit jej:

Systemctl restart logstash
update-rc.d logstash defaults 96 9

Pokud se při instalaci logstash nevytvořil skript pro démona logstash v /etc/init.d, pak je tu ještě jedna záchrana (iniciativě se meze nekladou, můžete si ho napsat i sami). V instalačním adresáři logstash pod /usr/share/logstash/bin se nachází system-install

 /usr/share/logstash/bin/system-install /etc/logstash/startup.options
systemctl enable logstash

Po restartu se ujistíme o tom, že služba běží:

systemctl status logstash

Konfigurace FileBeat

Nastavíme sekci pro Filebeat prospectors pro sbírání logů o které máme zájem.

nano /etc/filebeat/filebeat.yml
-type: log
  enabled: true
  paths:
    - /var/log/remote/*/*.log #pouze logy ze subadresaru remote

Dále nastavíme sekci Elasticsearch output:

 hosts: ["192.168.10.2:9200"]

a jako další Logstash output:

  output.logstash:
    # The Logstash hosts
    hosts: ["192.168.10.3:5044"]
  bulk_max_size: 1024 #tento řádek přidáme

V případě, že služba nenastartuje, pak zkuste spustit službu přímo v konzoli s jejími parametry, které lze vidět ve výpisu systemctl status filebeat. V mé instalaci:

/usr/share/filebeat/bin/filebeat -c /etc/filebeat/filebeat.yml -path.home /usr/share/filebeat -path.config /etc/filebeat -path.data /var/lib/filebeat -path.logs /var/log/filebeat

poznámky

kibana - vega.github.io - kibana custom graphs with vega

zjistit si info o System D, System V, Upstart, init.d

zjistit si info o FileBeat filtrech a indexech; Logstash, ElasticSearch

openssl.cnf x509_extensions = v3_ca, defaultně od komentované

openssl.cnf # req_extensions = v3_req zjistit info kdy seco při čem rozšiřuje

Zdroje

1. How to install ELK on Ubuntu https://www.digitalocean.com/community/tutorials/how-to-install-elasticsearch-logstash-and-kibana-elk-stack-on-ubuntu-14-04

2. Complete Guide to ELK https://logz.io/learn/complete-guide-elk-stack/#An-Elasticsearch-Tutorial

3. Set up Prospectors https://www.elastic.co/guide/en/beats/filebeat/master/configuration-filebeat-options.html

4. Openssl.conf Walkthru https://www.phildev.net/ssl/opensslconf.html

5. https://stackoverflow.com/questions/34877563/subjectaltname-is-not-getting-added-in-the-csr