====== ELK stack v 6.2.1 ====== | Project owner:| [[user: cyberian|Cyberian]]| {{:project:16x16warning-icon.png?nolink |}} 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 {{:project:elk-infrastructure.png?nolink|}} **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: {{:project:elasticsearch_9200.jpg?nolink|}} ===== 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í {{:project:16x16warning-icon.png?nolink |}}**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. {{:project:16x16sign-error-icon.png?nolink |}}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. > {{:project:16x16warning-icon.png?nolink |}}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 {{:project:16x16warning-icon.png?nolink |}}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 {{:project:16x16warning-icon.png?nolink |}}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 {{ :project:logstash01.jpg?nolink |}} ===== 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 {{:project:16x16sign-error-icon.png?nolink |}} 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