Спустя несколько лет использования ELK стека пришёл к вот такой схеме небольшого кластера.
- ELK01 — Elasticsearch (Data+Master), Logstash
- ELK02 — Elasticsearch (Data+Master), Logstash
- ELK03 — Elasticsearch (Master Voiting), Kibana
Плюс недавно сюда еще добавился сервер с filebeat, через который я прогоняю логи с Cisco ASA, т.к. в новых версиях именно в него добавили функционал парсинга. Но об этом в отдельном посте.
В качестве ОС я как всегда использую Centos 8 в минимальной конфигурации. Основные первоначальные настройки опущу, так же не забывайте про настройки firewall и права на каталоги/файлы.
Для работы Elasticsearch и Logstash нужна Java. Свежие версии полностью совместимы с редакцией 11 (ранее использовалась 8-я версия).
Java SE Development Kit 11.0.8 скачаем с офф сайта. Установим и проверим всех 3х наших нодах.
dnf install jdk-11.0.8_linux-x64_bin.rpm java -version
На всякий случай я оставил задел для Open Distro, это такой open source аналог X-Pack, только от Amazon и соответственно бесплатно. По факту сейчас бесплатная Basic лицензия X-Pack покрывает мои запросы в части безопасности, но не хватает полноценных уведомлений через Kibana.
Поэтому смотрим совместимость версий Open Distro и Elasticsearch. На момент написание статьи мне подойдет версия 7.9.1.
В моей конфигурации elk01 и elk02 это по настройкам и техническим данным (4Cpu,16Gb Ram) два идентичных сервера, поэтому дальше описаны их настройки.
Настройка ELK01 и ELK02
Сперва создадим место под хранение логов. В качестве хранилища я использую отдельный диск, который монтирую в /opt. Так его если что проще расширить и обслужить.
fdisk -l
У меня новый диск это /dev/sdb на 2Tb, на нём и создадим раздел.
fdisk /dev/sdb
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-4294967295, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-4294967294, default 4294967294):
Created a new partition 1 of type 'Linux' and of size 2 TiB.
Command (m for help): w
fdisk -l /dev/sdb
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 4294967294 4294965247 2T 83 Linux
В качестве файловой системы я выбираю EXT4. Со стороны Elastic особых рекомендаций к FS не видел.
mkfs -t ext4 /dev/sdb1
Примонтируем новый диск.
mount -t ext4 /dev/sdb1 /opt
Пропишем его в /etc/fstab для автоматического монтирования после перезагрузок и заодно отключим Swap раздел (закомментив строку).
#/dev/mapper/cl-swap swap swap defaults 0 0
/dev/sdb1 /opt ext4 defaults 0 0
Создадим каталог для данных Elasticsearch.
mkdir /opt/elasticsearch chown elasticsearch:elasticsearch /opt/elasticsearch
Установка и настройка Elasticsearch.
Добавим репозиторий Elasticsearch, создав файл /etc/yum.repos.d/elasticsearch.repo с содержимым:
[elasticsearch]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md
И добавим ключ.
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
Проверим, какие версии доступны и найдём желаемую нами 7.9.1
dnf --showduplicates --enablerepo=elasticsearch list elasticsearch
Её и установим.
dnf install --enablerepo=elasticsearch elasticsearch-7.9.1-1
Настроим конфиг Elasticsearch. По сравнению с версией 6 некоторые параметры были убраны, а некоторые переименованы. Вот пример моего /etc/elasticsearch/elasticsearch.yml
cluster.name: elk.comp.ru
node.name: elk01.comp.ru
path.data: /opt/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: elk01.comp.ru
http.port: 9200
discovery.seed_hosts: ["elk02.comp.ru", "elk03.comp.ru"]
cluster.initial_master_nodes: ["elk01.comp.ru"] #на elk02 этот параметр не нужен и запуск кластера начинаем с elk01. После запуска кластера и на elk01 можно закомментить эту строку
node.roles: [ data, master, ingest
]
Отредактируем /etc/elasticsearch/jvm.options. Выделим больше памяти xms и xmx. Эти параметры должны быть равны примерно 50% от всего объёма RAM и не больше 32Гб.
В моём случае (16Гб RAM) это:
-Xms8g
-Xmx8g
Раскомментируем несколько строк в /etc/sysconfig/elasticsearch. Что бы ОС не блокировала открытие множество файлов и что бы Elasticsearch мог под себя резервировать память.
MAX_OPEN_FILES=65535
MAX_LOCKED_MEMORY=unlimited
И добавим строку в /usr/lib/systemd/system/elasticsearch.service
LimitMEMLOCK=infinity
И обновим службы
systemctl daemon-reload
Безопасность ELK.
Для защиты нашего кластера будем использовать компонент X-Pack, для чего нам потребуется создать ряд сертификатов и настроить учетные записи.
Сперва настроим CA, а точнее выпустим сертификат, которым будем подписывать остальные.
/usr/share/elasticsearch/bin/elasticsearch-certutil ca --pem
Заполнив необходимые поля на выходе получим zip архив с ключом и CA сертификатом. CA сертификат нам пригодится и на других хостах в конфигах logstash и kibana. Так что копируем его. Так же на сертификаты не забывайте давать права соответствующим сервисам.
unzip /usr/share/elasticsearch/elastic-stack-ca.zip
Сразу же можно сгенерировать сертификаты для наших трёх нод. Для этого выполним команду:
/usr/share/elasticsearch/bin/elasticsearch-certutil cert --ca-cert /usr/share/elasticsearch/ca/ca.crt --ca-key /usr/share/elasticsearch/ca/ca.key
В итоге у меня получилось 3 контейнера: elk01.p12, elk02.p12, elk03.p12. Второй и третий раскидываем по соответствующим хостам в каталог elasticsearch.
Так же нам нужно на каждом хосте добавить пароли от соответствующих сертификатов в keystore.
/usr/share/elasticsearch/bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password /usr/share/elasticsearch/bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
Далее нам нужно создать сертификат для https подключения к elasticsearch:
/usr/share/elasticsearch/bin/elasticsearch-certutil http
В процессе ответов на вопросы указываем сертификат нашего CA и перечисляем все наши хосты. В итоге снова получаем архив, который распаковываем:
unzip /usr/share/elasticsearch/elasticsearch-ssl-http.zip
И контейнер http.p12 копируем в корень каталога elasticsearch на всех хостах.
После всех манипуляций с сертификатами допишем блок относящийся к X-Pack в конфигурационный файл elasticsearch.yml
# X-PACK
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elk01.p12
xpack.security.transport.ssl.truststore.path: elk01.p12
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.keystore.path: http.p12
xpack.license.self_generated.type:
basic
И запустим Elasticsearch.
systemctl enable elasticsearch.service systemctl start elasticsearch.service
Теперь сгенерируем базовые учетные записи.
/usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive -u "https://elk01.comp.ru:9200"
Если всё получилось и в логах нет ошибок, то запускаем Elasticsearch на втором хосте и проверяем, что всё ок.
curl -k -XGET 'https://elk01.comp.ru:9200/_cat/node' -u elastic
Установка logstash.
Добавим репозиторий logstash — /etc/yum.repos.d/logstash.repo
[logstash-7.x]
name=Elastic repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
Как и с elasticsearch установим версию 7.9.1
dnf install logstash-7.9.1-1
Особо logstash настраивать не нужно, не забывайте только в блоке output задавать параметры учетных записей и работу по https.
Настройка третьего хоста — ELK03.
На этом хосте я не храню данные и использую его как ноду голосования elasticsearch, ну и конечно же как kibana. Соответственно logstash не ставим. А в конфиге Elasticsearch настраиваем такие роли:
node.roles: [ master, voting_only ]
В остальном же настройки по хосту и эластику остаются такими же.
Установка Kibana.
Добавим репозиторий — /etc/yum.repos.d/kibana.repo
[kibana-7.x]
name=Kibana repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
Установим kibana 7.9.1 и прокси в виде nginx перед ним.
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch dnf install kibana-7.9.1-1 nginx httpd-tools
Внесём правки в конфиг Kibana — /etc/kibana/kibana.yml
server.port: 5601
server.host: "elk03.comp.ru"
server.name: "My ELK"
elasticsearch.hosts: ["https://elk03.comp.ru:9200", "https://elk02.comp.ru:9200", "https://elk01.comp.ru:9200"]
kibana.index: ".kibana"
xpack.security.enabled: true
elasticsearch.ssl.certificateAuthorities: [ "/etc/kibana/elasticsearch-ca.pem" ]
И создадим конфиг файл для Nginx — /etc/nginx/conf.d/web-elk.comp.ru.conf
server {
listen 443 default_server ssl;
server_name elk03.comp.ru;
ssl_certificate /etc/nginx/ssl/web-elk.cer;
ssl_certificate_key /etc/nginx/ssl/web-elk.key;
location / {
proxy_pass http://elk03.comp.ru:5601;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
}
}
systemctl enable kibana.service systemctl start kibana.service systemctl enable nginx.service systemctl start nginx.service