Elastic под ключ: активираме опции за сигурност на кластера Elasticsearch за достъп отвътре и отвън

Elastic под ключ: активираме опции за сигурност на кластера Elasticsearch за достъп отвътре и отвън

Elastic Stack — известен инструмент на пазара на SIEM системи (всъщност, не само за тях). Може да събира различни данни, както чувствителни, така и не толкова. Невярно е, ако достъпът до самите елементи на Elastic Stack не е защитен. По подразбиране всички опаковъчни елементи на Elastic (Elasticsearch, Logstash, Kibana и колекторите Beats) работят по отворени протоколи. Освен това, аутентификацията в Kibana е деактивирана. Всички тези взаимодействия могат да бъдат защитени и в тази статия ще обясним как да го направим. За удобство сме разделили съдържанието на 3 смислови блока:

  • Ролева модел на достъп до данни
  • Сигурност на данните вътре в кластера Elasticsearch
  • Сигурност на данните извън кластера Elasticsearch

Подробности под катом.

Ролева модел на достъп до данни

Ако инсталирате Elasticsearch и не го конфигурирате — достъпът до всички индекси ще бъде отворен за всички желаещи. Или, поне за тези, които знаят как да използват curl. За да избегнете това, в Elasticsearch има ролева модел, който е наличен от абонаментно ниво Basic (той е безплатен). Схематично изглежда приблизително така:

Elastic под ключ: активираме опции за сигурност на кластера Elasticsearch за достъп отвътре и отвън

Какво е на картинката

  • Потребителите — това са всички, които могат да се автентикират с помощта на идентификационни данни.
  • Роля — това е набор от права.
  • Права — това е набор от привилегии.
  • Привилегии — това са разрешения за запис, четене, изтриване и т.н. (Пълен списък с привилегии)
  • Ресурси — това са индекси, документи, полета, потребители и други обекти на хранилището (ролева модел за някои ресурси е наличен само в платени абонаменти).

В Elasticsearch по подразбиране има опаковъчни потребители, към които са свързани опаковъчни роли. След активиране на настройките за сигурност, те могат веднага да бъдат използвани.

За да активирате сигурността в настройките на Elasticsearch, трябва да добавите в конфигурационния файл (по подразбиране това е elasticsearch/config/elasticsearch.yml) нов ред:

xpack.security.enabled: true

След промяна на конфигурационния файл, стартирайте или рестартирайте Elasticsearch, за да влязат в сила промените. Следващата стъпка е присвояване на пароли на опаковъчни потребители. Ще го направим интерактивно с помощта на следната команда:

[elastic@node1 ~]$ .\/elasticsearch\/bin\/elasticsearch-setup-passwords interactive
Иницииране на настройките на паролите за резервираните потребители elastic,apm_system,kibana,logstash_system,beats_system,remote_monitoring_user.
Ще бъдете подканени да въведете пароли в хода на процеса.
Моля, потвърдете, че искате да продължите [y\/N]y


Въведете парола за [elastic]:
Повторете паролата за [elastic]:
Въведете парола за [apm_system]:
Повторете паролата за [apm_system]:
Въведете парола за [kibana]:
Повторете паролата за [kibana]:
Въведете парола за [logstash_system]:
Повторете паролата за [logstash_system]:
Въведете парола за [beats_system]:
Повторете паролата за [beats_system]:
Въведете парола за [remote_monitoring_user]:
Повторете паролата за [remote_monitoring_user]:
Променена парола за потребител [apm_system]
Променена парола за потребител [kibana]
Променена парола за потребител [logstash_system]
Променена парола за потребител [beats_system]
Променена парола за потребител [remote_monitoring_user]
Променена парола за потребител [elastic]

Проверяваме:

[elastic@node1 ~]$ curl -u elastic 'node1:9200\/_cat\_nodes?pretty'
Въведете паролата за хоста за потребител 'elastic':
192.168.0.2 23 46 14 0.28 0.32 0.18 dim * node1

Можете да се потупате по рамото — настройките отстрани на Elasticsearch са завършени. Сега е времето да конфигурирате Kibana. Ако я стартирате сега, ще излязат грешки, така че е важно да създадете хранилище за ключове. Това се прави с две команди (потребител kibana и парола, въведени на стъпката за създаване на паролите в Elasticsearch):

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

Ако всичко е наред — Kibana ще започне да изисква логин и парола. В плановете на базисно ниво е налична ролевата модел, базиран на вътрешни потребители. Започвайки от златен план, можете да свързвате външни системи за удостоверяване — LDAP, PKI, Active Directory и системи за еднократно влизане.

Elastic под ключ: активираме опции за сигурност на кластера Elasticsearch за достъп отвътре и отвън

Достъпът до обектите в Elasticsearch също може да бъде ограничен. Въпреки това, за да направите същото за документи или полета, ще е нужна платена абонаментна услуга (това удоволствие започва от платината). Тези настройки са налични в интерфейса на Kibana или чрез Security API. Можете да проверите през вече познатото меню Dev Tools:

Създаване на роля

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

Създаване на потребител

POST \/_security\/_user\/pushkin
{
  "password" : "nataliaonelove",
  "roles" : [ "ruslan_i_ludmila_role", "kibana_user" ],
  "full_name" : "Александър Пушкин",
  "email" : "pushkin@lyceum.edu",
  "metadata" : {
    "hometown" : "Санкт Петербург"
  }
}

Сигурност на данните вътре в кластера Elasticsearch

Когато Elasticsearch работи в клъстер (а това е обичайна практика), важни стават настройките за сигурност в клъстера. За безопасно взаимодействие между нодовете, Elasticsearch използва TLS протокол. За да конфигурирате безопасното взаимодействие между тях, е необходим сертификат. Генерираме сертификат и частен ключ в PEM формат:

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

След изпълнението на горната команда в директорията /../elasticsearch ще се появи архив elastic-stack-ca.zip. Вътре ще намерите сертификат и частен ключ с разширения crt и key съответно. Препоръчително е да ги поставите на споделян ресурс, до който да имат достъп всички възли в клъстера.

За всяка възел сега са необходими свои сертификати и частни ключове на база тези, които се намират в споделената директория. При изпълнение на командата ще поискат да зададете парола. Можете да добавите допълнителни опции —ip и —dns за пълна верификация на взаимодействието между възлите.

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

В резултат на изпълнение на командата ще получите сертификат и частен ключ в формат PKCS#12, защитен с парола. Остава да преместите генерирания файл p12 в директорията с конфигурацията:

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

Да добавим паролата към сертификата в формат p12 в keystore и truststore на всяка възел:

[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

В вече известния elasticsearch.yml остава да добавите редовете с информация за сертификата:

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

Стартирайте всички възли на Elasticsearch и изпълнете curl. Ако всичко е изпълнено правилно, ще получите отговор с информация за няколко възли:

[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

Има още една опция за сигурността — филтрация на IP адреси (достъпна в абонаментите от ниво Gold). Позволява създаването на бели списъци с IP адреси, от които е разрешен достъп до възлите.

Сигурност на данните извън кластера Elasticsearch

Извън клъстера означава свързване на външни инструменти: Kibana, Logstash, Beats или други външни клиенти.

Elastic под ключ: активираме опции за сигурност на кластера Elasticsearch за достъп отвътре и отвън

За да настроим поддръжка на https (вместо http), добавете нови редове в 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

Тъй като сертификатът е защитен с парола, добавете я в keystore и truststore на всяка възел:

[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

След добавянето на ключовете, нодовете на Elasticsearch са готови за свързване чрез https. Сега могат да бъдат стартирани.

Следващата стъпка е създаването на ключ за свързване с Kibana и добавянето му в конфигурацията. На базата на сертификата, който вече се намира в споделената директория, ще генерираме сертификат във формата PEM (PKCS#12, като Kibana, Logstash и Beats все още не го поддържат):

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

Остава само да разархивираме създадените ключове в папката с конфигурацията на Kibana:

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

Ключовете са налични, така че остава само да променим конфигурацията на Kibana, за да започне да ги използва. В конфигурационния файл kibana.yml променяме http на https и добавяме редове с настройки за SSL връзка. Последните три реда настройват сигурната комуникация между браузъра на потребителя и 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

Така настройките са извършени и достъпът до данните в кластера Elasticsearch е криптиран.

Ако имате въпроси относно възможностите на Elastic Stack на безплатни или платени абонаменти, задачи за мониторинг или изграждане на SIEM система, оставете запитване в формуляр за обратна връзка на нашия сайт.

Още наши статии за Elastic Stack в Хабре:

Разбиране на машинното обучение в Elastic Stack (известен още като Elasticsearch, ELK)

Размериране на Elasticsearch

Източник: habr.com

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster