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
- hodnotu server.host na localhost.
- server.port je defaultně 5601
- server.name dle libosti
- elasticsearch.url: “http://192.168.10.2:9200”
- logging.dest: /var/log/kibana/kibana.log (zde opatrně. Pokud zvolíte vlastní cestu, musí mít user pod kterým spouštíte kibanu přístup do adr. /var/log/kibana pro zápis a čtení
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