ELK 7.9 на Centos 8 или мой кластер сбора логов спустя пару лет

ELK7.9

Спустя несколько лет использования ELK стека пришёл к вот такой схеме небольшого кластера.

  1. ELK01 — Elasticsearch (Data+Master), Logstash
  2. ELK02 — Elasticsearch (Data+Master), Logstash
  3. 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;
    }
}
Сертификат для Nginx я использовал корпоративный.
Ну и стартуем.
systemctl enable kibana.service
systemctl start kibana.service
systemctl enable nginx.service
systemctl start nginx.service
Если всё ок, то должны в браузере по адресу https://web-elk.comp.ru увидеть:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *