Elastic Locked Up: Włączanie opcji bezpieczeństwa klastra Elasticsearch dla dostępu wewnętrznego i zewnętrznego

Elastic Locked Up: Włączanie opcji bezpieczeństwa klastra Elasticsearch dla dostępu wewnętrznego i zewnętrznego

Elastic Stack to narzędzie dobrze znane na rynku systemów SIEM (a właściwie nie tylko). Może zbierać wiele danych o różnej wielkości, zarówno wrażliwych, jak i niezbyt wrażliwych. Nie jest do końca poprawne, jeśli dostęp do samych elementów Elastic Stack nie jest chroniony. Domyślnie wszystkie gotowe elementy Elastic (kolektory Elasticsearch, Logstash, Kibana i Beats) działają na otwartych protokołach. A w samej Kibanie uwierzytelnianie jest wyłączone. Wszystkie te interakcje można zabezpieczyć, a w tym artykule podpowiemy, jak to zrobić. Dla wygody narrację podzieliliśmy na 3 bloki semantyczne:

  • Model dostępu do danych oparty na rolach
  • Bezpieczeństwo danych w klastrze Elasticsearch
  • Zabezpieczanie danych poza klastrem Elasticsearch

Szczegóły pod rozcięciem.

Model dostępu do danych oparty na rolach

Jeśli zainstalujesz Elasticsearch i nie dostroisz go w żaden sposób, dostęp do wszystkich indeksów będzie otwarty dla wszystkich. Cóż, lub ci, którzy potrafią używać curl. Aby tego uniknąć, Elasticsearch ma wzór do naśladowania, który jest dostępny począwszy od subskrypcji Basic (która jest bezpłatna). Schematycznie wygląda to mniej więcej tak:

Elastic Locked Up: Włączanie opcji bezpieczeństwa klastra Elasticsearch dla dostępu wewnętrznego i zewnętrznego

Co jest na zdjęciu

  • Użytkownicy to wszyscy, którzy mogą zalogować się przy użyciu swoich danych uwierzytelniających.
  • Rola to zbiór praw.
  • Prawa to zbiór przywilejów.
  • Przywileje to uprawnienia do zapisu, odczytu, usuwania itp. (Pełna lista przywilejów)
  • Zasoby to indeksy, dokumenty, pola, użytkownicy i inne jednostki magazynu (w przypadku niektórych zasobów wzór do naśladowania jest dostępny tylko w przypadku płatnych subskrypcji).

Domyślnie Elasticsearch ma użytkownicy skrzynek, do którego są przymocowane role pudełkowe. Po włączeniu ustawień zabezpieczeń możesz od razu zacząć z nich korzystać.

Aby włączyć zabezpieczenia w ustawieniach Elasticsearch należy je dodać do pliku konfiguracyjnego (domyślnie jest to Elasticsearch/config/elasticsearch.yml) Nowa linia:

xpack.security.enabled: true

Po zmianie pliku konfiguracyjnego uruchom lub uruchom ponownie Elasticsearch, aby zmiany zaczęły obowiązywać. Kolejnym krokiem jest przypisanie haseł użytkownikom skrzynek. Zróbmy to interaktywnie, używając poniższego polecenia:

[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-setup-passwords interactive
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,logstash_system,beats_system,remote_monitoring_user.
You will be prompted to enter passwords as the process progresses.
Please confirm that you would like to continue [y/N]y


Enter password for [elastic]:
Reenter password for [elastic]:
Enter password for [apm_system]:
Reenter password for [apm_system]:
Enter password for [kibana]:
Reenter password for [kibana]:
Enter password for [logstash_system]:
Reenter password for [logstash_system]:
Enter password for [beats_system]:
Reenter password for [beats_system]:
Enter password for [remote_monitoring_user]:
Reenter password for [remote_monitoring_user]:
Changed password for user [apm_system]
Changed password for user [kibana]
Changed password for user [logstash_system]
Changed password for user [beats_system]
Changed password for user [remote_monitoring_user]
Changed password for user [elastic]

Sprawdzanie:

[elastic@node1 ~]$ curl -u elastic 'node1:9200/_cat/nodes?pretty'
Enter host password for user 'elastic':
192.168.0.2 23 46 14 0.28 0.32 0.18 dim * node1

Można się poklepać po plecach – ustawienia po stronie Elasticsearch zakończone. Teraz czas skonfigurować Kibanę. Jeśli uruchomisz go teraz, pojawią się błędy, dlatego ważne jest utworzenie magazynu kluczy. Odbywa się to za pomocą dwóch poleceń (user Kibana i hasło wprowadzone na etapie tworzenia hasła w Elasticsearch):

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

Jeśli wszystko się zgadza, Kibana zacznie pytać o login i hasło. Subskrypcja podstawowa zawiera wzór do naśladowania oparty na użytkownikach wewnętrznych. Począwszy od Gold, możesz podłączyć zewnętrzne systemy uwierzytelniania - systemy LDAP, PKI, Active Directory i Single Sign-on.

Elastic Locked Up: Włączanie opcji bezpieczeństwa klastra Elasticsearch dla dostępu wewnętrznego i zewnętrznego

Prawa dostępu do obiektów w Elasticsearch mogą być również ograniczone. Aby jednak zrobić to samo z dokumentami czy polami, będziesz potrzebować płatnej subskrypcji (ten luksus zaczyna się od poziomu Platinum). Ustawienia te są dostępne w interfejsie Kibana lub poprzez Bezpieczeństwo API. Możesz to sprawdzić w znanym już 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" : "[email protected]",
  "metadata" : {
    "hometown" : "Saint-Petersburg"
  }
}

