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
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]

перевіряємо:

[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

Можна ляснути себе по плечу - налаштування на стороні Elasticsearch виконані. Тепер настала черга налаштувати Kibana. Якщо запустити її зараз, посиплються помилки, тому важливо створити сховище ключів. Робиться це у дві команди (користувач кібана і пароль, введений на етапі створення паролів в Elasticsearch):

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

Якщо все правильно - Kibana почне просити логін та пароль. У підписці рівня Basic є рольова модель на основі внутрішніх користувачів. Починаючи з Gold, можна підключати зовнішні системи аутентифікації — LDAP, PKI, Active Directory та системи Single sign-on.

Elastic під замком: включаємо опції безпеки кластера Elasticsearch для доступу зсередини та зовні

Права доступу до об'єктів всередині Elasticsearch також можна обмежити. Щоправда, щоб те саме зробити для документів або полів, буде потрібно платна підписка (ця розкіш починається з рівня Platinum). Ці налаштування доступні в інтерфейсі 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" : "Alexander Pushkin",
  "email" : "[email protected]",
  "metadata" : {
    "hometown" : "Saint-Petersburg"
  }
}

Безпека даних всередині кластера Elasticsearch

Коли Elasticsearch працює в кластері (а це звичайна справа), важливими стають налаштування безпеки всередині кластера. Для безпечної взаємодії між нодами, Elasticsearch використовує протокол TLS. Щоб налаштувати безпечну взаємодію між ними, потрібний сертифікат. Генеруємо сертифікат та приватний ключ у PEM-форматі:

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

Після виконання команди вище, у директорії /../elasticsearch з'явиться архів elastic-stack-ca.zip. Усередині нього виявляться сертифікат та приватний ключ із розширеннями crt и ключ відповідно. Їх бажано викласти на shared ресурс, до якого має бути доступ з усіх нод кластера.

Для кожної ноди тепер потрібні свої сертифікати та приватні ключі на основі тих, що лежать у shared директорії. Під час виконання команди попросять задати пароль. Можна додати додаткові опції -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 і виконуємо витися. Якщо все було виконано правильно, повернеться відповідь з кількома нодами:

[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 та його додавання до конфігурації. На основі сертифікату, який вже розміщений у shared директорії, згенеруємо сертифікат у 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 на Хабрі:

Розбираємось з Machine Learning в Elastic Stack (він же Elasticsearch, він же ELK)

Сайзинг Elasticsearch

Джерело: habr.com

Додати коментар або відгук