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

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

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

Внимание!

При использовании других серверов и оборудования некоторые шаги сценария могут отличаться от описанных ниже.

Схема работы

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

  • Elasticsearch - движок для хранения, индексирования и обработки данных в общем хранилище, а также для полнотекстового поиска данных.

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

  •  Kibana - веб-интерфейс для просмотра и анализа данных из хранилища.

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

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

Xms1g
Xmx1g

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

Xms4g
Xmx4g


log4j2.properties 

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

elasticsearch.yml 

Настройте:

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


Запустите Elasticsearch:

root@ubuntu-basic-1-1-10gb:~# systemctl start elasticsearch.service

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

root@ubuntu-basic-1-1-10gb:~# systemctl start elasticsearch.service
Job for elasticsearch.service failed because the control process exited with error code.
See "systemctl status elasticsearch.service" and "journalctl -xe" for details.
root@ubuntu-basic-1-1-10gb:~# journalctl -xe
-- Unit elasticsearch.service has begun starting up.
Nov 12 12:48:12 ubuntu-basic-1-1-10gb elasticsearch[29841]: Exception in thread "main" java.lang.RuntimeException: starting java failed with [1]
Nov 12 12:48:12 ubuntu-basic-1-1-10gb elasticsearch[29841]: output:
Nov 12 12:48:12 ubuntu-basic-1-1-10gb elasticsearch[29841]: #
Nov 12 12:48:12 ubuntu-basic-1-1-10gb elasticsearch[29841]: # There is insufficient memory for the Java Runtime Environment to continue.
Nov 12 12:48:12 ubuntu-basic-1-1-10gb elasticsearch[29841]: # Native memory allocation (mmap) failed to map 986513408 bytes for committing reserved memory.
Nov 12 12:48:12 ubuntu-basic-1-1-10gb elasticsearch[29841]: # An error report file with more information is saved as:
Nov 12 12:48:12 ubuntu-basic-1-1-10gb elasticsearch[29841]: # /var/log/elasticsearch/hs_err_pid29900.log
В случае успешного запуска добавьте Elasticsearch в список процессов, запускаемых автоматически:
root@ubuntu-basic-1-1-10gb:~# systemctl enable elasticsearch.service
Synchronizing state of elasticsearch.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable elasticsearch
Created symlink /etc/systemd/system/multi-user.target.wants/elasticsearch.service → /usr/lib/systemd/system/elasticsearch.service.
Убедитесь, что Elasticsearch отвечает на запросы:
root@ubuntu-basic-1-1-10gb:~# curl http://localhost:9200
{
"name" : "ubuntu-basic-1-1-10gb",
"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-basic-1-1-10gb:/etc/kibana# systemctl start kibana.service
  1. Добавьте Kibana в список приложений, запускаемых автоматически:
root@ubuntu-basic-1-1-10gb:/etc/kibana# systemctl enable kibana.service
Synchronizing 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-basic-1-1-10gb:~# apt-get install nginx
  1. Убедитесь, что в конфигурационном файле /etc/elasticsearch/elasticsearch.yml параметр network.host имеет значение 127.0.0.1 или localhost. При необходимости выполните эту настройку и перезапустите демон elasticsearch:
root@ubuntu-basic-1-1-10gb:~# cat /etc/elasticsearch/elasticsearch.yml  | grep network.host
network.host: 127.0.0.1
root@ubuntu-basic-1-1-10gb:~# systemctl restart elasticsearch.service
  1. Убедитесь, что в конфигурационном файле /etc/kibana/kibana.yml параметр server.host имеет значение 127.0.0.1 или localhost. При необходимости выполните эту настройку и перезапустите демон kibana:
root@ubuntu-basic-1-1-10gb:~# cat /etc/kibana/kibana.yml  | grep server.host
server.host: "127.0.0.1"
# When this setting's value is true Kibana uses the hostname specified in the server.host
root@ubuntu-basic-1-1-10gb:~# systemctl restart kibana.service
  1. Убедитесь, что Elasticsearh и Kibana использовали интерфейс 127.0.0.1:
root@ubuntu-basic-1-1-10gb:~# netstat -tulpn | grep 9200
tcp6 0 0 127.0.0.1:9200 :::* LISTEN 10512/java
root@ubuntu-basic-1-1-10gb:~# netstat -tulpn | grep 5601
tcp        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-basic-1-1-10gb:/etc/nginx# printf "USER:$(openssl passwd -crypt PASSWORD)\n" >> /etc/nginx/htpasswd
  1. Для включения сайта создайте симлинк в папку /etc/nginx/sites-enabled:
root@ubuntu-basic-1-1-10gb:~# ln -s /etc/nginx/sites-available/kibana.conf /etc/nginx/sites-enabled/kibana.conf
  1. Запустите Nginx:
root@ubuntu-basic-1-1-10gb:~# 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-basic-1-1-10gb:~# apt-get install filebeat
  1. Разрешите обработку логов Nginx:

root@ubuntu-basic-1-1-10gb:~# 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 logs
access:
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 logs
error:
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: "пароль"

Примечание.

Логин и пароль требуются для доступа Filebeat в Kibana с целью загрузки типовых dashboard под известные наборы данных.

  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 hosts
hosts: ["<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-basic-1-1-10gb:/etc/filebeat# filebeat test config -c /etc/filebeat/filebeat.yml
Config 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-basic-1-1-10gb:~# systemctl start logstash
root@ubuntu-basic-1-1-10gb:~# systemctl enable logstash
Created symlink /etc/systemd/system/multi-user.target.wants/logstash.service → /etc/systemd/system/logstash.service.
  1. Убедитесь, что сервис запустился:

root@ubuntu-basic-1-1-10gb:~# netstat -tulpn | grep 5044
tcp6       0      0 :::5044                 :::*                    LISTEN      18857/java  
  1. Протестируйте работу Filebeat:
root@ubuntu-basic-1-1-10gb:~# 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.

Обратная связь

Возникли проблемы или остались вопросы? Напишите нам, мы будем рады