ELK: установка Elasticsearch+Logstash+Kibana на CentOS

Автор: | 09/09/2015

elk-logosElasticsearch + Logstash + Kibana – система централизованного хранения и просмотра логов.

Установка выполняется на CentOS 6.6.

Система состоит из 4-х компонентов:

  • Logstash – сервер обработки входящих логов;
  • Logstash Forwarder – служба передачи логов с удалённого хоста на центральный сервер Logstash (будет рассмотрен в следующей части);
  • Elasticsearch – хранение логов;
  • Kibana – веб-интерфейс для просмотра и анализа логов.

Продолжение – в ELK: Elasticsearch+Logstash+Kibana — добавление удалённого хоста и настройка Logstash Forwarder.

Вот как будет выглядеть схема:

elk-infrastructure

Установка Java

Для работы Elasticsearch и Logstash требуется Java.

Установка описана тут>>>, только уже 8 версия:

# rpm -ivh /home/ec2-user/jdk-8u60-linux-x64.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:jdk1.8.0_60-2000:1.8.0_60-fcs    ################################# [100%]
Unpacking JAR files...
        tools.jar...
        plugin.jar...
        javaws.jar...
        deploy.jar...
        rt.jar...
        jsse.jar...
        charsets.jar...
        localedata.jar...
        jfxrt.jar...
# alternatives --install /usr/bin/java java /usr/java/jdk1.8.0_60/jre/bin/java 1

Установка Elasticsearch

Добавляем ключ:

# rpm --import http://packages.elasticsearch.org/GPG-KEY-elasticsearch

Добавляем репозиторий – создаём файл /etc/yum.repos.d/elasticsearch.repo с таким содержимым:

[elasticsearch-1.4]
name=Elasticsearch repository for 1.4.x packages
baseurl=http://packages.elasticsearch.org/elasticsearch/1.4/centos
gpgcheck=1
gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
enabled=1

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

# yum install elasticsearch

Редактируем файл /etc/elasticsearch/elasticsearch.yml, и ограничиваем доступ только с localhost:

...
network.host: localhost
...

Запускаем:

# service elasticsearch start
Starting elasticsearch:                                    [  OK  ]

И добавляем в автозапуск:

# chkconfig --add elasticsearch
# chkconfig --list elasticsearch
elasticsearch   0:off   1:off   2:on    3:on    4:on    5:on    6:off

Установка Kibana

На странице загрузок>>> находим подходящую вверсию, в данном случае – LINUX 64-BIT, загружаем:

# cd /opt/
# wget https://download.elastic.co/kibana/kibana/kibana-4.1.1-linux-x64.tar.gz
# tar xfp kibana-4.1.1-linux-x64.tar.gz
# mv kibana-4.1.1-linux-x64 kibana4

Редактируем файл /opt/kibana4/config/kibana.yml, и тоже ограничиваем доступ только с localhost:

...
# The host to bind the server to.
host: "localhost"
...

Создаём init-скрипт – /etc/init.d/kibana (проверьте переменные, что бы пути совпадали с вашей системой/установкой):

#!/bin/sh
#
# /etc/init.d/kibana -- startup script for kibana
# Wolfyxvf 2015-04-16; used httpd init script as template
#
### BEGIN INIT INFO
# Provides:          kibana
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Starts kibana
# Description:       Starts kibana using daemon
### END INIT INFO

#configure this with wherever you unpacked kibana:
KIBANA_BIN=/opt/kibana4/bin
KIBANA_LOG="/var/log/kibana.log"

NAME=kibana
DESC="Kibana"
PID_FOLDER=/var/run/kibana/
PID_FILE=/var/run/kibana/$NAME.pid
LOCK_FILE=/var/lock/subsys/$NAME
PATH=/bin:/usr/bin:/sbin:/usr/sbin:$KIBANA_BIN
DAEMON=$KIBANA_BIN/kibana
RETVAL=0

if [ `id -u` -ne 0 ]; then
        echo "You need root privileges to run this script"
        exit 1
fi

# Source function library.
. /etc/rc.d/init.d/functions

if [ -f /etc/sysconfig/kibana ]; then
        . /etc/sysconfig/kibana
fi

start() {
        echo "Starting $DESC : "

        pid=`pidofproc -p $PID_FILE kibana`
        if [ -n "$pid" ] ; then
                echo "Already running."
                exit 0
        else
        # Start Daemon
                if [ ! -d "$PID_FOLDER" ] ; then
                        mkdir $PID_FOLDER
                fi

                daemon $DAEMON >> $KIBANA_LOG 2>&1 &
                sleep 2
                pidofproc node > $PID_FILE
                echo
                RETVAL=$?
                [ $RETVAL = 0 ] && touch $LOCK_FILE
                return $RETVAL
        fi
}

stop() {
        echo -n $"Stopping $DESC : "
        killproc -p $PID_FILE $DAEMON
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && rm -f $PID_FILE $LOCK_FILE
}


# See how we were called.
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  status)
        status -p $PID_FILE $DAEMON
        RETVAL=$?
        ;;
  restart)
        stop
        start
        ;;
  *)
        echo $"Usage: $prog {start|stop|restart|status}"
        RETVAL=2
esac

exit $RETVAL
# chmod +x /etc/init.d/kibana

Проверяем:

# service kibana status
kibana is stopped

