Сервер логов Elasticsearch + Logstash + Kibana4 + Beats(windows-linux). Установка и настройка

в 8:45, , рубрики: howto, ит-инфраструктура, сервер логов, системное администрирование

Встал вопрос централизованного хранения и обработки журналов с серверов на базе 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

Устанавливаем 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: 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 и устанавливаем:

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

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_elk-server.ss.lu: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_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 и наблюдаем поступающую информацию:

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: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:

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_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 от админа и устанавливаем сервис:

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, определяя представление по загруженным индексам:

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 и т.д.) описаны в официальной документации и конфигах.

Автор: lwxroot

Источник


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js