Bezpieczeństwo danych w klastrze Elasticsearch

Gdy Elasticsearch działa w klastrze (co jest powszechne), ustawienia zabezpieczeń w klastrze stają się ważne. Do bezpiecznej komunikacji między węzłami Elasticsearch wykorzystuje protokół TLS. Aby skonfigurować bezpieczną interakcję między nimi, potrzebujesz certyfikatu. Generujemy certyfikat i klucz prywatny w formacie PEM:

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

Po wykonaniu powyższego polecenia w katalogu /../elasticsearch pojawi się archiwum Elastic-Stack-ca.zip. Wewnątrz znajdziesz certyfikat oraz klucz prywatny z rozszerzeniami crt и klucz odpowiednio. Wskazane jest umieszczenie ich na zasobie współdzielonym, który powinien być dostępny ze wszystkich węzłów w klastrze.

Każdy węzeł potrzebuje teraz własnych certyfikatów i kluczy prywatnych na podstawie tych znajdujących się w katalogu współdzielonym. Podczas wykonywania polecenia zostaniesz poproszony o ustawienie hasła. Możesz dodać dodatkowe opcje -ip i -dns w celu pełnej weryfikacji oddziałujących węzłów.

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

W wyniku wykonania polecenia otrzymamy certyfikat oraz klucz prywatny w formacie PKCS#12, chroniony hasłem. Pozostaje tylko przenieść wygenerowany plik p12 do katalogu konfiguracyjnego:

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

Dodaj hasło do certyfikatu w formacie p12 w magazynie kluczy i magazynie zaufanych certyfikatów w każdym węźle:

[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

Już znany Elasticsearch.yml Pozostaje tylko dodać linie z danymi certyfikatu:

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 węzły Elasticsearch i wykonujemy curl. Jeżeli wszystko zostało wykonane poprawnie, zwrócona zostanie odpowiedź zawierająca kilka węzłó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 bezpieczeństwa – filtrowanie adresów IP (dostępne w abonamentach od poziomu Gold). Umożliwia tworzenie białych list adresów IP, z których można uzyskać dostęp do węzłów.

Zabezpieczanie danych poza klastrem Elasticsearch

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

Elastic Locked Up: Włączanie opcji bezpieczeństwa klastra Elasticsearch dla dostępu wewnętrznego i zewnętrznego

Aby skonfigurować obsługę https (zamiast http), dodaj nowe linie do Elasticsearch.yml:

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 chroniony hasłem, dodaj go do magazynu kluczy i magazynu zaufanych certyfikatów w każdym węźle:

[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 połączenia poprzez https. Teraz można je uruchomić.

Następnym krokiem jest utworzenie klucza umożliwiającego podłączenie Kibany i dodanie go do konfiguracji. Na podstawie certyfikatu, który już znajduje się w udostępnionym katalogu, wygenerujemy certyfikat w formacie PEM (PKCS#12 Kibana, Logstash i Beats jeszcze 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

Pozostaje tylko rozpakować utworzone klucze do folderu z konfiguracją Kibana:

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

Klucze tam są, więc pozostaje tylko zmienić konfigurację Kibany, aby zaczęła ich używać. W pliku konfiguracyjnym kibana.yml zmień http na https i dodaj linie z ustawieniami połączenia SSL. Ostatnie trzy linie konfigurują bezpieczną komunikację pomiędzy przeglądarką użytkownika a Kibaną.

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

Tym samym ustawienia są zakończone, a dostęp do danych w klastrze Elasticsearch jest szyfrowany.

Jeśli masz pytania dotyczące możliwości Elastic Stack w zakresie bezpłatnych lub płatnych subskrypcji, zadań monitorowania lub tworzenia systemu SIEM, zostaw zapytanie formularz zwrotny na naszej stronie internetowej.

Więcej naszych artykułów na temat Elastic Stack na Habré:

Zrozumienie uczenia maszynowego w Elastic Stack (aka Elasticsearch, alias ELK)

Rozmiar elastyczny

Źródło: www.habr.com

Dodaj komentarz