Сервер логов Elasticsearch + Logtash + Kibana4 + beats(windows/linux). Установка и настройка

от автора

Не так давно работаю в организации и был удивлён тому, что нет чёткой системы журналирования. Парк довольно большой: более 100 серверов со всем зоопарком. В связи с этим встал вопрос централизованного хранения и обработки журналов с серверов на базе Linux и Windows. Мой выбор пал на продукты от Elastic.

Большинство прочитанных статей на тему установки приложений Elastic показались мне достаточно расплывчатыми и не полными.

Основной и единственный источник информации, который я использовал: www.elastic.co/guide/index.html.

Этот мануал конечно не является исчерпывающим, но является достаточным для первоначальной установки и настройки рабочего лог-сервера elasticsearch+logtash+kibana4+beats (windows\linux-агенты).

Подробная информация, дополнительные возможности, а также «реал кунг-фу» доступны в официальной документации.

От слов к делу.

Будем собирать и склеивать

  • Logstash-2.2.0 — обработка в ходящих логов
  • Elasticsearch-2.2.0 — хранение логов
  • Kibana-4.2.2 — web-интерфейс
  • Topbeat 1.1.0 — Получение данных об инфраструктуре Linux-систем
  • Filebeat 1.1.0 — Отображение логов в режиме real-time Linux-систем
  • Packetbeat 1.1.0 — Анализ пакетных данных в сети Linux-систем
  • Winlogbeat 1.1.0 — Анализ журналов Windows-систем.
  • Операционная система — Ubuntu Server 14.04 (trusty) x86_x64

Описывать установку Ubuntu Server я не буду, на тему этого доступна исчерпывающая информация в сети.

Подготовка

Обновляемся:

sudo apt-get update && apt-get upgrade 

Редактируем hosts и hostname:

sudo vi /etc/hosts 

127.0.0.1      localhost 10.0.10.33     elk-server.ss.lu        elk-server 

sudo echo “elk-server.ss.lu” > /etc/hostname sudo service hostname restart && /etc/init.d/networking restart 

Устанавливаем Java 8:

sudo add-apt-repository -y ppa:webupd8team/java sudo apt-get update sudo apt-get -y install oracle-java8-installer 

Создаём каталоги, которые нам понадобятся для фасовки пакетов:

sudo mkdir -p ~/ELK/releases/beats/filebeat/ sudo mkdir -p ~/ELK/releases/beats/packetbeat/ sudo mkdir -p ~/ELK/releases/beats/topbeat/ sudo mkdir -p ~/ELK/releases/beats/winlogbeat 

Устанавливаем Elasticsearch:

Идём на сайт www.elastic.co/downloads/elasticsearch и скачиваем актуальную (2.2.0) версию:

sudo cd ~/ELK/releases/ sudo wget https://download.elasticsearch.org/elasticsearch/release/org/elasticsearch/distribution/deb/elasticsearch/2.2.0/elasticsearch-2.2.0.deb 

Устанавливаем:

sudo dpkg –i elasticsearch-2.2.0.deb 

Редактируем конфиг /etc/elasticsearch/elasticsearch.yml:

Раскомментируем и отредактируем стоки cluster.name и node.name:

sudo sed -i "s|# cluster.name: my-application|cluster.name: elk-server.ss.lu|" /etc/elasticsearch/elasticsearch.yml  sudo sed -i "s|# node.name: node-1| node.name: mynodename|" /etc/elasticsearch/elasticsearch.yml  

(вместо «elk-server.ss.lu» и «mynodename» можете вставьте свои значения)
Должно получится так:

cluster.name: elk-server.ss.lu
node.name: ss

Добавляем в автозагрузку:

sudo update-rc.d elasticsearch defaults 95 10 

Запускаем:

sudo /etc/init.d/elasticsearch start 

Проверяем:

sudo curl http://localhost:9200 

Правильный вывод:

{   "name" : "qq",   "cluster_name" : "elk-server.qq.qu",   "version" : {     "number" : "2.2.0",     "build_hash" : "8ff36d139e16f8720f2947ef62c8167a888992fe",     "build_timestamp" : "2016-01-27T13:32:39Z",     "build_snapshot" : false,     "lucene_version" : "5.4.1"   },   "tagline" : "You Know, for Search" 

Устанавливаем Logstash:

Скачиваем актуальную (2.2.0) версию Logstash www.elastic.co/downloads/logstash и устанавливаем:

sudo cd ~/ELK/releases/ sudo wget  https://download.elastic.co/logstash/logstash/packages/debian/logstash_2.2.0-1_all.deb sudo dpkg –i logstash_2.2.0-1_all.deb 

Создаём INPUT-файл для «битсов»…

sudo vi /etc/logstash/conf.d/input-beats.conf 

… и копируем туда код:

input {       beats {         port => 5044       } } 

Это будет означать что logstash начнёт слушать порт 5044. Данный порт является по умолчанию для этой версии и будет прописан по умолчанию в битсах. Можете задать любой другой.

Создаём OUTPUT-файл…

sudo vi /etc/logstash/conf.d/output-elasticsearch.conf 

… и копируем туда код для связи с elasticsearch:

output {       elasticsearch {         hosts => ["localhost:9200"]         sniffing => true         manage_template => false         index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"         document_type => "%{[@metadata][type]}"       } } 

Проверяем конфиг на ошибки, запускаем, и вносим в автозапуск:

sudo service logstash configtest sudo service logstash restart sudo update-rc.d logstash defaults 96 9 

Проверяем порт:

netstat -a | grep 5044  

Пример успешной работы:

tcp6       0      0 [::]:5044               [::]:*                  LISTEN 

Устанавливаем Kibana

Скачиваем и устанавливаем публичный ключ:

sudo wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add - 

Добавляем репозиторий:

sudo echo "deb http://packages.elastic.co/kibana/4.4/debian stable main" | sudo tee -a /etc/apt/sources.list 

Обновляем репозиторий и устанавливаем:

sudo apt-get update && sudo apt-get install kibana 

sudo update-rc.d kibana defaults 95 10 

Запускаем:

sudo service kibana start 

Подключаемся:

http://ip_elk-server-qq.qu:5601 

image

Нас просят создать первый индекс, но мы пока оставляем всё как есть и переходим к настройке клиентов.

Beats

Ставим на клиенты. Для начала, на сервер скачаем и поставим несколько готовых дашбордов Kibana с индексами Beats:

cd ~/ELK/releases/beats/ sudo curl -L -O http://download.elastic.co/beats/dashboards/beats-dashboards-1.1.0.zip sudo unzip beats-dashboards-1.1.0.zip cd beats-dashboards-1.1.0/ ./load.sh 

Заходим в web:

http://ip_address_elk_server:5601 

И видим что были добавлены дашборды Kibana с индексами Beats:

image

Topbeat 1.1.0 (Linux)

Получение данных об инфраструктуре сервера.
Передаёт информацию о работе процессора, использованию памяти. Для каждого процесса отображается информации о родители, pid, состояние и т.д. Также Topbeat позволяет просматривать информацию о файловой системе — состояние дисков, объём свободного пространства и т.д.

Установка (на клиенте):

cd ~/ELK/releases/beats/topbeat/ sudo curl -L -O https://download.elastic.co/beats/topbeat/topbeat_1.1.0_amd64.deb sudo dpkg -i topbeat_1.1.0_amd64.deb 

На сервер нужно добавить шаблоны индексов Topbeat чтобы Elasticsearch стал правильно анализировать информацию на входе:

sudo curl -XPUT 'http://localhost:9200/_template/topbeat' -d@/etc/topbeat/topbeat.template.json 

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

{"acknowledged":true}

Файл topbeat.template.json создаётся при установке Topbeat и имеет расположение по умолчанию /etc/topbeat/topbeat.template.json. Поэтомоу если на сервере ELK мы по каким то причинам не будем устанавливать клиенты Beats, то нам необходимо будет скопировать этот шаблон с клиента на сервер, либо создать этот файл на сервере и скопировать туда его содержимое (с клиента). И далее его загрузить curl -XPUT ‘адрес_сервер_elk:9200/_template/topbeat’ -d@/PATH/topbeat.template.json.
Но будем считать что Битсы установлены на сервер и имеют следующее месторасположение /etc/topbeat/topbeat.template.json.

Редактируем конфиг (на клиенте):

sudo vi /etc/topbeat/topbeat.yml 

В блоке output нужно за комментировать обращение к elasticsearch, т.к мы будем использоватеть logstash:

### Elasticsearch as output   #elasticsearch:     #hosts: ["localhost:9200"] 

Раскомментируем блок с Logstash, укажем его IP-адресс и порт:

  logstash:     hosts: ["IP_address_elk-server:5044"] 

Важно: не используйте табуляцию для передвижения курсора в конфиге! Только пробелы. Иначе получите ошибку:

Loading config file error: YAML config parsing failed on /etc/topbeat /topbeat.yml: yaml: line 14: found character that cannot start any token. Exiting. 

Если сервер Logstash находится во внешней сети, то на фаерволле удалённого сервера нужно настроить форвардиг порта, в данном случаем 5044 (tcp/udp).
Дополнительные опции логирования хорошо описаны в в конфигах.

Запускаем сервис:

sudo /etc/ini.d/topbeat start 

Открываем интерфейс Kibana и наблюдаем поступающую информацию:

image

Filebeat 1.1.0 (LINUX)

Транслирует на сервер информацию из динамических файлов, которые мы будем указывать:

Устанвока:

cd ~/ELK/releases/beats/filebeat/ sudo curl -L -O https://download.elastic.co/beats/filebeat/filebeat_1.1.0_amd64.deb sudo dpkg -i filebeat_1.1.0_amd64.deb 

Добавим индексы на сервере (по аналогии с как мы настраивали Topbeat. Т.е. если на сервере шаблон отсутствует — мы его создаём):

sudo curl -XPUT 'http://localhost:9200/_template/filebeat?pretty' -d@/etc/filebeat/filebeat.template.json 

Открываем конфиг:

sudo vi /etc/topbeat/filebeat.yml 

Указываем из каких файлов будем забирать информацию (по умолчанию стоят все файлы из /var/log c расширение .log):

prospectors:        paths:         - /var/log/*.log  

Указываем то, что нужно нам на данном клиенте, например:

paths:       # - /var/log/*.log         - /var/log/elasticsearch/*.log         - /var/log/syslog         - /var/log/nginx/*.log       # - c:\programdata\elasticsearch\logs\* 

Помните про отсутствие табуляции в коде!

Мы также будем использовать logstash для обработки индексов:

### Elasticsearch as output   #elasticsearch:     # Array of hosts to connect to.     # Scheme and port can be left out and will be set to the default (http and 9200)     # In case you specify and additional path, the scheme is required: http://localhost:9200/path     # IPv6 addresses should always be defined as: https://[2001:db8::1]:9200     #hosts: ["localhost:9200"] ...   ### Logstash as output   logstash:     # The Logstash hosts     hosts: ["IP_address_elk-server:5044"] 

Запустим:

sudo /etc/ini.d/filebeat start 

Смотрим информацию от Filebeat:

image

Packetbeat 1.1.0 (Linux)

Очень полезный инструмент. Анализирует трафик между серверами. Моментально выявляет ошибки. Анализирует протоколы DNS, HTTP, MySQL, PostgreSQL, КЗС, Memcache и другие.

Настраивается по той же аналогии что и Topbeat/Filebeat:

sudo apt-get install libpcap0.8 sudo curl -L -O https://download.elastic.co/beats/packetbeat/packetbeat_1.1.0_amd64.deb sudo dpkg -i packetbeat_1.1.0_amd64.deb 

Редактируем кофиг (комментируем Elasticsearch и настраиваем Logstash)
output:

   #elasticsearch:        #hosts: ["localhost:9200"]      logstash:          hosts: ["IP_address_elk-server:5044""] 

Идём на сервер и добавляем индекс для Packetbeat:

sudo curl -XPUT 'http://localhost:9200/_template/packetbeat' -d@/etc/packetbeat/packetbeat.template.json 

Запускаем:

sudo /etc/ini.d/packetbeat start 

Winlogbeat (Windows)

Скачиваем www.elastic.co/downloads/beats/winlogbeat. Распаковываем в C:\ и переименовываем в Winlogbeat. Запускаем PowerShell от админа и устанавливаем сервис:

PS C:\Users\Administrator> cd 'C:\Winlogbeat' PS C:\Winlogbeat> .\install-service-winlogbeat.ps1 

Если мы видим сообщение о том что скрипты отключены в системе по умолчанию (а так оно и будет), то мы просто создаём политику для Winlogbeat:

PowerShell.exe -ExecutionPolicy UnRestricted -File .\install-service-winlogbeat.ps1 

Security warning Run only scripts that you trust. While scripts from the internet can be useful, this script can potentially harm your computer. If you trust this script, use the Unblock-File cmdlet to allow the script to run without this warning message. Do you want to run C:\Program Files\Winlogbeat\install-service-winlogbeat.ps1? [D] Do not run  [R] Run once  [S] Suspend  [?] Help (default is "D"): R  Status   Name               DisplayName ------   ----               ----------- Stopped  winlogbeat         winlogbeat 

Перед стартом сервиса правим в конфиге — C:\Winlogbeat\winlogbeat.yml.

output:    #elasticsearch:    #    hosts: localhost:9200     logstash:         hosts: ["IP_address_elk-server:5044"] 

В блоку event_logs перечислены основные журналы системы, которые нужно транспортировать на Logstash:

winlogbeat:   registry_file: C:/ProgramData/winlogbeat/.winlogbeat.yml   event_logs:     - name: Application     - name: Security     - name: System logging:   to_files: true   files:     path: C:/winlogbeat/winlogbeat/Logs   level: info 

В event_logs можно добавить и другие журналы, список которых можно посмотреть так:

PS C:\Users\Administrator> Get-EventLog * 

Если система выше Vista, то можно указать каналы:

PS C:\Users\Administrator> Get-WinEvent -ListLog * | Format-List -Property LogName 

Далее нам нужно загрузить на сервер индексы для winlogbeat как мы это делали для topbeat, filebeat, packetbeat. Это можно сделать удалённо:

PS C:\Winlogbeat> Invoke-WebRequest -Method Put -InFile winlogbeat.template.json -Uri http://IP_address_elk-server:9200/_template/winlogbeat?pretty 

Есть есть проблемы такого метода, то можно сделать следующее:

Создаём на сервере файл индекса winlogbeat.template.json
sudo vi ~/ELK/releases/beats/winlogbeat/winlogbeat.template.json. На клиенте Windows открываем файл C:\winlogbeat\winlogbeat.template.json и копируем его содержимое в файл ~/ELK/releases/beats/winlogbeat/winlogbeat.template.json.

{   "mappings": {     "_default_": {       "_all": {         "enabled": true,         "norms": {           "enabled": false         }       },       "dynamic_templates": [         {           "template1": {             "mapping": {               "doc_values": true,               "ignore_above": 1024,               "index": "not_analyzed",               "type": "{dynamic_type}"             },             "match": "*"           }         }       ],       "properties": {         "@timestamp": {           "type": "date"         },         "message": {           "index": "analyzed",           "type": "string"         }       }     }   },   "settings": {     "index.refresh_interval": "5s"   },   "template": "winlogbeat-*" }  

Далее (на сервере) загружаем этот индекс на elasticsearch, для того чтобы он смог верно проанализировать информацию и предоставить её привычном формате:
Переходим в каталог где у нас лежит созданный файл winlogbeat.template.json.

cd ~/ELK/releases/beats/winlogbeat ll итого 12 drwxr-xr-x 2 root root 4096 февр.  8 23:10 ./ drwxr-xr-x 7 root root 4096 февр.  8 16:00 ../ -rw-r--r-- 1 root root  729 февр.  8 23:10 winlogbeat.template.json # Загружаем индекс sudo curl -XPUT 'http://localhost:9200/_template/winlogbeat' -d@winlogbeat.template.json 

На выходе должно быть:

{"acknowledged":true}

Идём на клиент и запускаем сервис winlogbeat. После это начинаем мониторить данные через Kibana, определяя представление по загруженным индексам:

image

Смотрим дашборды:

image

Идексы и логи

Просмотр индексов:

curl 'localhost:9200/_cat/indices?v'  

Удаление всех индексов:

curl -XDELETE 'localhost:9200/*' 

Вместо * можно указать неугодный индекс, например:

curl -XDELETE ‘localhost:9200/winlogbeat-2016.02.10’

Для удаление старых логов не обходимо установить «питоновский» модуль:

pip install elasticsearch-curator 

Если pip не установлен, то устанавливаем:

apt-get install python-pip 

Настраиваем Cron:

crontab -e 

#Удалять индексы если они превысили 5 Гигабайт: 20 0 20 0 * * * root /usr/local/bin/curator --host localhost delete --disk-space 5 >/dev/null  # Удалять индексы старше, например, 30 дней: 20 0 * * * root /usr/local/bin/curator --host localhost delete --older-than 30 >/dev/null 

Посмотреть ноды:

curl 'localhost:9200/_cat/nodes?v' 

Посмотерть статус работы Elasticsearch:

curl 'localhost:9200/_cat/health?v' 

На этом всё.

Этого достаточно чтобы запустить полноценный лог-сервер, раскидать на клиенты транспортёры и понять принципы.

Дополнительные настройки (оптимизация, настройки geoip и т.д.) описаны в официальной документации и конфигах.

ссылка на оригинал статьи https://habrahabr.ru/post/277029/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *