Table of Contents
ELK Stack
Данный стек, состоит из следующих ингредиентов:
- Elasticsearch используется для хранения, анализа, поиска по логам.
- Kibana представляет удобную и няшную web морду для работы с логами.
- Logstash сервис для сбора логов и отправки их в Elasticsearch. В самой простой конфигурации можно обойтись без него и отправлять логи напрямую в Elastic. Но с logstash это делать удобнее.
- Beats — агенты для отправки логов в Logstash. Будем использовать Filebeat для отправки данных из текстовых логов linux и Winlogbeat для отправки логов из журналов Windows систем.
Установка Java 8
Устанавливаем на Debian 9.7.0
apt-get install openjdk-8-jre-headless # проверяем, что поставилось java -version openjdk version "1.8.0_212" OpenJDK Runtime Environment (build 1.8.0_212-8u212-b03-2~deb9u1-b03) OpenJDK 64-Bit Server VM (build 25.212-b03, mixed mode)
Установка Elasticsearch
# копируем публичный ключ репозитория wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | apt-key add - # если нету, нужно установить ракет apt-transport-https apt install apt-transport-https # добавляем репозиторий echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | tee -a /etc/apt/sources.list.d/elastic-6.x.list # устанавливаем elasticsearch apt update && apt-get install elasticsearch
добавляем elasticsearch в автозагрузку и запускаем
systemctl daemon-reload systemctl enable elasticsearch.service systemctl start elasticsearch.service
проверяем , запустился ли сервис
systemctl status elasticsearch.service
Настройка Elasticsearch
Настройки конфигурации Elasticsearch хоронится в файле /etc/elasticsearch/elasticsearch.yml
. На начальном этапе, нужно отредактировать следующие параметры
path.data: /var/lib/elasticsearch # директория для хранения данных network.host: 127.0.0.1 # слушаем только локальный интерфейс
По-умолчанию Elasticsearch слушает все имеющиеся сетевые интерфейсы. Нам это не нужно, так как данные в него будет передавать logstash, который будет установлен локально. Так же нужно обратить внимание, на место, где будут хоронится данные. Для них требуется солидный объем дискового пространства.
Перезапускаем службу
systemctl restart elasticsearch.service
Если все ок, то увидим, что-то похожее
netstat -tulnp | grep 9200 tcp6 0 0 127.0.0.1:9200 :::* LISTEN 2065/java
Установка Kibana
# Добавляем публичный ключ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | apt-key add - # Подключаем репозиторий echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | tee -a /etc/apt/sources.list.d/elastic-6.x.list # Устанавливаем Kibana apt update && apt install kibana
Добавляем kibana в автозагрузку и запускаем
systemctl daemon-reload systemctl enable kibana.service systemctl start kibana.service
Проверяем сервис
systemctl status kibana.service
По-умолчанию, Kibana слушает порт 5601, посмотрим
netstat -tulnp | grep 5601 tcp 0 0 127.0.0.1:5601 0.0.0.0:* LISTEN 3045/node
Настройка Kibana
Конфигурация Kibana, располагается в файле /etc/kibana/kibana.yml
. Для тестового запуска, нужно изменить параметр server.host
. В дальнейшем, когда будет настроен nginx как reverse proxy вернем значение в localhost
server.host: "10.10.10.14"
Если Kibana должна слушать все интерфейсы то указываем 0.0.0.0
Перерестартанем Kibana
systemctl restart kibana.service
И смотрим на вебморду kibana, по адресу 10.10.10.14:5601
Установка Logstash
Ставим logstash
apt install logstash
добавляем сервис logstash в автозапуск
systemctl enable logstash.service
Настройка Logstash
Перед тем как стартовать Logstash, его нужно немножко подкрутить. Основной конфиг Logstash находится в файле /etc/logstash/logstash.yml
. Его редактировать пока не надо. Есть смысл все настройки разделить по назначению, и разместить в разные файлы конфигурации. Файлы конфигурации будут хранится в директории /etc/logstash/conf.d
Создадим конфиг input.conf
, который будет описывать прием информации с beats агентов.
input { beats { port => 5044 } }
Теперь создадим файл output.conf
который описывает передачу данных в Elasticsearch
output { elasticsearch { hosts => "localhost:9200" index => "nginx-%{+YYYY.MM.dd}" } #stdout { codec => rubydebug } }
Задокументированная строка - отвечает за отправку логов. Если ее включить, то все поступающие данные logstash будет отправлять дополнительно в системный лог. Использовать данный параметр, нужно только во время отладки.
Еще, создадим конфиг - filter.conf
, с описанием обработки данных.
filter { if [type] == "nginx_access" { grok { match => { "message" => "%{IPORHOST:remote_ip} - %{DATA:user} \[%{HTTPDATE:access_time}\] \"%{WORD:http_method} %{DATA:url} HTTP/%{NUMBER:http_version}\" %{NUMBER:response_code} %{NUMBER:body_sent_bytes} \"%{DATA:referrer}\" \"%{DATA:agent}\"" } } } date { match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ] } geoip { source => "remote_ip" target => "geoip" add_tag => [ "nginx-geoip" ] } }
Данный фильтр, парсит логи nginx с помощью grok, если указан соответствующий тип логов, и выделяет из лога ключевые данные, которые записывает в определенные поля, чтобы потом с ними было удобно работать.
Модуль date, нужен для того, чтобы выделять дату из поступающих логов и использовать ее в качестве даты документа в elasticsearch. Делается это для того, чтобы не возникало путаницы, если будут задержки с доставкой логов. В системе сообщения будут с одной датой, а внутри лога будет другая дата. Неудобно разбирать инциденты.
В конце используется фильтр geoip, который на основе ip адреса, который получили ранее с помощью фильтра grok и записали в поле remote_ip, определяет географическое расположение. Он добавляет новые метки и записывает туда географические данные. Для его работы мне было достаточно описать его в конфиге и скачать базу адресов в папку /etc/logstash
.
wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz gunzip GeoLite2-City.mmdb.gz
Теперь, осталось только стартануть logstash
systemctl start logstash.service
Логи logstash, можно позырить тут
tail /var/log/logstash/logstash-plain.log
Установка Filebeat для отправки логов в Logstash
Linux
# Скачиваем deb пакет curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.4.0-amd64.deb # и устанавливаем его dpkg -i filebeat-6.4.0-amd64.deb
Пример конфига лога сервиса nginx, для отправки в logstash. Сам конфигуратор находится по адресу /etc/filebeat/filebeat.yml
filebeat.inputs: - type: log enabled: true paths: - /var/log/nginx/*-access.log fields: type: nginx_access fields_under_root: true scan_frequency: 5s - type: log enabled: true paths: - /var/log/nginx/*-error.log fields: type: nginx_error fields_under_root: true scan_frequency: 5s output.logstash: hosts: ["10.10.10.14:5044"] xpack.monitoring: enabled: true elasticsearch: hosts: ["http://10.10.10.14:9200"]
Стартуем filebeat и добавляем в автозапуск
systemctl start filebeat systemctl enable filebeat