Использование связки Elasticsearch + Kibana + Logstash на Linux

Обновлено и опубликовано Опубликовано:

Если в двух словах, Elasticsearch предоставляет механизм поиска, Kibana — веб-интерфейс для работы с Elasticsearch, Logstash — инструмент для сбора логов и их передачи в Elasticsearch. Таким образом, связка Elasticsearch + Kibana + Logstash (или ELK Stack) является инструментом по сбору и хранению журналов операционных систем. При этом поддерживаются разные платформы (Windows, Linux, BSD).

В данной инструкции мы рассмотрим пример установки серверной части ELK на Linux CentOS. Также мы настроим сбор логов с CentOS, Ubuntu, Windows.

Подготовка сервера

Прежде чем начать, подготовим к установке и настройке наш сервер.

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, поэтому не будут работать без соответствующей платформы на сервере. Для ее установки необходимо загрузить дистрибутив с сайта Oracle и выполнить его установку.

Переходим на страницу загрузки Java — на открывшейся странице принимаем лицензионное соглашение:

Лицензионное соглашение на Oracle Java SE

После появятся ссылки на платформу — кликаем по ссылке для скачивания RPM пакета:

Загрузка Java SE для Linux

Нас перебросит на страницу ввода логина и пароля — необходимо авторизоваться или зарегистрироваться. После начнется процесс загрузки пакета, и когда он завершится, перекидываем файл на сервер CentOS, например, при помощи WinSCP.

Если у нас нет аккаунта на портале Oracle и нет возможности его зарегистрировать, то можно скачать более раннюю версию java командой:
curl -L -C – -b “oraclelicense=accept-securebackup-cookie” -O ‘http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm’

Устанавливаем скачанный пакет командой:

rpm -ivh jdk-*

После окончания установки можно ввести команду:

java -version

Она должна вернуть, примерно, следующее:

openjdk version “1.8.0_212”
OpenJDK Runtime Environment (build 1.8.0_212-b04)
OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)

Elasticsearch

Переходим на страницу загрузки эластика и копируем ссылку на последнюю версию пакета RPM:

Скачиваем ссылку на RPM пакет для Elasticsearch

… и скачиваем по ней сам пакет:

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.3.2-x86_64.rpm

* в моем случае была версия 7.3.2.

После устанавливаем эластик на наш сервер:

rpm -ivh elasticsearch-*

Разрешаем автозапуск сервиса и запускаем его:

systemctl enable elasticsearch

systemctl start elasticsearch

Kibana

Переходим на страницу загрузки Kibana и скачиваем ссылку на последнюю вервию пакета RPM:

Скачиваем ссылку на RPM пакет для Kibana

… и скачиваем по ней пакет для установки kibana:

wget https://artifacts.elastic.co/downloads/kibana/kibana-7.3.2-x86_64.rpm

Устанавливаем приложение:

rpm -ivh kibana-*

Открываем на редактирование конфигурационный файл:

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. Если мы увидим сообщение «kibana not ready yet», просто ждем создания индекса (на это может уйти до 10 минут). После снова пробуем открыть страницу.

Мы должны увидеть страницу приветствия с заголовком «Welcome to Kibana».

Logstash

Процесс установки Logstash аналогичен — переходим на страницу загрузки программного продукта, копируем ссылку на пакет RPM:

Скачиваем ссылку на RPM пакет для Logstash

Скачиваем пакет на нашем сервере:

wget https://artifacts.elastic.co/downloads/logstash/logstash-7.3.2.rpm

… и устанавливаем его:

rpm -ivh logstash-*

Разрешаем автозапуск и стартуем сервис:

systemctl enable logstash

systemctl start logstash

Настройка Logstash

Настройки для логстэша хранятся в каталоге /etc/logstash/conf.d в файлах формата JSON. Для конфигурации используются следующие секции:

  1. input (входные данные).
  2. filter (фильтры).
  3. 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 — копируем ссылку на установочный пакет:

Скачиваем ссылку на RPM пакет для Filebeat

Используя скопированную ссылку, скачиваем пакет на сервере:

wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.2-x86_64.rpm

* если система вернет ошибку, устанавливаем wget командой yum install wget

После устанавливаем пакет:

rpm -ivh filebeat-*

Установка на Linux Ubuntu

Инструкция подходит для Ubuntu / Debian. Переходим на страницу загрузки Filebeat — копируем ссылку на установочный пакет:

Скачиваем ссылку на DEB пакет для Filebeat

Используя скопированную ссылку, скачиваем пакет на сервере:

wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.4.0-amd64.deb

После устанавливаем пакет:

dpkg -i filebeat-*

Установка на Windows

Переходим на страницу загрузки Filebeat — скачиваем архив для 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

Открываем наш веб-интерфейс с кибаной и переходим в разделы ManagementIndex Patterns:

Создание Index Patterns в Kibana

В окне справа кликаем по Create Index Pattern:

Create Index Pattern

В строке ввода текста вводим filebeat-*:

Create Index Pattern

* filebeat — это значение параметра template.name, которое мы задавали на стадии настройки filebeat.

… и нажимаем Next Step.

В поле «Time field name» выбираем значение @timestamp и нажимаем Create index pattern:

В поле «Time field name» выбираем значение @timestamp

Очистка устаревших данных

Разберем пример удаления логов, которые старше 30 дней. Для этого будем использовать Elasticsearch Curator. Для установки последнего переходим на страницу Curator Reference, выбираем текущую версию программного продукта и кликаем по Installation:

Установка Elasticsearch Curator

В открывшемся окне переходим на нужную инструкцию по установки (так как у нас CentOS, выбираем YUM Repository):

Установка Elasticsearch Curator

В открывшемся окне следуем инструкции — в моем случае, версия была 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