Elasticsearch + Kibana + Logstash на CentOS
Если в двух словах, Elasticsearch предоставляет механизм хранения данных и их поиска, Kibana — веб-интерфейс для работы с данными, хранящимися в Elasticsearch, Logstash — инструмент для преобразования полученных от агента логов и их передачи в Elasticsearch. Таким образом, связка Elasticsearch + Kibana + Logstash (или ELK Stack) является инструментом по получению и хранению журналов. При этом поддерживаются разные платформы (Windows, Linux, BSD).
В данной инструкции мы рассмотрим пример установки серверной части ELK на Linux CentOS. Также мы настроим сбор логов с помощью Filebeat в CentOS, Ubuntu, Windows.
Готовим сервер
Устанавливаем Java
Elasticsearch
Kibana
Logstash
Устанавливаем и настраиваем клиента
Linux CentOS
Linux Ubuntu
Windows
Настройка после установки
Использование Kibana для просмотра логов
Удаление старых логов
Подготовка сервера
Прежде чем начать, подготовим к установке и настройке наш сервер.
1. Установка wget
В процессе установки пакетов нам понадобиться скачивать установочные файлы. Для этого в системе должен быть установлен wget:
yum install wget
2. Настройка брандмауэра
Открываем порты для работы ELK:
firewall-cmd --permanent --add-port={5044,5601}/tcp
firewall-cmd --reload
где:
- 5044 — порт, на котором слушаем Logstash.
- 5601 — Kibana.
3. SELinux
Отключаем SELinux двумя командами:
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
* первая команда выключит систему безопасности до перезагрузки сервера, вторая — навсегда.
Установка Java
Все программные продукты стека ELK разработаны на Java, поэтому не будут работать без соответствующей платформы на сервере.
Выполним установку LTS-версии openjdk:
yum install java-11-openjdk
Проверяем:
java --version
Мы должны увидеть что-то на подобие:
openjdk 11.0.20 2023-07-18 LTS
OpenJDK Runtime Environment (Red_Hat-11.0.20.0.8-1.el7_9) (build 11.0.20+8-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-11.0.20.0.8-1.el7_9) (build 11.0.20+8-LTS, mixed mode, sharing)
Подробнее процесс описан на странице Установка OpenJDK на Linux.
Elasticsearch
Переходим на страницу загрузки эластика и копируем ссылку на последнюю версию пакета RPM:
... и скачиваем по ней сам пакет:
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.9.1-x86_64.rpm
* в моем случае была версия 8.9.1.
Мы можем получить ошибку ERROR 403: Forbidden, так как загрузка файлов с официального сайта для российский IP-адресов может быть заблокирована. Используем VPN, прокси или браузер Tor.
После устанавливаем эластик на наш сервер:
rpm -ivh elasticsearch-*.rpm
По завершении инсталляции мы должны были увидеть сообщение типа:
----------------- Security autoconfiguration information --------------------
...
The generated password for the elastic built-in superuser is : qVeTdew73OFkaZn_VCwp
...
-----------------------------------------------------------------------------
* где qVeTdew73OFkaZn_VCwp — пароль для пользователя elastic. Его записываем — он нам пригодится позже.
Если мы захотим сменить данный пароль, вводим:
/usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic
Разрешаем автозапуск сервиса и запускаем его:
systemctl enable elasticsearch --now
Проверяем работоспособность сервиса:
curl -k -u elastic:qVeTdew73OFkaZn_VCwp https://localhost:9200
* где elastic:qVeTdew73OFkaZn_VCwp — логин elastic и пароль, который мы получили после установки.
Мы должны увидеть что-то на подобие:
{
"name" : "monitoring",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "ddE_7u9zRBGvufj1Wgdjvw",
"version" : {
"number" : "8.9.1",
"build_flavor" : "default",
"build_type" : "rpm",
"build_hash" : "a813d015ef1826148d9d389bd1c0d781c6e349f0",
"build_date" : "2023-08-10T05:02:32.517455352Z",
"build_snapshot" : false,
"lucene_version" : "9.7.0",
"minimum_wire_compatibility_version" : "7.17.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "You Know, for Search"
}
Идем дальше.
Kibana
Переходим на страницу загрузки Kibana и копируем ссылку на последнюю вервию пакета RPM:
Скачиваем по ней пакет для установки kibana:
wget https://artifacts.elastic.co/downloads/kibana/kibana-8.9.1-x86_64.rpm
Устанавливаем приложение:
rpm -ivh kibana-*.rpm
Открываем на редактирование конфигурационный файл:
vi /etc/kibana/kibana.yml
Редактируем параметр host:
server.host: 192.168.1.10
* в данном примере мы говорим, что сервер должен слушать на интерфейсе 192.168.1.10.
Разрешаем автозапуск Kibana и запускаем ее:
systemctl enable kibana
systemctl start kibana
Открываем браузер и переходим по ссылке http://<IP-адрес сервера>:5601. Мы должны увидеть форму ввода токена.
Переходим на сервер и вводим команду для получения токена:
/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana
На экране отобразится последовательность из символов — копируем ее и вставляем в Kibana. Кликаем по Configure Elastic:
Откроется окно с вводом проверочного кода. Возвращаемся на сервер и вводим команду:
/usr/share/kibana/bin/kibana-verification-code
Мы получим 6-ти значный код. Вводим его в окне Kibana:
Нажимаем Verify — начнется процесс настройки. После его завершения мы увидим окно ввода логина и пароля. На этом пока останавливаемся и переходим к настройке Logstash.
Logstash
Процесс установки Logstash аналогичен — переходим на страницу загрузки программного продукта, копируем ссылку на пакет RPM:
Скачиваем пакет на нашем сервере:
wget https://artifacts.elastic.co/downloads/logstash/logstash-8.9.1-x86_64.rpm
... и устанавливаем его:
rpm -ivh logstash-*.rpm
Разрешаем автозапуск и стартуем сервис:
systemctl enable logstash
systemctl start logstash
Настройка Logstash
Настройки для логстэша хранятся в каталоге /etc/logstash/conf.d в файлах формата JSON. Для конфигурации используются следующие секции:
- input (входные данные).
- filter (фильтры).
- output (выходные данные).
Для каждой из них мы создадим свой файл.
vi /etc/logstash/conf.d/input.conf
input {
beats {
port => 5044
}
}
* в данном примере мы настроили logstash для приема логов на порту 5044.
vi /etc/logstash/conf.d/filter.conf
filter {
if [type] == "syslog" {
grok {
match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
add_field => [ "received_at", "%{@timestamp}" ]
add_field => [ "received_from", "%{host}" ]
}
date {
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
}
}
vi /etc/logstash/conf.d/output.conf
output {
elasticsearch { hosts => ["localhost:9200"]
hosts => "localhost:9200"
manage_template => false
index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
document_type => "%{[@metadata][type]}"
}
}
Перезапускаем сервис logstash:
systemctl restart logstash
Немного подождем — приложению нужно около 1 минуты, чтобы запуститься. После, введя команду:
ss -tunlp | grep 5044
... мы увидим что-то на подобие:
tcp LISTEN 0 128 :::5044 :::* users:(("java",pid=11745,fd=114))
Сервис запустился и готов принимать логи.
Установка и настройка клиента
Для отправки логов на сервер, мы будем использовать пакет Filebeat. Он поддерживается для различных систем — Linux, Windows, Mac. Мы разберем процедуру установки и настройки для первых двух.
Установка на Linux CentOS
Инструкция подходит для CentOS / Red Hat / Fedora. Переходим на страницу загрузки Filebeat — копируем ссылку на установочный пакет:
Используя скопированную ссылку, скачиваем пакет на сервере:
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.9.1-x86_64.rpm
Если система вернет ошибку, устанавливаем wget командой:
yum install wget
После устанавливаем пакет:
rpm -ivh filebeat-*.rpm
Установка на Linux Ubuntu
Инструкция подходит для Ubuntu / Debian. Переходим на страницу загрузки Filebeat — копируем ссылку на установочный пакет:
Используя скопированную ссылку, скачиваем пакет на сервере:
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.9.1-amd64.deb
После устанавливаем пакет:
dpkg -i filebeat-*.deb
Установка на Windows
Переходим на страницу загрузки Filebeat — скачиваем архив для Windows:
Распаковываем его в папку C:\Program Files (где C: — диск, на котором установлена система).
Открываем Powershell и вводим команду:
set-executionpolicy unrestricted
На запрос «Вы хотите изменить политику выполнения?» отвечаем утвердительно:
(значением по умолчанию является "N"):Y
Переходим в каталог с Filebeat:
cd "C:\Program Files\Filebeat\"
... и запускаем скрипт установки сервиса:
.\install-service-filebeat.ps1
Настройка после установки
Открываем конфигурационный файл для filebeat.
а) в Linux
vi /etc/filebeat/filebeat.yml
б) в Windows открываем файл filebeat.yml любым текстовым редактором (сам файл находится в каталоге, который мы распаковали скаченный архив).
Находим раздел filebeat.inputs, в нем «type: log». Нам интересны две опции — enabled и paths:
...
enabled: true
...
paths:
- /var/log/*.log
#- c:\programdata\elasticsearch\logs\*
- /var/log/secure
- /var/log/messages
...
* в данном примере мы включили опцию сбора лога (enabled: true) и добавили отправку логов безопасности (/var/log/secure) и системных событий (/var/log/messages).
* для Windows пути будут другие, например, C:\Windows\*.log
Находим опцию output.elasticsearch и комментируем 2 строки:
#output.elasticsearch:
# Array of hosts to connect to.
# hosts: ["localhost:9200"]
* так как мы собираемся отправлять логи через Logstash, нам они будут мешать.
Находим настройку отправки лога в Logstash и снимаем комментарии, меняем адрес сервера logstash и добавляем строки с template — должно получиться:
output.logstash:
# The Logstash hosts
hosts: ["192.168.1.10:5044"]
template.name: "filebeat"
template.path: "filebeat.template.json"
template.overwrite: false
* где 192.168.1.10 — адрес, на котором крутится наш сервер.
Разрешаем автозапуск filebeat и стартуем сервис:
systemctl enable filebeat
systemctl start filebeat
Просмотр логов в Kibana
Открываем наш веб-интерфейс с кибаной. Вводим логин elastic и пароль, который мы получили с помощью команды elasticsearch-reset-password (в нашем примере, qVeTdew73OFkaZn_VCwp).
Кликаем по символу меню - в разделе Analytics переходим в Discover:
В окне справа кликаем по Create Index Pattern:
В строке ввода текста вводим filebeat-*:
* filebeat — это значение параметра template.name, которое мы задавали на стадии настройки filebeat.
... и нажимаем Next Step.
В поле «Time field name» выбираем значение @timestamp и нажимаем Create index pattern:
Очистка устаревших данных
Разберем пример удаления логов, которые старше 30 дней. Для этого будем использовать Elasticsearch Curator. Для установки последнего переходим на страницу Curator Reference, выбираем текущую версию программного продукта и кликаем по Installation:
В открывшемся окне переходим на нужную инструкцию по установки (так как у нас CentOS, выбираем YUM Repository):
В открывшемся окне следуем инструкции — в моем случае, версия была 5.8.
Загружаем и устанавливаем публичный gpg-ключ, которым подписаны пакеты добавляемого репозитория:
rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
Создаем файл репозитория:
vi /etc/yum.repos.d/curator.repo
[curator-5]
name=CentOS/RHEL 7 repository for Elasticsearch Curator 5.x packages
baseurl=https://packages.elastic.co/curator/5/centos/7
gpgcheck=1
gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
* на момент написания статьи уже вышла версия CentOS 8, но куратор был только для 7. Вполне возможно, что в ближайшее время появится curator для новой версии операционной системы.
Выполняем установку командой yum:
yum install elasticsearch-curator
После установки куратора, создаем каталог для конфигурационных файлов:
mkdir /etc/curator
Создаем конфигурационный файл config.yml:
vi /etc/curator/config.yml
client:
hosts:
- 127.0.0.1
port: 9200
url_prefix:
use_ssl: False
certificate:
client_cert:
client_key:
ssl_no_validate: False
http_auth:
timeout: 30
master_only: False
* в данном файле нас интересует настройка hosts — мы указали, что curator должен подключаться к elasticsearch на локальном хосте (127.0.0.1) порту 9200.
vi /etc/curator/action.yml
actions:
1:
action: close
description: >-
Close indices older than 30 days (based on index name).
options:
ignore_empty_list: True
delete_aliases: False
disable_action: False
filters:
- filtertype: pattern
kind: prefix
value: filebeat-
- filtertype: age
source: name
direction: older
timestring: '%Y.%m.%d'
unit: days
unit_count: 30
2:
action: delete_indices
description: >-
Delete indices older than 30 days (based on index name).
options:
ignore_empty_list: True
disable_action: False
filters:
- filtertype: pattern
kind: prefix
value: filebeat-
- filtertype: age
source: name
direction: older
timestring: '%Y.%m.%d'
unit: days
unit_count: 30
Запускаем curator для удаления устаревших логов:
curator --config /etc/curator/config.yml /etc/curator/action.yml