VK Cloud logo
Обновлена 15 апреля 2024 г. в 08:50

Установка и настройка ELK, сбор, анализ и визуализация логов

Конфигурация оборудования

Чтобы выполнить данный сценарий, требуется установленный и настроенный сервер для ELK на ОС Ubuntu 18.04 LTS x86_64.

Схема работы

Scheme of work

Стек ELK состоит из трех компонентов:

  • Elasticsearch - движок для хранения, индексирования и обработки данных в общем хранилище, а также для полнотекстового поиска данных.
  • Logstash - утилита для сбора, фильтрации, агрегации, изменения  и последующего перенаправления исходных данных в конечное хранилище.
  • Kibana - веб-интерфейс для просмотра и анализа данных из хранилища.

Установка Elasticsearch, Logstash и Kibana

  1. Выполните логин на сервере Ubuntu с правами root.
  2. Импортируйте ключ репозитория Elasticsearch:
root@ubuntu-std1-1:~# wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -OK
  1. Установите apt-transport-https:
root@ubuntu-std1-1:~# apt-get install apt-transport-https
  1. Добавьте репозиторий:
root@ubuntu-std1-1:~# echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.listdeb https://artifacts.elastic.co/packages/7.x/apt stable main
  1. Установите Elasticsearch:
root@ubuntu-std1-1:~# apt-get update && apt-get install elasticsearch
  1. Установите Kibana:
root@ubuntu-std1-1:~# apt-get install kibana
  1. Для работы Logstash установите OpenJDK:
root@ubuntu-std1-1:~# apt-get install openjdk-8-jre
  1. Установите Logstash:
root@ubuntu-std1-1:~# apt-get install logstash

Настройка Elasticsearch

Elasticsearch настраивается с использованием трех конфигурационных файлов:

  • elasticsearch.yml  - основной конфигурационный файл;
  • jvm.options - файл для настройки Java-машины для запуска Elasticsearch;
  • log4j2.properties  - файл для настройки логирования Elasticsearch.

jvm.options

Наиболее важной в этом файле является настройка памяти, выделенной для JVM (Heap Size). Для Elasticsearch этот параметр влияет напрямую на то, насколько крупные массивы данных он сможет обработать. Heap Size определяется парой параметров:

  • Xms - начальное значение;
  • Xmx - максимальное значение.

По умолчанию Heap Size составляет 1 ГБ. Если объем памяти на сервере позволяет, увеличьте это значение (подробнее о Heap Size). Для этого найдите строки:

Xms1gXmx1g

и замените их, например, на строки:

Xms4gXmx4g

log4j2.properties

Для удобства  можно поменять appender.rolling.policies.size.size, указывающий размер лога, при котором выполняется ротация (по умолчанию - 128 МБ). Подробнее о логировании см.тут.

elasticsearch.yml

Настройте:

  • node.name: elasticsearch - укажите имя ноды;
  • network.host: 127.0.0.1 - установите слушать только localhost.

Запустите Elasticsearch:

root@ubuntu-std1-1:~# systemctl start elasticsearch.service

Если вы указали слишком большое значение Heap Size, запуск завершится неудачей. При этом в логах будет следующее:

root@ubuntu-std1-1:~# systemctl start elasticsearch.serviceJob for elasticsearch.service failed because the control process exited with error code.See "systemctl status elasticsearch.service" and "journalctl -xe" for details.root@ubuntu-std1-1:~# journalctl -xe-- Unit elasticsearch.service has begun starting up.Nov 12 12:48:12 ubuntu-std1-1 elasticsearch[29841]: Exception in thread "main" java.lang.RuntimeException: starting java failed with [1]Nov 12 12:48:12 ubuntu-std1-1 elasticsearch[29841]: output:Nov 12 12:48:12 ubuntu-std1-1 elasticsearch[29841]: #Nov 12 12:48:12 ubuntu-std1-1 elasticsearch[29841]: # There is insufficient memory for the Java Runtime Environment to continue.Nov 12 12:48:12 ubuntu-std1-1 elasticsearch[29841]: # Native memory allocation (mmap) failed to map 986513408 bytes for committing reserved memory.Nov 12 12:48:12 ubuntu-std1-1 elasticsearch[29841]: # An error report file with more information is saved as:Nov 12 12:48:12 ubuntu-std1-1 elasticsearch[29841]: # /var/log/elasticsearch/hs_err_pid29900.log

