Настройка безопасности стека ELK с помощью Nginx

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