Thank you for reading this post, don't forget to subscribe!
Elasticsearch предоставляет механизм поиска, Kibana — веб-интерфейс для работы с Elasticsearch, Logstash — инструмент для сбора логов и их передачи в Elasticsearch. Таким образом, связка Elasticsearch + Kibana + Logstash (или ELK Stack) является инструментом по сбору и хранению журналов операционных систем
Подготовка сервера
Прежде чем начать, подготовим к установке и настройке наш сервер.
1. Обновление кэша apt
Для корректной установки пакетов, обновляем списки командой:
apt update
На новом сервере, где не запущено никаких важных сервисов также рекомендуется обновить пакеты:
apt upgrade
2. Выбор способа установки ELK
Мы рассмотрим два способа установки программных продуктов стека ELK — из официального репозитория и с помощью deb-файла.
а) Для работы с репозиторием.
Данный способ является предпочтительным. Он удобнее и быстрее в работе.
Импортируем GPG-ключ для репозитория:
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
Устанавливаем пакет:
apt install apt-transport-https
Создаем файл:
vi /etc/apt/sources.list.d/elastic-8.x.list
1 |
deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main |
Выполним обновление кэша для добавленного репозитория:
apt-get update -o Dir::Etc::sourcelist="/etc/apt/sources.list.d/elastic-8.x.list"
б) Для загрузки файлов deb.
Данный способ подойдет, если для нашего IP-адреса заблокирован доступ к репозиторию ELK. В этом случае можно скачать установочный файл с использованием VPN или прокси.
Ну, или такой способ нам просто больше нравится — тогда при наличие доступа для загрузки с сайта ELK нам понадобится утилита для загрузки файлов — ставим ее на сервер:
apt install wget
3. Настройка брандмауэра
Открываем порты для работы ELK:
iptables -I INPUT -p tcp --dport 5044 -j ACCEPT
iptables -I INPUT -p tcp --dport 5601 -j ACCEPT
где:
- 5044 — порт, на котором слушаем Logstash.
- 5601 — Kibana.
Для сохранения правил используем утилиту iptables-persistent:
apt install iptables-persistent
netfilter-persistent save
Установка Java
Все программные продукты стека ELK разработаны на Java, поэтому не будут работать без соответствующей платформы на сервере. Для этого мы установим пакет openjava:
apt install default-jdk
После окончания установки можно ввести команду:
java -version
Она должна вернуть, примерно, следующее:
1 2 3 |
openjdk version "11.0.15" 2022-04-19 OpenJDK Runtime Environment (build 11.0.15+10-Ubuntu-0ubuntu0.20.04.1) OpenJDK 64-Bit Server VM (build 11.0.15+10-Ubuntu-0ubuntu0.20.04.1, mixed mode, sharing) |
Elasticsearch
Рассмотрим установку двумя способами.
а) Используем репозиторий
Вводим команду:
apt install elasticsearch
б) Deb-файл
Переходим на страницу загрузки эластика и скачиваем DEB-пакет или копируем на него ссылку:
Переносим файл на севрер или загружаем его на сервере с использованием скопированной ссылки:
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.2.3-amd64.deb
* в моем случае была версия 8.2.3.
После устанавливаем эластик на наш сервер:
dpkg -i elasticsearch-*.deb
После установки
По завершении инсталляции мы должны увидеть сообщение:
1 2 3 4 5 |
----------------- Security autoconfiguration information -------------------- ... The generated password for the elastic built-in superuser is : MFVg1a6NpglV69yci_rr ... ----------------------------------------------------------------------------- |
* где MFVg1a6NpglV69yci_rr — пароль для пользователя elastic. Его записываем — он нам пригодится позже.
Если мы захотим сменить данный пароль, вводим:
/usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic
Разрешаем автозапуск сервиса и запускаем его:
systemctl enable elasticsearch --now
Проверяем работоспособность сервиса:
curl -k -u elastic:MFVg1a6NpglV69yci_rr https://localhost:9200
* где elastic:MFVg1a6NpglV69yci_rr — логин elastic и пароль, который мы получили после установки.
Мы должны увидеть что-то на подобие:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
{ "name" : "elk", "cluster_name" : "elasticsearch", "cluster_uuid" : "uZQ6-MAqThyLq3OJgU5-fQ", "version" : { "number" : "8.2.3", "build_flavor" : "default", "build_type" : "deb", "build_hash" : "9905bfb62a3f0b044948376b4f607f70a8a151b4", "build_date" : "2022-06-08T22:21:36.455508792Z", "build_snapshot" : false, "lucene_version" : "9.1.0", "minimum_wire_compatibility_version" : "7.17.0", "minimum_index_compatibility_version" : "7.0.0" }, "tagline" : "You Know, for Search" } |
Идем дальше.
Kibana
Также как и с Elasticsearch, рассмотрим установку двумя способами.
а) Используем репозиторий
Вводим команду:
apt install kibana
б) Deb-файл
Переходим на страницу загрузки Kibana и скачиваем ссылку на последнюю вервию пакета DEB:
На компьютере с доступом к сайту ELK скачиваем по ней пакет для установки kibana:
wget https://artifacts.elastic.co/downloads/kibana/kibana-8.2.3-amd64.deb
Или в браузере. После переносим пакет на целевой сервер и устанавливаем приложение:
dpkg -i kibana-*.deb
После установки
Открываем на редактирование конфигурационный файл:
vi /etc/kibana/kibana.yml
Редактируем параметр host:
server.host: 192.168.1.10
* в данном примере мы говорим, что сервер должен слушать на интерфейсе 192.168.1.10.
Разрешаем автозапуск Kibana и перезапускаем ее:
systemctl enable kibana
systemctl restart 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
Отдельно рассмотрим установку из репозитория, с использованием файла deb и настройку.
а) Используем репозиторий
Вводим команду:
apt install logstash
б) Deb-файл
Процесс установки Logstash аналогичен — переходим на страницу загрузки программного продукта, копируем ссылку на пакет DEB:
Скачиваем пакет на нашем сервере (или другом компьютере и переносим на сервер):
wget https://artifacts.elastic.co/downloads/logstash/logstash-8.2.3-amd64.deb
… и устанавливаем его:
dpkg -i logstash-*.deb
Настройка Logstash
Разрешаем автозапуск и стартуем сервис:
systemctl enable logstash
systemctl start logstash
Настройки для логстэша хранятся в каталоге /etc/logstash/conf.d в файлах формата JSON. Для конфигурации используются следующие секции:
- input (входные данные).
- filter (фильтры).
- output (выходные данные).
Для каждой из них мы создадим свой файл.
vi /etc/logstash/conf.d/input.conf
1 2 3 4 5 |
input { beats { port => 5044 } } |
* в данном примере мы настроили logstash для приема логов на порту 5044.
vi /etc/logstash/conf.d/filter.conf
1 2 3 4 5 6 7 8 9 10 11 12 |
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
1 2 3 4 5 6 7 8 9 10 11 |
output { elasticsearch { hosts => ["https://localhost:9200"] ssl => true ssl_certificate_verification => false manage_template => false index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}" user => elastic password => "MFVg1a6NpglV69yci_rr" } } |
Проверить конфигурацию можно командой:
/usr/share/logstash/bin/logstash --path.settings /etc/logstash -t
Мы должны увидеть:
Configuration OK
Перезапускаем сервис 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
Также как и серверная часть, клиент может быть установлен из репозитория или путем загрузки файла. Мы рассмотрим оба варианта.
а) Используем репозиторий
Настраиваем репозиторий. Для этого импортируем ключ GPG:
rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
Создаем файл:
vi /etc/yum.repos.d/elastic-8.x.repo
1 2 3 4 5 6 7 8 |
[elastic-8.x] name=Elastic repository for 8.x packages baseurl=https://artifacts.elastic.co/packages/8.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md |
Устанавливаем filebeat:
yum install filebeat
б) RPM-файл
Инструкция подходит для CentOS / Red Hat / Fedora. Переходим на страницу загрузки Filebeat — копируем ссылку на установочный пакет:
Используя скопированную ссылку, скачиваем пакет на сервере:
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.2.3-x86_64.rpm
* если система вернет ошибку, устанавливаем wget командой yum install wget
После устанавливаем пакет:
rpm -ivh filebeat-*.rpm
Установка на Linux Ubuntu
Также как и серверная часть, клиент может быть установлен из репозитория или путем загрузки файла. Мы рассмотрим оба варианта.
а) Используем репозиторий
Настраиваем репозиторий (на сервере это мы уже сделали). Для этого импортируем ключ GPG:
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
Создаем файл:
vi /etc/apt/sources.list.d/elastic-8.x.list
1 |
deb https://artifacts.elastic.co/packages/8.x/apt stable main |
Обновляем кэш пакетов:
apt update
Устанавливаем filebeat:
apt install filebeat
б) Deb-файл
Инструкция подходит для Ubuntu / Debian. Переходим на страницу загрузки Filebeat — копируем ссылку на установочный пакет:
Используя скопированную ссылку, скачиваем пакет на компьютер:
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.2.3-amd64.deb
После устанавливаем пакет:
dpkg -i filebeat-*.deb
Настройка после установки
Открываем конфигурационный файл для filebeat:
vi /etc/filebeat/filebeat.yml
Находим раздел filebeat.inputs, в нем «type: log». Нам интересны две опции — enabled и paths:
1 2 3 4 5 6 7 8 9 10 |
... enabled: true ... paths: - /var/log/*.log #- c:\programdata\elasticsearch\logs\* - /var/log/secure - /var/log/messages - /var/log/syslog ... |
* в данном примере мы включили опцию сбора лога (enabled: true) и добавили отправку логов безопасности (/var/log/secure) и системных событий (/var/log/messages, /var/log/systemd).
Находим опцию output.elasticsearch и комментируем 2 строки:
1 2 3 |
#output.elasticsearch: # Array of hosts to connect to. # hosts: ["localhost:9200"] |
* так как мы собираемся отправлять логи через Logstash, нам они будут мешать.
Находим настройку отправки лога в Logstash и снимаем комментарии, меняем адрес сервера logstash и добавляем строки с template — должно получиться:
1 2 3 4 5 6 |
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 restart filebeat
Просмотр логов в Kibana
Открываем наш веб-интерфейс с кибаной. Вводим логин elastic и пароль, который мы получили с помощью команды elasticsearch-reset-password (в нашем примере, MFVg1a6NpglV69yci_rr).
Кликаем по символу меню - в разделе Analytics переходим в Discover:
Мы должны увидеть логи с нашего компьютера:
Наш ELK настроен и работает.
Отправка логов с помощью Rsyslog
Rsyslog является часто встречаемой утилитой для отправки журналов по сети на сервер логов. Сам по себе Rsyslog может выступать как отправителем, так и приемником. Мы же рассмотрим вариант его настройки для отправки логов в Logstash.
На клиенте создаем конфигурационный файл для описания шаблона лога:
vi /etc/rsyslog.d/json-template.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 |
template(name="json-template" type="list") { constant(value="{") constant(value="\"@timestamp\":\"") property(name="timereported" dateFormat="rfc3339") constant(value="\",\"@version\":\"1") constant(value="\",\"message\":\"") property(name="msg" format="json") constant(value="\",\"sysloghost\":\"") property(name="hostname") constant(value="\",\"severity\":\"") property(name="syslogseverity-text") constant(value="\",\"facility\":\"") property(name="syslogfacility-text") constant(value="\",\"programname\":\"") property(name="programname") constant(value="\",\"procid\":\"") property(name="procid") constant(value="\"}\n") } |
Создаем конфигурационный файл для отправки логов на logstash:
vi /etc/rsyslog.d/logstash.conf
1 |
*.* @@192.168.1.10:5045;json-template |
* где:
- * — источник логов. В нашем примере это все логи.
- .* — описание важности логов. В нашем примере все уровни.
- @@ — используем TCP-протокол. Одним символом @ означал бы UPD-протокол.
- 192.168.1.10 — имя или адрес нашего сервера, куда необходимо отправлять логи.
- 5045 — порт, на котором сервер примет логи. В нашем примере это новый порт Logstash, который мы настроим ниже.
- json-template — указывает на шаблон, который мы должны использовать. Данный формат требуется использовать для работы с ELK.
Перезапускаем сервис:
systemctl restart rsyslog
На сервере откроем файл:
vi /etc/logstash/conf.d/input.conf
Допишем:
1 2 3 4 5 6 7 |
... tcp { port => 5045 codec => "json" type => "rsyslog" } ... |
После открываем файл:
vi /etc/logstash/conf.d/output.conf
И дописываем правило выше предыдущего:
1 2 3 4 5 6 7 8 9 10 11 |
output { if [type] == "rsyslog" { elasticsearch { hosts => [ "https://localhost:9200" ] ssl => true ssl_certificate_verification => false user => elastic password => "MFVg1a6NpglV69yci_rr" } } ... |
* в нашем примере мы логи с типом rsyslog без индекса отправляем в Elasticsearch.
Перезапускаем logstash:
systemctl restart logstash
Если на нашем сервере используется брандмауэр, открываем порт 5045:
iptables -I INPUT -p tcp --dport 5045 -j ACCEPT
Готово. Немного ждем и проверяем логи в Kibana. Чтобы обеспечить большой поток логов для проверки, клиента с Rsyslog можно перезагрузить.