User Tools

Site Tools


elk_stack

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



Windows















elk_stack.txt · Last modified: 2023/04/06 10:28 (external edit)