Wstęp
Elasticsearch i Kibana to potężne narzędzia, które tworzą rdzeń tego co nazywa się ELK Stack (Elasticsearch, Logstash, Kibana). Elasticsearch to rozproszony silnik wyszukiwania i analityki, a Kibana to warstwa wizualizacji, która sprawia, że wszystkie twoje dane stają się ładne i użyteczne.
To co najbardziej lubię w stacku Elastic to możliwości APM (Application Performance Monitoring). Jest to absolutnie best-in-class narzędzie do monitorowania aplikacji – możesz śledzić metryki wydajności, błędy, logi i otrzymywać informacje w czasie rzeczywistym o tym, co dzieje się w twojej infrastrukturze. Oczywiście, żeby to osiągnąć potrzebujemy integracji Elastic APM w naszym stacku, ale o tym w przyszłych artykułach – najpierw musimy zacząć od podstaw.
W tym poradniku przeprowadzę cię przez instalację Elasticsearch i Kibany na twoim własnym VPS z odpowiednimi certyfikatami SSL, konfiguracją domeny (jak kibana.twojastrona.com) i integracją CrowdSec dla bezpieczeństwa. To pierwszy artykuł z mojej serii o Elastic Stack, więc spodziewaj się więcej szczegółowych poradników na ten temat.
Bądźmy jednak realistami – to nie jest super produkcyjna konfiguracja do użytku korporacyjnego, ale do lokalnych testów, zbierania logów z mniejszych aplikacji czy nauki jest idealna – możemy w tym celu wynająć małą VM’kę na Hetzner zaczynając już od ~8 EUR/miesiąc.
Polecam mieć co najmniej 8GB RAM na twoim VPS i działa to na architekturach AMD64 i ARM64. Będę to robił na Ubuntu.
Będziemy opierać się na oficjalnych poradnikach z Elastic, ale daję ci „rozszerzony pakiet” ze wszystkimi dodatkami:
Konfiguracja VPS
Zanim zaczniemy, powinieneś wykonać podstawowe zabezpieczenie swojego VPS. Jeszcze nie napisałem kompleksowego artykułu o „hardeningu” serwera (zdecydowanie jest na mojej liście), ale powinieneś co najmniej skonfigurować swap, zabezpieczyć dostęp SSH, skonfigurować firewall i zastosować podstawowe praktyki bezpieczeństwa. Założę, że masz czysty serwer Ubuntu z dostępem root.
Instalacja Elasticsearch
Aktualizacje systemu
Najpierw – zaktualizujmy wszystko:
apt updateDodawanie repozytorium Elastic
Teraz musimy dodać oficjalne repozytorium Elastic do naszego systemu. To zapewnia nam najnowsze stabilne wersje i aktualizacje bezpieczeństwa:
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
apt install apt-transport-https -y
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/9.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-9.x.list
apt updateInstalacja Elasticsearch
Z skonfigurowanym repozytorium instalacja Elasticsearch jest prosta:
apt install elasticsearch -yWstępna konfiguracja
Teraz ważna część – konfiguracja Elasticsearch. Wyjaśnię dlaczego wprowadzamy te zmiany:
nano /etc/elasticsearch/elasticsearch.ymlDodaj lub zmodyfikuj te ustawienia:
cluster.name: my-cluster
network.host: 0.0.0.0
http.port: 9200
transport.host: 0.0.0.0Ważna uwaga: Używam 0.0.0.0 tymczasowo, żeby ułatwić konfigurację. Później zablokujemy to na 127.0.0.1 kiedy skonfigurujemy nasz reverse proxy z SSL i konfiguracją domeny. To jest znacznie bezpieczniejsze.
[Opcjonalnie] Konfiguracja przechowywania
Oto coś, co wiele poradników pomija – konfiguracja dedykowanego miejsca na dane Elasticsearch. Jeśli masz osobny dysk lub partycję na dane (co gorąco polecam), skonfiguruj to teraz:
nano /etc/elasticsearch/elasticsearch.ymlDodaj te ścieżki:
path.data: /mnt/disk1/elasticsearch/data
path.logs: /mnt/disk1/elasticsearch/logsDlaczego osobne miejsce? Elasticsearch może generować dużo danych i logów. Posiadanie dedykowanego miejsca zapobiega zapełnieniu systemu i pozwala na lepszą wydajność oraz strategie backupów.
Uruchamianie Elasticsearch
Włączmy i uruchommy usługę:
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch.service
sudo systemctl start elasticsearch.serviceI sprawdź czy działa:
sudo systemctl status elasticsearch.serviceKonfiguracja Elasticsearch
Konfiguracja uwierzytelniania
Elasticsearch ma domyślnie włączone funkcje bezpieczeństwa. Musimy ustawić hasło dla superużytkownika elastic:
/usr/share/elasticsearch/bin/elasticsearch-reset-password -u elasticZapisz to hasło! To twój root dostęp do Elasticsearch i będziesz go potrzebować do konfiguracji Kibana.
Testowanie instalacji
Sprawdźmy czy wszystko działa:
curl --cacert /etc/elasticsearch/certs/http_ca.crt -u elastic:<twoje-hasło> https://localhost:9200Powinieneś zobaczyć odpowiedź JSON z informacjami o klastrze.
Instalacja Kibana
Z działającym Elasticsearch zainstalujmy Kibana:
apt install kibana -yKonfiguracja Kibana
Teraz musimy skonfigurować Kibana do pracy z naszą instancją Elasticsearch:
nano /etc/kibana/kibana.ymlSkonfiguruj te ustawienia:
server.port: 5601
server.host: 0.0.0.0Znowu, 0.0.0.0 to tymczasowe – zabezpieczymy to później z naszą konfiguracją reverse proxy.
Uruchamianie Kibana
Włącz i uruchom usługę Kibana:
sudo systemctl daemon-reload
sudo systemctl enable kibana.service
sudo systemctl start kibana.serviceI sprawdź czy działa:
sudo systemctl status kibana.serviceKonfiguracja Kibana
Łączenie z Elasticsearch
Kibana musi się połączyć z Elasticsearch. Wygenerujemy token rejestracji:
/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibanaWstępna konfiguracja
Teraz przejdź do http://ip-twojego-serwera:5601 w przeglądarce. Zostaniesz poproszony o wprowadzenie tokena rejestracji, który właśnie wygenerowaliśmy. Po tym zaloguj się użytkownikiem elastic i hasłem, które ustawiliśmy wcześniej.
Klucze szyfrowania
Kibana potrzebuje kluczy szyfrowania do różnych funkcji jak monitorowanie uptime. Bez nich będziesz widział błędy w logach:
/usr/share/kibana/bin/kibana-encryption-keys generateSkopiuj wygenerowane ustawienia (wyglądają jak xpack.encryptedSavedObjects.encryptionKey: ...) i dodaj je do konfiguracji Kibana:
nano /etc/kibana/kibana.ymlWklej wygenerowane klucze, potem zrestartuj Kibana:
sudo systemctl restart kibana.serviceKonfiguracja domeny i SSL
Teraz przechodzimy do fajnej części – konfiguracji odpowiednich domen i certyfikatów SSL. Będę używał domen jak elasticsearch.twojastrona.com i kibana.twojastrona.com.
Najpierw musisz dodać rekordy A/AAAA do swojego DNS wskazujące na IP twojego serwera. Sposób zależy od twojego dostawcy DNS, ale koncepcja jest wszędzie taka sama.
Tymczasowy certyfikat SSL
Potrzebujemy tymczasowego certyfikatu do konfiguracji nginx. Nie martw się, później zastąpimy to odpowiednim certyfikatem Let’s Encrypt:
openssl req -x509 -nodes -days 3 -newkey rsa:2048 \
-keyout /etc/ssl/private/temporary-cert-for-nginx.key \
-out /etc/ssl/certs/temporary-cert-for-nginx.crt \
-subj "/CN=kibana.twojastrona.com"Instalacja Certbot
Certbot to oficjalne narzędzie Let’s Encrypt do uzyskiwania certyfikatów SSL:
apt install snapd
snap install --classic certbot
ln -s /snap/bin/certbot /usr/bin/certbotInstalacja Nginx
Użyjemy Nginx jako reverse proxy. To daje nam terminację SSL, lepsze bezpieczeństwo i możliwość używania własnych domen:
apt install nginx -yKonfiguracja reverse proxy dla Kibana
Stwórz konfigurację Nginx dla Kibana:
nano /etc/nginx/sites-available/kibanaserver {
listen 443 ssl http2;
server_name kibana.twojastrona.com; # Zmień na swoją domenę
# Certyfikat SSL (certbot zastąpi to automatycznie)
ssl_certificate /etc/ssl/certs/temporary-cert-for-nginx.crt;
ssl_certificate_key /etc/ssl/private/temporary-cert-for-nginx.key;
# Podstawowe ustawienia SSL
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# Logowanie dla CrowdSec
access_log /var/log/nginx/kibana-access.log;
error_log /var/log/nginx/kibana-error.log;
location / {
proxy_pass http://127.0.0.1:5601;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_cache_bypass $http_upgrade;
}
}Włącz konfigurację:
ln -s /etc/nginx/sites-available/kibana /etc/nginx/sites-enabled/kibana
nginx -tKonfiguracja reverse proxy dla Elasticsearch
Stwórz konfigurację Nginx dla Elasticsearch:
nano /etc/nginx/sites-available/elasticsearchserver {
listen 443 ssl http2;
server_name elasticsearch.twojastrona.com; # Zmień na swoją domenę
# Podstawowe ustawienia SSL
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# Certyfikat SSL (certbot zastąpi to automatycznie)
ssl_certificate /etc/ssl/certs/temporary-cert-for-nginx.crt;
ssl_certificate_key /etc/ssl/private/temporary-cert-for-nginx.key;
# Logowanie dla CrowdSec
access_log /var/log/nginx/elasticsearch-access.log;
error_log /var/log/nginx/elasticsearch-error.log;
# Nagłówki bezpieczeństwa
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
location / {
proxy_pass https://127.0.0.1:9200;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Connection "";
# SSL off bo łączymy się z ES przez HTTPS z self-signed certem
proxy_ssl_verify off;
proxy_ssl_session_reuse on;
# Timeouty dla długich zapytań
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# Ustawienia buforów
proxy_buffering on;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
}
# Endpoint health check
location /_health {
proxy_pass https://127.0.0.1:9200/_cluster/health;
proxy_ssl_verify off;
proxy_ssl_session_reuse on;
access_log off;
}
}Włącz też tę konfigurację:
ln -s /etc/nginx/sites-available/elasticsearch /etc/nginx/sites-enabled/elasticsearch
nginx -tRestart Nginx
systemctl restart nginxGenerowanie certyfikatów SSL
Teraz magia – zdobądźmy odpowiednie certyfikaty SSL z Let’s Encrypt:
certbot --nginxCertbot automatycznie wykryje twoje konfiguracje Nginx i zaproponuje ich zabezpieczenie. Wybierz obie domeny i postępuj zgodnie z instrukcjami.
systemctl restart nginxTestowanie
Przejdź do https://kibana.twojastrona.com – powinieneś zobaczyć Kibana z odpowiednim certyfikatem SSL!
Zabezpieczanie instalacji
Teraz gdy mamy działający reverse proxy, zablokujmy dostęp tylko do localhost.
Ograniczanie dostępu do Elasticsearch
Zmień ustawienia sieciowe:
nano /etc/elasticsearch/elasticsearch.ymlnetwork.host: 127.0.0.1
http.host: 127.0.0.1I zrestartuj elasticsearch
systemctl restart elasticsearchOgraniczanie dostępu do Kibana
Zaktualizuj te ustawienia:
nano /etc/kibana/kibana.ymlserver.host: 127.0.0.1
server.publicBaseUrl: "https://kibana.twojastrona.com"
elasticsearch.hosts: ["https://127.0.0.1:9200"]I zrestartuj kibanę:
systemctl restart kibanaSprawdź, że Kibana jest nadal dostępna przez twoją domenę.
Darmowe bonusowe treści!
Jeśli chcesz odebrać za darmo mój skrypt do automatycznego patchowania takiego serwera z narzędziami Elastic, zapisz się do mojego newslettera!
Napisałem taki skrypt, żeby robić to szybko i jednym kliknięciem. Po zapisie otrzymasz link do sekcji bonusowych moich artykułów.
Dzięki!
Integracja CrowdSec
Już szczegółowo opisałem instalację CrowdSec w moich poprzednich artykułach:
Ważne: Przejdź bezpośrednio do sekcji „Bonus” i zacznij od kroku 4 w artykule.
Po skonfigurowaniu CrowdSec upewnij się, że dodałeś nasze logi Elasticsearch i Kibana do konfiguracji akwizycji:
nano /etc/crowdsec/acquis.yamlDodaj te pliki logów:
filenames:
- /var/log/nginx/kibana-access.log
- /var/log/nginx/kibana-error.log
- /var/log/nginx/elasticsearch-access.log
- /var/log/nginx/elasticsearch-error.log
labels:
type: nginxBonus: Blokowanie dostępu do Kibany
No dobrze ale mógłbyś zapytać: “Wystawianie Kibany na internet przecież jest niebezpieczne, co nie?” Prawda, i mamy na to rozwiązanie. Możemy skonfigurować nginx reverse proxy aby blokowało cały ruch i zezwalało tylko na nasz adres IP – to samo możemy zrobić z innymi usługami (jeśli nie masz statycznego adresu IP na swoim PC, to możesz skonfigurować odpowiedni routing w pliku hosts na swoim komputerze i użyć Tailscale).
Aby to zrobić dodaj do pliku nano /etc/nginx/sites-available/kibana:
location / {
allow 100.64.0.10; # <-- Your PC IP address
deny all; # <---TIP: Możesz używać całych zakresów IP:allow 100.64.0.0/10;allow aa7a:bb5c:cce0::/48;
dodaj te dwa hooki dla certbota: sudo nano /etc/letsencrypt/renewal-hooks/pre/nginx-unlock.sh
#!/bin/bash
echo "Temporarily removing IP restrictions from NGINX..."
sed -i 's/^\s*allow .*;.*$/# \0/g' /etc/nginx/sites-available/kibana
sed -i 's/^\s*deny all;.*$/# \0/g' /etc/nginx/sites-available/kibana
nginx -t && systemctl reload nginx
i ten sudo nano /etc/letsencrypt/renewal-hooks/post/nginx-lock.sh:
#!/bin/bash
echo "Restoring IP restrictions in NGINX..."
sed -i 's/^#\s*\(allow .*;\)$/\1/g' /etc/nginx/sites-available/kibana
sed -i 's/^#\s*\(deny all;\)$/\1/g' /etc/nginx/sites-available/kibana
nginx -t && systemctl reload nginxFinalnie, popraw jeszcze tylko uprawnienia:
chmod +x /etc/letsencrypt/renewal-hooks/pre/nginx-unlock.sh
chmod +x /etc/letsencrypt/renewal-hooks/post/nginx-lock.shPodsumowanie
Gratulacje! Masz teraz w pełni funkcjonalną konfigurację Elasticsearch i Kibana z odpowiednimi certyfikatami SSL, konfiguracją domeny i środkami bezpieczeństwa. Ta konfiguracja daje ci:
- Elasticsearch dostępny pod
https://elasticsearch.twojastrona.com - Kibana dostępną pod
https://kibana.twojastrona.com - Certyfikaty SSL automatycznie odnawiane przez Let’s Encrypt
- Bezpieczeństwo poprzez integrację CrowdSec
- Odpowiednią kontrolę dostępu z usługami przypisanymi do localhost
Pamiętaj o utrzymywaniu systemu w aktualnym stanie, monitorowaniu zużycia zasobów (szczególnie RAM i miejsce na dysku) i regularnym backupowaniu danych Elasticsearch. Warto też zrobić backup plików konfiguracyjnych, które utworzyliśmy.
Miłego monitorowania!