Запускаем:

# service kibana start
Starting Kibana :
# chkconfig --add kibana

Проверяем:

# tail /var/log/kibana.log
{"name":"Kibana","hostname":"ip-172-30-0-69","pid":22999,"level":30,"msg":"No existing kibana index found","time":"2015-09-08T11:17:38.615Z","v":0}
{"name":"Kibana","hostname":"ip-172-30-0-69","pid":22999,"level":30,"msg":"Listening on 127.0.0.1:5601","time":"2015-09-08T11:17:38.628Z","v":0}

Установка NGINX

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

# yum -y install epel-release

Устанавливаем NGINX и утилиты:

# yum install nginx httpd-tools

Создаём пользователя для доступа к Kibana:

# htpasswd -c /etc/nginx/htpasswd.users kibanaadmin
New password:
Re-type new password:
Adding password for user kibanaadmin

Создаём файл настроек виртуалхоста логгера, например /etc/nginx/conf.d/logger.domain.com.conf:

server {
    listen 80;

    server_name logger.domain.com;

    auth_basic "Restricted Access";
    auth_basic_user_file /etc/nginx/htpasswd.users;

    location / {
        proxy_pass http://localhost:5601;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

Проверяем, запускаем, добавляем в автозапуск:

# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# service nginx start
Starting nginx:                                            [  OK  ]
# chkconfig --add nginx

Теперь можно проверить URL:

kibana_1

Ничего не меняем, продолжаем установку.

Установка Logstash

Добавляем репозиторий – в файл /etc/yum.repos.d/logstash.repo добавляем:

[logstash-1.5]
name=logstash repository for 1.5.x packages
baseurl=http://packages.elasticsearch.org/logstash/1.5/centos
gpgcheck=1
gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
enabled=1

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

# yum install logstash

Создаём SSL-сертификаты для Logstash Forwarder (будут нужны позже):

# cd /etc/pki/tls
# openssl req -subj '/CN=domain.com/' -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt

Проверяем:

# ls -l certs/ | grep log
-rw-r--r-- 1 root root    1180 Sep  8 11:48 logstash-forwarder.crt
# ls -l private/ | grep log
-rw-r--r-- 1 root root 1704 Sep  8 11:48 logstash-forwarder.key

Что бы Logstash имел доступ к файлам в /var/log/, которые обычно принадлежат root:root:

# getfacl /var/log/maillog
getfacl: Removing leading '/' from absolute path names
# file: var/log/maillog
# owner: root
# group: root
user::rwx
group::rwx
other::rwx

Что приведёт к ошибкам вида:

:message=>”failed to open /var/log/maillog: Permission denied – /var/log/maillog”, :level=>:warn}

Создаём файл defaults (в данном случае – /opt/logstash/vendor/jruby/lib/ruby/shared/rubygems/defaults/logstash, или /etc/logstash/defaults – если устанавливали другим способом), в который прописываем:

LS_GROUP=root

На этом установка необходимых компонентов закончена, можно переходить к настройке Logstash.

Настройка  Logstash

Создаём файл /etc/logstash/conf.d/rsyslog.conf:

input {
  file {
    path => [ "/var/log/maillog" ]
    type => "syslog"
    start_position => "beginning"
  }
}

filter {
    if [type] == "syslog" {
        grok {
            match => [ "message", "%{HOSTNAME}" ]
        }
    }
}

output {
    elasticsearch { host => localhost }
}

Кратко рассмотрим что тут выполняется:

  • input – обработка входящих данных, использует модуль file, описывающий входящие данные; в данном случае – данные мы получаем из файла;
  • filter – обработка полученных от input данных, использует модуль grok, определяющий какие данные будут проиндексирвоаны и добавлены (данные тип message в которых встречается шаблон %{HOSTNAME}, шаблоны описаны в файле grok-patterns, в данном случае он находится в /opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-0.3.0/patterns/grok-patterns);
  • output – передаёт данные, прошедшие фильтр, на “backend”, в данном случае – в Elasticserch, из которого данные потом появляются в Kibana.

Проверяем синтаксис файла конфигурации:

# /opt/logstash/bin/logstash --configtest -f /etc/logstash/conf.d/rsyslog.conf

Перезапускаем Logstash:

# service logstash restart
logstash started.

Настройка Kibana

Теперь можно добавить данные в веб-интерфейс.

Переходим на страницу Kibana,  и добавляем новый индекс, который позволит Kibana работать с индексами Elasticsearch:

kibana_2

После чего переходим в Discover – и наблюдаем логи:

kibana_3

Продолжение – в ELK: Elasticsearch+Logstash+Kibana — добавление удалённого хоста и настройка Logstash Forwarder.

Ссылки по теме

http://blog.sematext.com/2013/12/19/getting-started-with-logstash/

https://www.elastic.co/products/logstash

https://www.digitalocean.com/community/tutorials/how-to-install-elasticsearch-logstash-and-kibana-4-on-centos-7

http://habrahabr.ru/post/122531/

http://grokdebug.herokuapp.com/

https://www.digitalocean.com/community/tutorials/how-to-use-kibana-dashboards-and-visualizations

https://www.elastic.co/guide/en/beats/packetbeat/current/_kibana_query_and_filter.html

https://www.elastic.co/guide/en/kibana/3.0/queries.html