
Стек 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