Встал вопрос централизованного хранения и обработки журналов с серверов на базе Linux и Windows. Мой выбор пал на продукты от Elastic.
Большинство прочитанных статей на тему установки приложений Elastic показались мне достаточно расплывчатыми и неполными.
Основной и единственный источник информации, который я использовал: www.elastic.co/guide/index.html.
Этот мануал конечно не является исчерпывающим, но является достаточным для первоначальной установки и настройки рабочего лог-сервера elasticsearch+logtash+kibana4+beats (windowslinux-агенты).
Подробная информация, дополнительные возможности, а также «реал кунг-фу» доступны в официальной документации.
От слов к делу.
Будем собирать и склеивать
- 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
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"
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
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
Нас просят создать первый индекс, но мы пока оставляем всё как есть и переходим к настройке клиентов.
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:
Передаёт информацию о работе процессора, использованию памяти. Для каждого процесса отображается информации о родители, 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 и наблюдаем поступающую информацию:
Устанвока:
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:programdataelasticsearchlogs*
Помните про отсутствие табуляции в коде!
Мы также будем использовать 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/ini.d/filebeat start
Смотрим информацию от Filebeat:
Настраивается по той же аналогии что и 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
PS C:UsersAdministrator> 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 FilesWinlogbeatinstall-service-winlogbeat.ps1?
[D] Do not run [R] Run once [S] Suspend [?] Help (default is "D"): R
Status Name DisplayName
------ ---- -----------
Stopped winlogbeat winlogbeat
Перед стартом сервиса правим в конфиге — C:Winlogbeatwinlogbeat.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:UsersAdministrator> Get-EventLog *
Если система выше Vista, то можно указать каналы:
PS C:UsersAdministrator> 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:winlogbeatwinlogbeat.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 '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 и т.д.) описаны в официальной документации и конфигах.
Автор: lwxroot