Elasticsearch + Kibana + Logstash на Ubuntu
Используемые термины: Elasticsearch, Ubuntu.
Если в двух словах, Elasticsearch предоставляет механизм поиска, Kibana — веб-интерфейс для работы с Elasticsearch, Logstash — инструмент для сбора логов и их передачи в Elasticsearch. Таким образом, связка Elasticsearch + Kibana + Logstash (или ELK Stack) является инструментом по сбору и хранению журналов операционных систем. При этом поддерживаются разные платформы (Windows, Linux, BSD).
В данной инструкции мы рассмотрим пример установки серверной части ELK версии 8 на Linux Ubuntu. Также мы настроим сбор логов с CentOS и Ubuntu.
Готовим сервер
Устанавливаем Java
Elasticsearch
Kibana
Logstash
Устанавливаем и настраиваем клиента
Linux CentOS
Linux Ubuntu
Настройка после установки
Использование Kibana для просмотра логов
Отправка логов из Rsyslog в Logstash
Пример сбора логов для NGINX
Подготовка сервера
Прежде чем начать, подготовим к установке и настройке наш сервер.
1. Обновление кэша apt
Для корректной установки пакетов, обновляем списки командой:
apt update
На новом сервере, где не запущено никаких важных сервисов также рекомендуется обновить пакеты:
apt upgrade
2. Выбор способа установки ELK
Мы рассмотрим два способа установки программных продуктов стека ELK — из официального репозитория и с помощью deb-файла.
а) Для работы с репозиторием.
Данный способ является предпочтительным. Он удобнее и быстрее в работе.
Импортируем GPG-ключ для репозитория:
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | apt-key add -
Если мы увидим сообщение Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)), то можно добавить ключ командой:
curl -s https://artifacts.elastic.co/GPG-KEY-elasticsearch | gpg --no-default-keyring --keyring gnupg-ring:/etc/apt/trusted.gpg.d/elasticsearch-keyring.gpg --import
Устанавливаем пакет:
apt install apt-transport-https
Создаем файл:
vi /etc/apt/sources.list.d/elastic-8.x.list
deb 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
Она должна вернуть, примерно, следующее:
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
После установки
По завершении инсталляции мы должны увидеть сообщение:
----------------- 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 и пароль, который мы получили после установки.
Мы должны увидеть что-то на подобие:
{
"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
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 => ["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"
}
}
* обратите внимание, что MFVg1a6NpglV69yci_rr — наш пароль для пользователя elastic, который нужно заменить на тот, что был выдан при установке эластика.
Проверить конфигурацию можно командой:
/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
[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
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:
...
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 строки:
#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 restart filebeat
Просмотр логов в Kibana
Открываем наш веб-интерфейс с кибаной. Вводим логин elastic и пароль, который мы получили с помощью команды elasticsearch-reset-password (в нашем примере, MFVg1a6NpglV69yci_rr).
Кликаем по символу меню - в разделе Analytics переходим в Discover:
Мы должны увидеть логи с нашего компьютера:
Наш ELK настроен и работает.
Отправка логов с помощью Rsyslog
Rsyslog является часто встречаемой утилитой для отправки журналов по сети на сервер логов. Сам по себе Rsyslog может выступать как отправителем, так и приемником. Мы же рассмотрим вариант его настройки для отправки логов в Logstash.
На клиенте создаем конфигурационный файл для описания шаблона лога:
vi /etc/rsyslog.d/json-template.conf
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
*.* @@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
Допишем:
...
tcp {
port => 5045
codec => "json"
type => "rsyslog"
}
...
После открываем файл:
vi /etc/logstash/conf.d/output.conf
И дописываем правило выше предыдущего:
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 можно перезагрузить.
Пример сбора логов для NGINX
Рассмотрим реальный пример сбора логов с конкретного приложения. Мы настроим два варианта:
- NGINX -> Filebeat-> Logstash -> Elastic.
- NGINX -> Logstash -> Elastic.
Первый вариант похож на тот, что мы уже рассмотрели, а вот второй позволит нам напрямую отправить лог из nginx в logstash.
С использованием Filebeat
Открываем конфигурационный файл Filebeat:
vi /etc/filebeat/filebeat.yml
В раздел paths добавим путь для сбора логов nginx:
paths:
...
- /var/log/nginx/*.log
* обратите внимание, что путь до логов nginx (/var/log/nginx), которые вы захотите собирать, может быть другим, но данный путь является стандартным.
Перезапускаем filebeat:
systemctl restart filebeat
Делаем несколько запросов к веб-серверу, открываем kibana и вводим в фильтр "nginx":
Отправка логов напрямую в Logstash
Для отправки логов из nginx в logstash мы будем использовать стандарт syslog. Для этого добавим прослушавание в сам logstash:
vi /etc/logstash/conf.d/input.conf
Допишем:
...
syslog {
port => 5140
}
...
* в нашем примере logstash будет принимать логи стандарта syslog на порту 5140.
Перезапускаем logstash:
systemctl restart logstash
Откроем конфигурационный файл nginx:
vi /etc/nginx/nginx.conf
* обратите внимание, что в вашем случае для настройки виртуальных доменов может использоваться несколько разных конфигурационных файлов.
Формат логов приводим к виду:
log_format logstash '$remote_addr - $remote_user [$time_local] "$host" '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
А настройку логов приводим к виду:
access_log syslog:server=localhost:5140,tag=nginx_access logstash;
error_log syslog:server=localhost:5140,tag=nginx_error notice;
* в данном примере мы отправим логи на сервер localhost (локальный, но если настройка выполняется удаленно, то необходимо указать имя сервера или IP-адрес) и порт 5140, который мы настроили на logstash.
Перезапускаем nginx:
nginx -t && nginx -s reload
Проверяем логи.