Стек ELK (стек Elastic) — это набор открытых программ, разработанных Elastic, которые позволяют выполнять поиск, анализ и визуализацию записей журналов.
Стек ELK состоит из четырех основных компонентов:
- Elasticsearch. Распределенная поисковая система, доступная по RESTful протоколу, которая хранит все собранные данные.
- Logstash. Компонент, осуществляющий предобработку, дополнение, фильтрацию и маршрутизацию загружаемых в Elasticsearch данных.
- Kibana. Аналитическая и визуализационная система с web-интерфейсом, позволяющая выполнять комплексные запросы к Elasticsearch и отображать их результаты в виде таблиц и диаграмм.
- Beats. Семейство легких специализированных отправителей данных, тесно интегрированных с Logstash и Elasticsearch.
Если вы следите за новостями об Elasticsearch, то могли слышать о ряде случаев раскрытия конфиденциальных данных, хранящихся в кластерах Elasticsearch. Вот только некоторые ссылки на статьи: Equifax, CITI, AIESEC.
Поскольку Elasticsearch и Kibana поставляются без встроенного механизма аутентификации, данные могут легко подвергнуться атаке, если не предпринять простые меры по их защите.
В этой статье мы рассмотрим, как реализовать один из наиболее распространенных и простых методов защиты стека ELK — установку Nginx в качестве обратного прокси-сервера перед Elasticsearch и Kibana.
Статья является переводом и адаптацией англоязычной статьи.
Настройка стека ELK
Полную инструкцию по установке Kibana и Elasticsearch можно найти в руководстве по развертыванию стека ELK, в этой статье мы не будем затрагивать эту тему. Для безопасного функционирования Kibana и Elasticsearch, которое обеспечивает невозможность получения неавторизованного доступа к этим службам извне, требуется обеспечить правильные значения для ряда параметров конфигурации.
Параметры конфигурации для Kibana
Откроем файл конфигурации Kibana, изменим адрес так, чтобы Kibana была привязана к localhost:
sudo nano /etc/kibana/kibana.yml server.host: "127.0.0.1"
Сохраним файл и перезапустим Kibana:
sudo service kibana restart
Параметры конфигурации для Elasticsearch
Откроем файл конфигурации Elasticsearch, изменим сетевые параметры для службы. Обратите внимание, что когда Elasticsearch работает в кластерном режиме, вы должны осуществить настройку таким образом, чтобы все узлы кластера, по-прежнему, видели друг друга.
sudo nano /etc/elasticsearch/elasticsearch.yml network.host: "127.0.0.1"
Сохраним файл и перезапустим Elasticsearch:
sudo service elasticsearch restart
Теперь получить доступ к Kibana и Elasticsearch с удаленных узлов невозможно, однако, с локального узла доступ предоставляется:
http://localhost:5601/
Установка и настройка Nginx с поддержкой аутентификации
Для реализации аутентификации, будем использовать Nginx:
sudo apt-get install -y nginx
Установим пакет apache2-utils
, который содержит утилиту, предназначенную для генерации учетных записей, используемых в базовой аутентификации:
sudo apt-get install -y apache2-utils
Создадим учетную запись пользователя, которая будет использоваться для базовой аутентификации:
sudo htpasswd -c /etc/nginx/htpasswd.elk kibanauser
После нажатия кнопки ввода система предложит нам ввести и подтвердить пароль для пользователя.
New password: Re-type new password: Adding password for user kibanauser
Далее создадим файл конфигурации Nginx:
sudo nano /etc/nginx/conf.d/elk.conf
Зададим следующие настройки:
worker_processes 1; events { worker_connections 1024; } http { upstream elasticsearch { server 127.0.0.1:9200; keepalive 15; } upstream kibana { server 127.0.0.1:5601; keepalive 15; } server { listen 8881; location / { auth_basic "Restricted Access"; auth_basic_user_file /etc/nginx/htpasswd.elk; proxy_pass http://elasticsearch; proxy_redirect off; proxy_buffering off; proxy_http_version 1.1; proxy_set_header Connection "Keep-Alive"; proxy_set_header Proxy-Connection "Keep-Alive"; } } server { listen 8882; location / { auth_basic "Restricted Access"; auth_basic_user_file /etc/nginx/htpasswd.elk; proxy_pass http://kibana; proxy_redirect off; proxy_buffering off; proxy_http_version 1.1; proxy_set_header Connection "Keep-Alive"; proxy_set_header Proxy-Connection "Keep-Alive"; } } }
Nginx будет слушать порт 8881 для установки соединений с Elasticsearch и порт 8882 для соединений с Kibana, используя базовую аутентификацию HTTP для учетных записей, которые мы сгенерировали с помощью htpasswd
.
Соединение со службами Elasticsearch и Kibana с поддержкой аутентификации можно установить с любого адреса. Если вы хотите ограничить адреса, с которых пользователи могут устанавливать соедениения, обратитесь к нашей статье на эту тему. Перезапустите Nginx для применения настроек:
sudo nginx -t && sudo service nginx restart
Проверка работы аутентификации
Elasticsearch и Kibana теперь защищены с помощью мехатизма базовой аутентификации HTTP. Проверим это с помощью команды cURL.
Elasticsearch
curl --verbose http://kibanauser:1234@127.0.0.1:8881
Должен вернуться следующий вывод:
* Rebuilt URL to: http://kibanauser:1234@127.0.0.1:8881/ * Trying 127.0.0.1... * Connected to 127.0.0.1 (127.0.0.1) port 8881 (#0) * Server auth using Basic with user 'kibanauser' > GET / HTTP/1.1 > Host: 127.0.0.1:8881 > Authorization: Basic a2liYW5hdXNlcjoxMjM0 > User-Agent: curl/7.47.0 > Accept: */* > < HTTP/1.1 200 OK < Server: nginx/1.10.3 (Ubuntu) < Date: Sun, 10 Feb 2019 11:14:13 GMT < Content-Type: application/json; charset=UTF-8 < Content-Length: 493 < Connection: keep-alive < { "name" : "9qenDRz", "cluster_name" : "elasticsearch", "cluster_uuid" : "rbfDdSWaRmyrh9kOSVNwyg", "version" : { "number" : "6.6.0", "build_flavor" : "default", "build_type" : "deb", "build_hash" : "a9861f4", "build_date" : "2019-01-24T11:27:09.439740Z", "build_snapshot" : false, "lucene_version" : "7.6.0", "minimum_wire_compatibility_version" : "5.6.0", "minimum_index_compatibility_version" : "5.0.0" }, "tagline" : "You Know, for Search" } * Connection #0 to host 127.0.0.1 left intact
Kibana
curl --verbose http://kibanauser:1234@127.0.0.1:8882
Должен вернуться следующий вывод:
* Rebuilt URL to: http://kibanauser:1234@127.0.0.1:8882/ * Trying 127.0.0.1... * Connected to 127.0.0.1 (127.0.0.1) port 8882 (#0) * Server auth using Basic with user 'kibanauser' > GET / HTTP/1.1 > Host: 127.0.0.1:8882 > Authorization: Basic a2liYW5hdXNlcjoxMjM0 > User-Agent: curl/7.47.0 > Accept: */* > < HTTP/1.1 302 Found < Server: nginx/1.10.3 (Ubuntu) < Date: Sun, 10 Feb 2019 11:15:43 GMT < Content-Type: text/html; charset=utf-8 < Content-Length: 0 < Connection: keep-alive < location: /app/kibana < kbn-name: kibana < kbn-xpack-sig: 4081d734fcd0e7d12f32aeb71f111a2d < cache-control: no-cache < * Connection #0 to host 127.0.0.1 left intact
При открытии браузера по адресу http://website:8882
будет отображено диалоговое окно аутентификации:
Введите имя пользователя и заданный при настройке пароль, на экране отобразится Kibana.
Заключение
Как часто бывает в проектах с открытым исходным кодом, в стеке ELK некоторые компоненты не реализованы, а должны обеспечиваться внешними службами. Одним из таких компонентов является компонент аутентификации. Использование Nginx в качестве обратного прокси-сервера позволяет обеспечить защиту служб Elasticsearch и Kibana от доступа неавторизованных пользователей.
Для полноценной настройки защиты ELK с помощью Nginx необходимо включить протокол HTTPS с использованием корректного сертификата SSL:
Установка балансирующего прокси-сервера Nginx в CentOS 7 с поддержкой SSL и сертификатом Let’s Encrypt
Установка балансирующего прокси-сервера Nginx в Debian 9 с поддержкой SSL и сертификатом Let’s Encrypt
Установка балансирующего прокси-сервера Nginx в Ubuntu 18.04 с поддержкой SSL и сертификатом Let’s Encrypt