Встал вопрос централизованного хранения и обработки журналов с серверов на базе Linux и Windows. Мой выбор пал на продукты от Elastic.
Большинство прочитанных статей на тему установки приложений Elastic показались мне достаточно расплывчатыми и неполными.
Основной и единственный источник информации, который я использовал: www.elastic.co/guide/index.html.
Этот мануал конечно не является исчерпывающим, но является достаточным для первоначальной установки и настройки рабочего лог-сервера elasticsearch+logtash+kibana4+beats (windows\linux-агенты).
Подробная информация, дополнительные возможности, а также «реал кунг-фу» доступны в официальной документации.
От слов к делу.
Описывать установку Ubuntu Server я не буду, на тему этого доступна исчерпывающая информация в сети.
Обновляемся:
Редактируем hosts и hostname:
Устанавливаем Java 8:
Создаём каталоги, которые нам понадобятся для фасовки пакетов:
Большинство прочитанных статей на тему установки приложений 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) версию:
Устанавливаем:
Редактируем конфиг /etc/elasticsearch/elasticsearch.yml:
Раскомментируем и отредактируем стоки cluster.name и node.name:
(вместо «elk-server.ss.lu» и «mynodename» можете вставьте свои значения)
Должно получится так:
Добавляем в автозагрузку:
Запускаем:
Проверяем:
Правильный вывод:
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: mynodename
Добавляем в автозагрузку:
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 и устанавливаем:
Создаём INPUT-файл для «битсов»…
… и копируем туда код:
Это будет означать что logstash начнёт слушать порт 5044. Данный порт является по умолчанию для этой версии и будет прописан по умолчанию в битсах. Можете задать любой другой.
Создаём OUTPUT-файл…
… и копируем туда код для связи с elasticsearch:
Проверяем конфиг на ошибки, запускаем, и вносим в автозапуск:
Проверяем порт:
Пример успешной работы:
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.ss.lu:5601
Нас просят создать первый индекс, но мы пока оставляем всё как есть и переходим к настройке клиентов.
Beats
Ставим на клиенты. Для начала, на сервер скачаем и поставим несколько готовых дашбордов Kibana с индексами Beats:
Заходим в web:
И видим что были добавлены дашборды 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_elk-server.ss.lu:5601
И видим что были добавлены дашборды Kibana с индексами Beats:
Topbeat 1.1.0 (Linux)
Получение данных об инфраструктуре сервера.
Передаёт информацию о работе процессора, использованию памяти. Для каждого процесса отображается информации о родители, pid, состояние и т.д. Также Topbeat позволяет просматривать информацию о файловой системе — состояние дисков, объём свободного пространства и т.д.
Установка (на клиенте):
На сервер нужно добавить шаблоны индексов Topbeat чтобы Elasticsearch стал правильно анализировать информацию на входе:
При успешной загрузки мы должны увидеть:
Файл 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.
Редактируем конфиг (на клиенте):
В блоке output нужно за комментировать обращение к elasticsearch, т.к мы будем использоватеть logstash:
Раскомментируем блок с Logstash, укажем его IP-адресс и порт:
Важно: не используйте табуляцию для передвижения курсора в конфиге! Только пробелы. Иначе получите ошибку:
Если сервер Logstash находится во внешней сети, то на фаерволле удалённого сервера нужно настроить форвардиг порта, в данном случаем 5044 (tcp/udp).
Дополнительные опции логирования хорошо описаны в конфигах.
Запускаем сервис:
Открываем интерфейс Kibana и наблюдаем поступающую информацию:
Передаёт информацию о работе процессора, использованию памяти. Для каждого процесса отображается информации о родители, 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_elk-server.ss.lu: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 и наблюдаем поступающую информацию:
Filebeat 1.1.0 (LINUX)
Транслирует на сервер информацию из динамических файлов, которые мы будем указывать:
Устанвока:
Добавим индексы на сервере (по аналогии с как мы настраивали Topbeat. Т.е. если на сервере шаблон отсутствует — мы его создаём):
Открываем конфиг:
Указываем из каких файлов будем забирать информацию (по умолчанию стоят все файлы из /var/log c расширение .log):
Указываем то, что нужно нам на данном клиенте, например:
Помните про отсутствие табуляции в коде!
Мы также будем использовать logstash для обработки индексов:
Запустим:
Смотрим информацию от Filebeat:
Устанвока:
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/filebeat/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_elk-server.ss.lu:5044"]
Запустим:
sudo /etc/init.d/filebeat start
Смотрим информацию от Filebeat:
Packetbeat 1.1.0 (Linux)
Очень полезный инструмент. Анализирует трафик между серверами. Моментально выявляет ошибки. Анализирует протоколы DNS, HTTP, MySQL, PostgreSQL, КЗС, Memcache и другие.
Настраивается по той же аналогии что и Topbeat/Filebeat:
Редактируем кофиг (комментируем Elasticsearch и настраиваем Logstash)
output:
Идём на сервер и добавляем индекс для Packetbeat:
Запускаем:
Настраивается по той же аналогии что и 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_elk-server.ss.lu: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 от админа и устанавливаем сервис:
Если мы видим сообщение о том что скрипты отключены в системе по умолчанию (а так оно и будет), то мы просто создаём политику для Winlogbeat:
Перед стартом сервиса правим в конфиге — C:\Winlogbeat\winlogbeat.yml.
В блоку event_logs перечислены основные журналы системы, которые нужно транспортировать на Logstash:
В event_logs можно добавить и другие журналы, список которых можно посмотреть так:
Если система выше Vista, то можно указать каналы:
Далее нам нужно загрузить на сервер индексы для winlogbeat как мы это делали для topbeat, filebeat, packetbeat. Это можно сделать удалённо:
Есть есть проблемы такого метода, то можно сделать следующее:
Создаём на сервере файл индекса 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.
Далее (на сервере) загружаем этот индекс на elasticsearch, для того чтобы он смог верно проанализировать информацию и предоставить её привычном формате:
Переходим в каталог где у нас лежит созданный файл winlogbeat.template.json.
На выходе должно быть:
Идём на клиент и запускаем сервис winlogbeat. После это начинаем мониторить данные через Kibana, определяя представление по загруженным индексам:
Смотрим дашборды:
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_elk-server.ss.lu: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, определяя представление по загруженным индексам:
Смотрим дашборды:
Идексы и логи
Просмотр индексов:
Удаление всех индексов:
Вместо * можно указать неугодный индекс, например:
curl -XDELETE 'localhost:9200/winlogbeat-2016.02.10'
Для удаление старых логов не обходимо установить «питоновский» модуль:
Если pip не установлен, то устанавливаем:
Настраиваем Cron:
Посмотреть ноды:
Посмотерть статус работы Elasticsearch:
На этом всё.
Этого достаточно чтобы запустить полноценный лог-сервер, раскидать на клиенты транспортёры и понять принципы.
Дополнительные настройки (оптимизация, настройки geoip и т.д.) описаны в официальной документации и конфигах.
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 и т.д.) описаны в официальной документации и конфигах.