В случае успешного запуска добавьте Elasticsearch в список процессов, запускаемых автоматически:

root@ubuntu-std1-1:~# systemctl enable elasticsearch.serviceSynchronizing state of elasticsearch.service with SysV service script with /lib/systemd/systemd-sysv-install.Executing: /lib/systemd/systemd-sysv-install enable elasticsearchCreated symlink /etc/systemd/system/multi-user.target.wants/elasticsearch.service → /usr/lib/systemd/system/elasticsearch.service.

Убедитесь, что Elasticsearch отвечает на запросы:

root@ubuntu-std1-1:~# curl http://localhost:9200{"name" : "ubuntu-std1-1","cluster_name" : "elasticsearch","cluster_uuid" : "ZGDKK_5dQXaAOr75OQGw3g","version" : {"number" : "7.4.2","build_flavor" : "default","build_type" : "deb","build_hash" : "2f90bbf7b93631e52bafb59b3b049cb44ec25e96","build_date" : "2019-10-28T20:40:44.881551Z","build_snapshot" : false,"lucene_version" : "8.2.0","minimum_wire_compatibility_version" : "6.8.0","minimum_index_compatibility_version" : "6.0.0-beta1"},"tagline" : "You Know, for Search"}

Настройка Kibana

По умолчанию в конфигурационном файле Kibana /etc/kibana/kibana.yml содержатся все необходимые настройки. Единственный параметр, который нужно изменить: server.host: “localhost”. При настройке по умолчанию Kibana доступна только локально. Для удаленного доступа к Kibana замените “localhost” на внешний IP-адрес сервера, на котором установлена Kibana. Кроме того, если Elasticsearch расположен не на одном хосте с Kibana, измените настройку elasticsearch.hosts: ["http://localhost:9200"].

  1. Запустите Kibana:
root@ubuntu-std1-1:/etc/kibana# systemctl start kibana.service
  1. Добавьте Kibana в список приложений, запускаемых автоматически:
root@ubuntu-std1-1:/etc/kibana# systemctl enable kibana.serviceSynchronizing state of kibana.service with SysV service script with /lib/systemd/systemd-sysv-install.Executing: /lib/systemd/systemd-sysv-install enable kibana
  1. В браузере перейдите по адресу http://<IP-адрес сервера kibana>:5601.

Если Kibana работает, отобразится следующее:

Настройка  безопасности Kibana и Elasticsearch

По умолчанию Elasticsearch и Kibana полностью доступны для всех. Доступ можно ограничить одним из способов:

  • Использовать Nginx как reverse proxy с авторизацией и контролем доступа.
  • Использовать встроенный механизм elasticsearch xpack.security (подробно об этом см. тут или тут).

Рассмотрим наиболее популярный первый способ.

  1. Установите Nginx:
root@ubuntu-std1-1:~# apt-get install nginx
  1. Убедитесь, что в конфигурационном файле /etc/elasticsearch/elasticsearch.yml параметр network.host имеет значение 127.0.0.1 или localhost. При необходимости выполните эту настройку и перезапустите демон elasticsearch:
root@ubuntu-std1-1:~# cat /etc/elasticsearch/elasticsearch.yml  | grep network.hostnetwork.host: 127.0.0.1root@ubuntu-std1-1:~# systemctl restart elasticsearch.service
  1. Убедитесь, что в конфигурационном файле /etc/kibana/kibana.yml параметр server.host имеет значение 127.0.0.1 или localhost. При необходимости выполните эту настройку и перезапустите демон kibana:
root@ubuntu-std1-1:~# cat /etc/kibana/kibana.yml  | grep server.hostserver.host: "127.0.0.1"# When this setting's value is true Kibana uses the hostname specified in the server.hostroot@ubuntu-std1-1:~# systemctl restart kibana.service
  1. Убедитесь, что Elasticsearh и Kibana использовали интерфейс 127.0.0.1:
root@ubuntu-std1-1:~# netstat -tulpn | grep 9200tcp6 0 0 127.0.0.1:9200 :::\* LISTEN 10512/javaroot@ubuntu-std1-1:~# netstat -tulpn | grep 5601tcp        0      0 127.0.0.1:5601          0.0.0.0:\*               LISTEN      11029/node
  1. В /etc/nginx/sites-available создайте файл kibana.conf и добавьте в него следующее:
server {listen <внешний IP-адрес сервера с Kibana и Nginx>:5601;server_name kibana;error_log /var/log/nginx/kibana.error.log;access_log /var/log/nginx/kibana.access.log;location / {auth_basic "Restricted Access";auth_basic_user_file /etc/nginx/htpasswd;rewrite ^/(.\*) /$1 break;proxy_ignore_client_abort on;proxy_pass http://localhost:5601;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Host $http_host;}}
  1. Укажите имя пользователя (USER) и пароль (PASSWORD):
root@ubuntu-std1-1:/etc/nginx# printf "USER:$(openssl passwd -crypt PASSWORD)\n" >> /etc/nginx/htpasswd
  1. Для включения сайта создайте симлинк в папку /etc/nginx/sites-enabled:
root@ubuntu-std1-1:~# ln -s /etc/nginx/sites-available/kibana.conf /etc/nginx/sites-enabled/kibana.conf
  1. Запустите Nginx:
root@ubuntu-std1-1:~# systemctl start nginx
  1. В браузере перейдите по адресу http://<IP-адрес сервера kibana>:5601. В открывшемся окне введите логин и пароль для доступа к веб-интерфейсу Kibana.

Аналогично настройте Nginx в качестве reverse proxy для Elasticsearh (порт 9200) и Logstash (обычно порт 5044).

Для ознакомления с Kibana можно использовать тестовый набор данных:

Установка filebeat

Beats - часть инфраструктуры Elasticsearch, так называемые Data Shippers (поставщики данных). Это легковесные агенты, которые берут данные из различных источников и преобразуют их для передачи в Elasticsearch. Функциональность Beats частично дублирует Logstash, но Beats легковеснее, проще настраиваются, быстрее работают и не требуют установки Java stack. Обычно на нодах, где формируются логи, устанавливаются соответствующие агенты Beats, которые передают логи в Logstash. Logstash аггрегирует, трансформирует логи и передает их в Elasticsearch. Существует множество разных Beats, в стандартный набор входят следующие агенты:

  • Filebeat - сбор логов из различных log-файлов.
  • Packetbeat - сбор сетевой статистики.
  • Winlogbeat -  сбор логов на платформе Windows.
  • Metricbeat - сбор разнообразных метрик.
  • Heartbeat - сбор данных о доступности инфраструктуры.
  • Auditbeat - сбор данных аудита систем.
  • Functionbeat - сбор данных с Serverless проектов (AWS Lambda).
  • Journalbeat - сбор логов Journald.

Наиболее распространен агент Filebeat, используем его для сбора логов Nginx.

  1. Установите Filebeat:
root@ubuntu-std1-1:~# apt-get install filebeat
  1. Разрешите обработку логов Nginx:
root@ubuntu-std1-1:~# mv /etc/filebeat/modules.d/nginx.yml.disabled /etc/filebeat/modules.d/nginx.yml

Если логи находятся в нестандартном месте, либо требуется обработка только части логов, в файле /etc/filebeat/modules.d/nginx.yml раскомментируйте и заполните переменные var.paths.

В примере далее будем собирать и анализировать логи обращения к сервису Kibana. При настройке Nginx мы определили, что логи обращений будут храниться в файлах /var/log/nginx/kibana.access.log  и /var/log/nginx/kibana.error.log.

  1. Приведите файл /etc/filebeat/modules.d/nginx.yml к следующему виду:
# Module: nginx# Docs: https://www.elastic.co/guide/en/beats/filebeat/7.4/filebeat-module-nginx.html- module: nginx# Access logsaccess:enabled: true# Set custom paths for the log files. If left empty,# Filebeat will choose the paths depending on your OS.var.paths:- /var/log/nginx/kibana.access.log# Error logserror:enabled: true# Set custom paths for the log files. If left empty,# Filebeat will choose the paths depending on your OS.var.paths:     - /var/log/nginx/kibana.error.log
  1. В файле /etc/filebeat/filebeat.yml отредактируйте секцию setup.kibana:
setup.kibana:  host: "<IP-адрес сервера с Kibana>:5601"  username: "логин"  password: "пароль"
  1. Логи будут пересылаться в Logstash, поэтому закомментируйте секцию output.elasticsearch и укажите IP-адрес сервера, на котором расположен Logstash, в секции output.logstash:
#-------------------------- Elasticsearch output ------------------------------#output.elasticsearch:# Array of hosts to connect to.# hosts: ["localhost:9200"]# Optional protocol and basic auth credentials.#protocol: "https"#username: "elastic"#password: "changeme"#----------------------------- Logstash output --------------------------------output.logstash:# The Logstash hostshosts: ["<IP-адрес сервера logstash>:5044"]# Optional SSL. By default is off.# List of root certificates for HTTPS server verifications#ssl.certificate_authorities: ["/etc/pki/root/ca.pem"]# Certificate for SSL client authentication#ssl.certificate: "/etc/pki/client/cert.pem"# Client Certificate Key  #ssl.key: "/etc/pki/client/cert.key"
  1. Убедитесь, что в конфигурационном файле нет ошибок:
root@ubuntu-std1-1:/etc/filebeat# filebeat test config -c /etc/filebeat/filebeat.ymlConfig OK

Перед запуском Filebeat настройте прием логов в Logstash.

Настройка Logstash

Конфигурационный файл Logstash в общем виде состоит из трех секций:

  • input - описание пункта назначения логов.
  • filter - трансформация логов.
  • output - описание пункта назначения преобразованных логов.
  1. Создайте файл /etc/logstash/conf.d/input-beats.conf, содержащий номер порта, на который Beats (в частности, Filebeat) присылает свои логи:
input {beats {port => 5044}}
  1. Создайте файл /etc/logstash/conf.d/output-elasticsearch.conf и укажите, что логи нужно отправлять в Elasticsearch по адресу localhost и индексы нужно именовать в формате nginx-<дата> (то есть каждый день будет создаваться новый индекс, это удобно для анализа):
output {elasticsearch {hosts => [ "localhost:9200" ]        manage_template => false        index => "nginx-%{+YYYY.MM.dd}"    }}
  1. Создайте файл /etc/logstash/conf.d/filter-nginx.conf следующего содержания:
filter { if [event][dataset] == "nginx.access" {   grok {    match => [ "message" , "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:user_agent}"]    overwrite => [ "message" ]   }   mutate {    convert => ["response", "integer"]    convert => ["bytes", "integer"]    convert => ["responsetime", "float"]   }  geoip {   source => "clientip"   target => "geoip"   add_tag => [ "nginx-geoip" ]  }  date {   match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]   remove_field => [ "timestamp" ]  }    useragent {   source => "user_agent"  } }}

Filebeat, который будет пересылать логи Nginx в Logstash, записывает всю строчку лога Nginx  в поле message. Поэтому это поле нужно разобрать на переменные, с которыми можно будет работать в Elasticsearch. Этот разбор осуществляется в секции grok в формате NGINX ACCESS LOG .

В секции mutate можно изменить формат хранения данных (например, чтобы поле bytes из лога хранилось как число, а не как строка).

В секции geoip к логу добавляются поля геолокации по IP-адресу запроса.

Секция date используется для парсинга поля даты запроса из лога и преобразование для передачи в Elasticsearch.

Секция  useragent заполняет поля по полю из лога. Обратите внимание, что обычно в подобных руководствах используется поле agent. Это поле не будет работать в связке Filebeat + Logstash, так как оно предназначено для использования при прямой записи из Filebeat в Elasticsearh. При использовании в Logstash будет выдаваться ошибка:

[2019-11-19T09:55:46,254][ERROR][logstash.filters.useragent][main] Uknown error while parsing user agent data {:exception=>#<TypeError: cannot convert instance of class org.jruby.RubyHash to class java.lang.String>, :field=>"agent", :event=>#<LogStash::Event:0x1b16bb2>}

По той же причине в секции  grok match не нужно использовать макрос %{COMBINEDAPACHELOG}.

Для отслеживания ошибок в Logstash включите дебаг. Для этого в секцию output добавьте следующую строку:

stdout { codec => rubydebug }

В результате вывод в базу Elasticsearch будет дублироваться выводом на консоль/syslog. Кроме того, для проверки выражений grok match полезно использовать Grok Debugger.

  1. Запустите Logstash и добавьте его в список приложений для автоматического запуска:
root@ubuntu-std1-1:~# systemctl start logstashroot@ubuntu-std1-1:~# systemctl enable logstashCreated symlink /etc/systemd/system/multi-user.target.wants/logstash.service → /etc/systemd/system/logstash.service.
  1. Убедитесь, что сервис запустился:
root@ubuntu-std1-1:~# netstat -tulpn | grep 5044tcp6       0      0 :::5044                 :::\*                    LISTEN      18857/java
  1. Протестируйте работу Filebeat:
root@ubuntu-std1-1:~# service filebeat start

Настройка Kibana Templates

После запуска Filebeat логи обращения к Kibana поступают в Logstash, затем в Elasticsearch. Чтобы просмотреть эти логи, в Kibana необходимо настроить templates.

  1. Перейдите в Kibana, в левом меню нажмите шестеренку, выберите Kibana > Index Patterns и нажмите Create Index Pattern.

  1. Чтобы выбрать все записи, в поле Index pattern введите nginx-*  и нажмите Next step.

  1. Чтобы использоваться временные метки из лог-файлов, в поле Time Filter field name выберите @timestamp и нажмите Create index pattern.

Будет создан index pattern.

Чтобы просмотреть логи, попавшие в Elasticsearch, перейдите в Discover.

Настройка Kibana Visualizations

Dashboard в Kibana состоит из визуализаций. Визуализация - это разновидность графика, построенного по определенным запросам из Elasticsearch.

Построим первую визуализацию  - топ 10 клиентов.

  1. В левом меню выберите Visualisations и нажмите кнопку Create new visualisation.

  1. Выберите Vertical bar.

  1. Выберите темплейт nginx-*.

  1. Добавьте ось X.

  1. Введите данные:
  • Aggregation: Terms - возвращает указанное количество топ-значений.
  • Field: clientip.keyword - выбираем клиента по IP-адресу.
  • Size: 10 - 10 топ значений.
  • Custom Label: Top 10 clients - название визуализации.

  1. Выполните запрос и сохраните визуализацию.

В результате на визуализации показаны топ-10 IP-адресов, с которых были обращения.

Построим вторую визуализацию - круговую диаграмму, показывающую топ 5 стран, откуда обращались пользователи.

  1. В левом меню выберите Visualisations и нажмите кнопку Create new visualisation.
  2. Выберите Pie.
  3. Выберите темплейт nginx-*.
  4. Добавьте ось X.
  5. Чтобы данные отображались секторам, выберите Add bucket / Split slices.

  1. Введите следующие данные:
  • Aggregation: Terms - выбираем топ значения данных.
  • Field: geoip.country_code2.keyword - двухбуквенное обозначение страны.
  • Size:5  - выбираем топ 5.
  • Custom label: Top 5 countries -  название графика.

  1. Выполните запрос и сохраните визуализацию.

На графике отобразятся топ 5 стран, из которых был доступ.

Построим третью визуализацию - график количества запросов, с делением по кодам ответа.

  1. В левом меню выберите Visualisations и нажмите кнопку Create new visualisation.
  2. Выберите TSVB.
  3. Выберите темплейт nginx-*.
  4. Чтобы получить все коды ответов сервера (то есть все запросы, отправленные серверу), в появившемся окне впишите в название Requests, выберите группировать по фильтру и в строке запроса укажите responce:*.
  5. Для добавления второй линии на график, .
  6. Чтобы на втором графике получить выборку количества ответов сервера "200 ОК" в единицу времени, нажмите "+", выберите другой цвет, в названии укажите Responce:200, в строке запроса - responce:200.
  7. Нажмите "+" и аналогичным образом добавьте код ответа 302. Затем сохраните визуализацию.

Настройка Kibana Dashboard

Kibana Dashboard - это набор визуализаций.

  1. Нажмите Dashboards, затем Create New Dashboard.

  1. В верхнем меню нажмите Add.

  1. В открывшемся окне выберите созданные вами визуализации.

  1. При необходимости измените порядок и размер визуализаций, затем нажмите Save.