Elastic pod zamkiem: włączamy opcje bezpieczeństwa klastra Elasticsearch dla dostępu z wewnątrz i z zewnątrz

Elastic pod zamkiem: włączamy opcje bezpieczeństwa klastra Elasticsearch dla dostępu z wewnątrz i z zewnątrz

Elastic Stack — znane narzędzie na rynku systemów SIEM (w rzeczywistości nie tylko ich). Może zbierać wiele różnych danych, zarówno wrażliwych, jak i mniej. Nie do końca prawidłowe jest, jeśli dostęp do samych elementów Elastic Stack nie będzie zabezpieczony. Domyślnie wszystkie elementy pakietu Elastic (Elasticsearch, Logstash, Kibana oraz zbieracze Beats) działają na otwartych protokołach. A w samej Kibanie wyłączono uwierzytelnianie. Te wszystkie interakcje można zabezpieczyć, a w tym artykule opowiemy, jak to zrobić. Dla wygody podzieliliśmy narrację na 3 sensowne bloki:

  • Model ról dostępu do danych
  • Bezpieczeństwo danych wewnątrz klastra Elasticsearch
  • Bezpieczeństwo danych poza klastrem Elasticsearch

Szczegóły poniżej.

Model ról dostępu do danych

Jeśli zainstalujesz Elasticsearch i nie będziesz go konfiguracja — dostęp do wszystkich indeksów będzie otwarty dla wszystkich chętnych. Cóż, albo dla tych, którzy potrafią korzystać z curl. Aby temu zapobiec, w Elasticsearch istnieje model ról, który jest dostępny od subskrypcji poziomu Basic (jest on bezpłatny). Schematycznie wygląda to mniej więcej tak:

Elastic pod zamkiem: włączamy opcje bezpieczeństwa klastra Elasticsearch dla dostępu z wewnątrz i z zewnątrz

Co na obrazku

  • Użytkownicy — to wszyscy, którzy mogą się autoryzować za pomocą danych uwierzytelniających.
  • Rola — to zbiór uprawnień.
  • Uprawnienia — to zbiór przywilejów.
  • Przywileje — to zezwolenia na zapis, odczyt, usuwanie itd. (Pełna lista przywilejów)
  • Zasoby — to indeksy, dokumenty, pola, użytkownicy oraz inne podmioty magazynu (model ról dla niektórych zasobów jest dostępny tylko w płatnych subskrypcjach).

W Elasticsearch domyślnie istnieje użytkowników pakietowych, do których przypisane są rolę pakietową. Po włączeniu ustawień bezpieczeństwa można je od razu zacząć używać.

Aby aktywować bezpieczeństwo w ustawieniach Elasticsearch, musisz dodać do pliku konfiguracyjnego (domyślnie jest to elasticsearch/config/elasticsearch.yml) nowy wiersz:

xpack.security.enabled: true

Po zmianie pliku konfiguracyjnego uruchamiamy lub ponownie uruchamiamy Elasticsearch, aby zmiany weszły w życie. Następny krok to przypisanie haseł użytkownikom pakietowym. Zrobimy to interaktywnie za pomocą poniższej komendy:

[elastic@node1 ~]$ .\/elasticsearch\/bin\/elasticsearch-setup-passwords interactive
Rozpoczynanie konfiguracji haseł dla zarezerwowanych użytkowników elastic,apm_system,kibana,logstash_system,beats_system,remote_monitoring_user.
Zostaniesz poproszony o podanie haseł w miarę postępu procesu.
Proszę potwierdzić, że chcesz kontynuować [y\/N]y


Wprowadź hasło dla [elastic]:
Wprowadź ponownie hasło dla [elastic]:
Wprowadź hasło dla [apm_system]:
Wprowadź ponownie hasło dla [apm_system]:
Wprowadź hasło dla [kibana]:
Wprowadź ponownie hasło dla [kibana]:
Wprowadź hasło dla [logstash_system]:
Wprowadź ponownie hasło dla [logstash_system]:
Wprowadź hasło dla [beats_system]:
Wprowadź ponownie hasło dla [beats_system]:
Wprowadź hasło dla [remote_monitoring_user]:
Wprowadź ponownie hasło dla [remote_monitoring_user]:
Zmieniono hasło dla użytkownika [apm_system]
Zmieniono hasło dla użytkownika [kibana]
Zmieniono hasło dla użytkownika [logstash_system]
Zmieniono hasło dla użytkownika [beats_system]
Zmieniono hasło dla użytkownika [remote_monitoring_user]
Zmieniono hasło dla użytkownika [elastic]

Sprawdzamy:

[elastic@node1 ~]$ curl -u elastic 'node1:9200\/cat\/nodes?pretty'
Wprowadź hasło hosta dla użytkownika 'elastic':
192.168.0.2 23 46 14 0.28 0.32 0.18 dim * node1

Możesz się poklepać po plecach — konfiguracja po stronie Elasticsearch została zakończona. Teraz czas na konfigurację Kibany. Jeśli uruchomisz ją teraz, pojawią się błędy, dlatego ważne jest, aby stworzyć magazyn kluczy. Robi się to w dwóch poleceniach (użytkownik kibana i hasło wprowadzone w kroku tworzenia haseł w Elasticsearch):

[elastic@node1 ~]$ .\/kibana\/bin\/kibana-keystore add elasticsearch.username
[elastic@node1 ~]$ .\/kibana\/bin\/kibana-keystore add elasticsearch.password

Jeśli wszystko jest poprawnie — Kibana zacznie prosić o login i hasło. W subskrypcji poziomu Basic dostępny jest model ról oparty na wewnętrznych użytkownikach. Począwszy od poziomu Gold można łączyć zewnętrzne systemy autoryzacji — LDAP, PKI, Active Directory i systemy Single sign-on.

Elastic pod zamkiem: włączamy opcje bezpieczeństwa klastra Elasticsearch dla dostępu z wewnątrz i z zewnątrz

Uprawnienia do obiektów w obrębie Elasticsearch można również ograniczyć. Jednak aby zrobić to samo dla dokumentów lub pól, wymagana jest płatna subskrypcja (ta luksus zaczyna się od poziomu Platinum). Te ustawienia są dostępne w interfejsie Kibana lub przez Security API. Możesz to sprawdzić za pomocą znanego menu Dev Tools:

Tworzenie roli

PUT \/_security\/role\/ruslan_i_ludmila_role
{
  "cluster": [],
  "indices": [
    {
      "names": [ "ruslan_i_ludmila" ],
      "privileges": ["read", "view_index_metadata"]
    }
  ]
}

Tworzenie użytkownika

POST \/_security\/user\/pushkin
{
  "password" : "nataliaonelove",
  "roles" : [ "ruslan_i_ludmila_role", "kibana_user" ],
  "full_name" : "Alexander Pushkin",
  "email" : "pushkin@lyceum.edu",
  "metadata" : {
    "hometown" : "Saint-Petersburg"
  }
}

Bezpieczeństwo danych wewnątrz klastra Elasticsearch

Kiedy Elasticsearch działa w klastrze (co jest dość powszechne), ważne stają się ustawienia bezpieczeństwa w obrębie klastra. Aby zapewnić bezpieczną komunikację między węzłami, Elasticsearch używa protokołu TLS. Aby skonfigurować bezpieczną komunikację między nimi, potrzebny jest certyfikat. Generujemy certyfikat i klucz prywatny w formacie PEM:

[elastic@node1 ~]$ .\/elasticsearch\/bin\/elasticsearch-certutil ca --pem

Po wykonaniu powyższej komendy w katalogu /../elasticsearch pojawi się archiwum elastic-stack-ca.zip. Wewnątrz znajdą się certyfikat oraz klucz prywatny z rozszerzeniami crt i key odpowiednio. Wskazane jest umieszczenie ich w zasobach współdzielonych, do których dostęp powinien mieć cały klaster.

Dla każdej nody są teraz potrzebne własne certyfikaty i klucze prywatne na podstawie tych, które znajdują się w współdzielonym katalogu. Przy wykonaniu komendy będzie wymagane podanie hasła. Można dodać dodatkowe opcje —ip i —dns dla pełnej weryfikacji współpracujących nod.

[elastic@node1 ~]$ . /elasticsearch/bin/elasticsearch-certutil cert --ca-cert /shared_folder/ca/ca.crt --ca-key /shared_folder/ca/ca.key

W wyniku wykonania komendy otrzymamy certyfikat oraz klucz prywatny w formacie PKCS#12, zabezpieczony hasłem. Pozostaje przenieść wygenerowany plik p12 do katalogu z konfiguracją:

[elastic@node1 ~]$ mv elasticsearch/elastic-certificates.p12 elasticsearch/config

Dodamy hasło do certyfikatu w formacie p12 do keystore i truststore na każdej nodzie:

[elastic@node1 ~]$ . /elasticsearch/bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
[elastic@node1 ~]$ . /elasticsearch/bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password

W już znanym elasticsearch.yml pozostaje dodać linie z danymi o certyfikacie:

xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12

Uruchamiamy wszystkie nody Elasticsearch i wykonujemy curl. Jeśli wszystko zostało wykonane poprawnie, otrzymamy odpowiedź zawierającą kilka nodów:

[elastic@node1 ~]$ curl node1:9200/_cat/nodes -u elastic:password                                                                                    
172.18.0.3 43 75 4 0.00 0.05 0.05 dim * node2                                                                                                                     
172.18.0.4 21 75 3 0.00 0.05 0.05 dim - node3                                                                                                                     
172.18.0.2 39 75 4 0.00 0.05 0.05 dim - node1

Istnieje jeszcze jedna opcja dotycząca bezpieczeństwa — filtrowanie adresów IP (dostępne w subskrypcjach od poziomu Gold). Umożliwia tworzenie białych list adresów IP, z których dozwolone jest łączenie się z nodami.

Bezpieczeństwo danych poza klastrem Elasticsearch

Poza klastrem oznacza łączenie zewnętrznych narzędzi: Kibana, Logstash, Beats lub innych zewnętrznych klientów.

Elastic pod zamkiem: włączamy opcje bezpieczeństwa klastra Elasticsearch dla dostępu z wewnątrz i z zewnątrz

Aby skonfigurować wsparcie dla https (zamiast http), dodajemy w elasticsearch.yml nowe linie:

xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.keystore.path: elastic-certificates.p12
xpack.security.http.ssl.truststore.path: elastic-certificates.p12

Ponieważ certyfikat jest zabezpieczony hasłem, dodamy je do keystore i truststore na każdej nodzie:

[elastic@node1 ~]$ .\/elasticsearch\/bin\/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password
[elastic@node1 ~]$ .\/elasticsearch\/bin\/elasticsearch-keystore add xpack.security.http.ssl.truststore.secure_password

Po dodaniu kluczy, węzły Elasticsearch są gotowe do podłączenia przez https. Można je teraz uruchomić.

Następny krok to utworzenie klucza do połączenia z Kibana i dodanie go do konfiguracji. Na podstawie certyfikatu, który już znajduje się w wspólnym katalogu, wygenerujemy certyfikat w formacie PEM (PKCS#12 Kibana, Logstash i Beats jeszcze tego nie obsługują):

[elastic@node1 ~]$ .\/elasticsearch\/bin\/elasticsearch-certutil cert --ca-cert \/shared_folder\/ca\/ca.crt --ca-key \/shared_folder\/ca\/ca.key --pem

Pozostało wypakować utworzone klucze do folderu z konfiguracją Kibana:

[elastic@node1 ~]$ unzip elasticsearch\/certificate-bundle.zip -d kibana\/config

Klucze są, więc teraz trzeba zmienić konfigurację Kibana, aby zaczęła ich używać. W pliku konfiguracyjnym kibana.yml zmieniamy http na https i dodajemy linie z ustawieniami połączenia SSL. Ostatnie trzy linie konfiguracyjne ustalają bezpieczną komunikację między przeglądarką użytkownika a Kibana.

elasticsearch.hosts: ["https:\/\/\${HOSTNAME}:9200"]
elasticsearch.ssl.certificateAuthorities: \/shared_folder\/ca\/ca.crt
elasticsearch.ssl.verificationMode: certificate
server.ssl.enabled: true
server.ssl.key: \/..\/kibana\/config\/instance\/instance.key
server.ssl.certificate: \/..\/kibana\/config\/instance\/instance.crt

W ten sposób ustawienia zostały dokonane, a dostęp do danych w klastrze Elasticsearch jest szyfrowany.

Jeśli masz pytania dotyczące możliwości Elastic Stack w bezpłatnych lub płatnych subskrypcjach, problemy z monitorowaniem lub tworzeniem systemów SIEM, zostaw zapytanie w formie kontaktowej na naszej stronie.

Nasze inne artykuły o Elastic Stack na Habra:

Odkrywamy Machine Learning w Elastic Stack (znanym również jako Elasticsearch, znanym również jako ELK)

Rozmiarowanie Elasticsearch

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster