Instalacja Elasticsearch i Kibana na VPS w 5 prostych krokach

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.

Logo Elastic stack

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.

Zrzut ekranu przedstawiający możliwości Elastic APM w Kibanie

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:

Bash
apt update

Dodawanie repozytorium Elastic

Teraz musimy dodać oficjalne repozytorium Elastic do naszego systemu. To zapewnia nam najnowsze stabilne wersje i aktualizacje bezpieczeństwa:

Bash
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 update

Instalacja Elasticsearch

Z skonfigurowanym repozytorium instalacja Elasticsearch jest prosta:

Bash
apt install elasticsearch -y

Wstępna konfiguracja

Teraz ważna część – konfiguracja Elasticsearch. Wyjaśnię dlaczego wprowadzamy te zmiany:

Bash
nano /etc/elasticsearch/elasticsearch.yml

Dodaj lub zmodyfikuj te ustawienia:

YAML
cluster.name: my-cluster
network.host: 0.0.0.0
http.port: 9200
transport.host: 0.0.0.0

Waż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:

Bash
nano /etc/elasticsearch/elasticsearch.yml

Dodaj te ścieżki:

YAML
path.data: /mnt/disk1/elasticsearch/data
path.logs: /mnt/disk1/elasticsearch/logs

Dlaczego 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ę:

Bash
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch.service
sudo systemctl start elasticsearch.service

I sprawdź czy działa:

Bash
sudo systemctl status elasticsearch.service
Zrzut ekranu przedstawiający status usługi elasticsearch

Konfiguracja Elasticsearch

Konfiguracja uwierzytelniania

Elasticsearch ma domyślnie włączone funkcje bezpieczeństwa. Musimy ustawić hasło dla superużytkownika elastic:

Bash
/usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic

Zapisz 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:

Bash
curl --cacert /etc/elasticsearch/certs/http_ca.crt -u elastic:<twoje-hasło> https://localhost:9200

Powinieneś zobaczyć odpowiedź JSON z informacjami o klastrze.

Zrzut ekranu przedstawiający pomyślne zapytanie curl do elasticsearch

Instalacja Kibana

Z działającym Elasticsearch zainstalujmy Kibana:

Bash
apt install kibana -y

Konfiguracja Kibana

Teraz musimy skonfigurować Kibana do pracy z naszą instancją Elasticsearch:

Bash
nano /etc/kibana/kibana.yml

Skonfiguruj te ustawienia:

YAML
server.port: 5601
server.host: 0.0.0.0

Znowu, 0.0.0.0 to tymczasowe – zabezpieczymy to później z naszą konfiguracją reverse proxy.

Uruchamianie Kibana

Włącz i uruchom usługę Kibana:

Bash
sudo systemctl daemon-reload
sudo systemctl enable kibana.service
sudo systemctl start kibana.service

I sprawdź czy działa:

Bash
sudo systemctl status kibana.service
Zrzut ekranu przedstawiający status usługi kibana

Konfiguracja Kibana

Łączenie z Elasticsearch

Kibana musi się połączyć z Elasticsearch. Wygenerujemy token rejestracji:

Bash
/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana

Wstę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.

Screenshot showing Kibana dashboard

Klucze szyfrowania

Kibana potrzebuje kluczy szyfrowania do różnych funkcji jak monitorowanie uptime. Bez nich będziesz widział błędy w logach:

Bash
/usr/share/kibana/bin/kibana-encryption-keys generate

Skopiuj wygenerowane ustawienia (wyglądają jak xpack.encryptedSavedObjects.encryptionKey: ...) i dodaj je do konfiguracji Kibana:

Bash
nano /etc/kibana/kibana.yml

Wklej wygenerowane klucze, potem zrestartuj Kibana:

Bash
sudo systemctl restart kibana.service

Konfiguracja 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.

Zrzut ekranu przedstawiający flow reverse proxy

Tymczasowy certyfikat SSL

Potrzebujemy tymczasowego certyfikatu do konfiguracji nginx. Nie martw się, później zastąpimy to odpowiednim certyfikatem Let’s Encrypt:

Bash
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:

Bash
apt install snapd
snap install --classic certbot
ln -s /snap/bin/certbot /usr/bin/certbot

Instalacja Nginx

Użyjemy Nginx jako reverse proxy. To daje nam terminację SSL, lepsze bezpieczeństwo i możliwość używania własnych domen:

Bash
apt install nginx -y

Konfiguracja reverse proxy dla Kibana

Stwórz konfigurację Nginx dla Kibana:

Bash
nano /etc/nginx/sites-available/kibana
Nginx
server {
    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ę:

Bash
ln -s /etc/nginx/sites-available/kibana /etc/nginx/sites-enabled/kibana
nginx -t

Konfiguracja reverse proxy dla Elasticsearch

Stwórz konfigurację Nginx dla Elasticsearch:

Bash
nano /etc/nginx/sites-available/elasticsearch
Nginx
server {
    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ę:

Bash
ln -s /etc/nginx/sites-available/elasticsearch /etc/nginx/sites-enabled/elasticsearch
nginx -t

Restart Nginx

Bash
systemctl restart nginx

Generowanie certyfikatów SSL

Zdjęcie przedstawiające działanie HTTPS

Teraz magia – zdobądźmy odpowiednie certyfikaty SSL z Let’s Encrypt:

Bash
certbot --nginx

Certbot automatycznie wykryje twoje konfiguracje Nginx i zaproponuje ich zabezpieczenie. Wybierz obie domeny i postępuj zgodnie z instrukcjami.

Bash
systemctl restart nginx

Testowanie

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:

Bash
nano /etc/elasticsearch/elasticsearch.yml
YAML
network.host: 127.0.0.1
http.host: 127.0.0.1

I zrestartuj elasticsearch

Bash
systemctl restart elasticsearch

Ograniczanie dostępu do Kibana

Zaktualizuj te ustawienia:

Bash
nano /etc/kibana/kibana.yml
YAML
server.host: 127.0.0.1
server.publicBaseUrl: "https://kibana.twojastrona.com"
elasticsearch.hosts: ["https://127.0.0.1:9200"]

I zrestartuj kibanę:

Bash
systemctl restart kibana

Sprawdź, ż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

Logo 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.

Zrzut ekranu przedstawiający powiadomienia Discord od Crowdsec

Po skonfigurowaniu CrowdSec upewnij się, że dodałeś nasze logi Elasticsearch i Kibana do konfiguracji akwizycji:

Bash
nano /etc/crowdsec/acquis.yaml

Dodaj te pliki logów:

YAML
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: nginx

Bonus: 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:

Nginx
    location / {
        allow 100.64.0.10; # <-- Your PC IP address
        deny all; # <---

dodaj te dwa hooki dla certbota: sudo nano /etc/letsencrypt/renewal-hooks/pre/nginx-unlock.sh

Bash
#!/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:

Bash
#!/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 nginx

Finalnie, popraw jeszcze tylko uprawnienia:

Bash
chmod +x /etc/letsencrypt/renewal-hooks/pre/nginx-unlock.sh
chmod +x /etc/letsencrypt/renewal-hooks/post/nginx-lock.sh

Podsumowanie

Logo Elastic stack

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!

Dołącz do newslettera

Subskrybuj po bonusowe treści. Nie przegap nowych artykułów.

    We won’t send you spam. Unsubscribe at any time.

    Zostaw komentarz

    Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

    Przewijanie do góry