Elasticsearch + Kibana + Logstash на Ubuntu

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

Используемые термины: ElasticsearchUbuntu.

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

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

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

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

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-пакет или копируем на него ссылку:

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

Переносим файл на севрер или загружаем его на сервере с использованием скопированной ссылки:

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:

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

На компьютере с доступом к сайту 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:

Вводим токен для подключения к Elasticsearch

Откроется окно с вводом проверочного кода. Возвращаемся на сервер и вводим команду:

/usr/share/kibana/bin/kibana-verification-code

Мы получим 6-ти значный код. Вводим его в окне Kibana:

Вводим полученный проверочный код

Нажимаем Verify — начнется процесс настройки. После его завершения мы увидим окно ввода логина и пароля. На этом пока останавливаемся и переходим к настройке Logstash.

Logstash

Отдельно рассмотрим установку из репозитория, с использованием файла deb и настройку.

а) Используем репозиторий

Вводим команду:

apt install logstash

б) Deb-файл

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

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

Скачиваем пакет на нашем сервере (или другом компьютере и переносим на сервер):

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. Для конфигурации используются следующие секции:

  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 => ["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 — копируем ссылку на установочный пакет:

Скачиваем ссылку на RPM пакет для 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 — копируем ссылку на установочный пакет:

Скачиваем ссылку на DEB пакет для 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:

Открываем Kibana и переходим в раздел для просмотра логов

Мы должны увидеть логи с нашего компьютера:

Список логов в Kibana

Наш 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

Рассмотрим реальный пример сбора логов с конкретного приложения. Мы настроим два варианта:

  1. NGINX -> Filebeat-> Logstash -> Elastic.
  2. 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":

Логи с 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

Проверяем логи.

# DevOps # Ubuntu # Серверы
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет