====== 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