Система сбора логов ELK на Centos 7

Система ELK состоит из трех основных компонентов:
  • Logstash — система принимающая данные, фильтрующая их и передающая их дальше.
  • Elasticsearch — NoSQL база данных, которая хранит информацию и осуществляет по ней поиск.
  • Kibana — служит для визуального представления данных, хранящихся в Elasticsearch.
В данном мануале я рассматриваю базовую настройку стека ELK.
В качестве сервера была выбрана такая конфигурация:
OS: Centos 7 minimal
Proc: 2 ядря
Ram: 4 Gb
HDD: 50 Gb
Во время установки настраиваем сеть, время, создаем пользователя.
Установку начнем с обновления системы:
# yum -y update
Далее добавим EPEL репозитарий:
# yum -y install epel-release
Для удобства работы я устанавливаю некоторые пакеты:
yum -y install net-tools vim mc wget unzip
Дальше пропишите правильные имена в файлы /etc/hosts и /etc/hostname

 

Установка Java.
Elasticsearch и Logstash для работы требуют Java, поэтому следующим шагом установим её.
На текущий момент последняя версия Java 8 Update 102
# cd ~
# mkdir tmp
# cd ~/tmp
# wget --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u102-b14/jdk-8u102-linux-x64.rpm
# yum localinstall jdk-8u102-linux-x64.rpm
Проверим
# java -version
java version «1.8.0_102»
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)
Установка Elasticsearch.
Добавим репозиторий:
# vim /etc/yum.repos.d/elasticsearch.repo
Вставляем следующие строчки:
[elasticsearch]
name=Elasticsearch repository
baseurl=http://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
сохраняем и выходим.
Далее установим сам elasticsearch:
# yum -y install elasticsearch
После установки отредактируем файл с настройками:
# vim /etc/elasticsearch/elasticsearch.yml
У меня он выглядит так:
elasticsearch.yml
# ======================== Elasticsearch Configuration =========================
#
# NOTE: Elasticsearch comes with reasonable defaults for most settings.
#       Before you set out to tweak and tune the configuration, make sure you
#       understand what are you trying to accomplish and the consequences.
#
# The primary way of configuring a node is via this file. This template lists
# the most important settings you may want to configure for a production cluster.
#
# Please see the documentation for further information on configuration options:
# <http://www.elastic.co/guide/en/elasticsearch/reference/current/setup-configuration.html>
#
# ———————————- Cluster ————————————
#
# Use a descriptive name for your cluster:
#
     cluster.name: elk.corp.ru
#
# ———————————— Node ————————————
#
# Use a descriptive name for the node:
#
     node.name: elk
#
# Add custom attributes to the node:
#
# node.rack: r1
#
# ———————————— Paths ————————————
#
# Path to directory where to store the data (separate multiple locations by comma):
#
# path.data: /path/to/data
#
# Path to log files:
#
# path.logs: /path/to/logs
#
# ———————————— Memory ————————————
#
# Lock the memory on startup:
#
# bootstrap.mlockall: true
#
# Make sure that the `ES_HEAP_SIZE` environment variable is set to about half the memory
# available on the system and that the owner of the process is allowed to use this limit.
#
# Elasticsearch performs poorly when the system is swapping the memory.
#
# ———————————- Network ————————————
#
# Set the bind address to a specific IP (IPv4 or IPv6):
#
     network.host: localhost
#
# Set a custom port for HTTP:
#
# http.port: 9200
#
# For more information, see the documentation at:
# <http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-network.html>
#
# ——————————— Discovery ———————————-
#
# Pass an initial list of hosts to perform discovery when new node is started:
# The default list of hosts is [«127.0.0.1», «[::1]»]
#
# discovery.zen.ping.unicast.hosts: [«host1», «host2»]
#
# Prevent the «split brain» by configuring the majority of nodes (total number of nodes / 2 + 1):
#
# discovery.zen.minimum_master_nodes: 3
#
# For more information, see the documentation at:
# <http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery.html>
#
# ———————————- Gateway ————————————
#
# Block initial recovery after a full cluster restart until N nodes are started:
#
# gateway.recover_after_nodes: 3
#
# For more information, see the documentation at:
# <http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-gateway.html>
#
# ———————————- Various ————————————
#
# Disable starting multiple nodes on a single system:
#
# node.max_local_storage_nodes: 1
#
# Require explicit names when deleting indices:
#
# action.destructive_requires_name: true
Добавим elasticsearch в автозагрузку и запустим его:
# systemctl enable elasticsearch
# systemctl start elasticsearch
Проверим его работоспособность:
# curl -X GET http://localhost:9200
{
  «name» : «elk»,
  «cluster_name» : «elk.corp.ru»,
  «version» : {
    «number» : «2.4.0»,
    «build_hash» : «ce9f0c7394dee074091dd1bc4e9469251181fc55»,
    «build_timestamp» : «2016-08-29T09:14:17Z»,
    «build_snapshot» : false,
    «lucene_version» : «5.5.2»
  },
  «tagline» : «You Know, for Search»
}
Установка Logstash.
Добавим репозиторий:
# vim /etc/yum.repos.d/logstash.repo
Вставляем следующие строчки:
[logstash-2.x]
name=Logstash repository for 2.x.x packages
baseurl=https://packages.elastic.co/logstash/2.4/centos
gpgcheck=1
gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
сохраняем и выходим.
Устанавливаем logstash
# yum -y install logstash
Перейдем к настройке logstash.
В каталоге /etc/logstash/conf.d/ создадим файл с конфигом:
# vim /etc/logstash/conf.d/config.conf
Этот файл будет состоять из трех основных секций:
1) input — Это порты и протоколы, которые слушает logstash и соответственно принимает данные.
2) filter — В этой секции могут проводиться какие-либо действия с принятой информацией (выборка, модификация и т.д.)
3) output — В этой секции прописываются параметры выгрузки полученной информации, например в нашем случае это будет передача её в elasticsearch.
Рассмотрим простейший вариант — получение данных по syslog и передача их в elasticsearch. Так будет выглядеть файл config.conf :
input {
       udp {
    port => 5514
    type => «syslog»
           }
       }
output {
  elasticsearch {
    hosts => [«localhost:9200»]
    sniffing => true
    manage_template => false
    index => «syslog-%{+YYYY.MM.dd}»
    document_type => «%{type}»
                 }
        }
 Здесь используется нестандартный порт 5514 (syslog обычно на 514), т.к. что бы открыть стандартный порт, нужно запускать logstash от root. (подробнее тут)
После любых изменений конфига logstash, делайте его проверку
# service logstash configtest
Если все ок, добавим logstash в автозагрузку и запустим его:
# systemctl enable logstash
# systemctl start logstash
Немного подождав, проверим, что порт слушается
# netstat -ntulp | grep 5514
udp6       0      0 :::5514                 :::*                                22083/java
Установка Kibana.
Добавим репозиторий:
# vim /etc/yum.repos.d/kibana.repo
Вставляем следующие строчки:
[kibana-4.6]
name=Kibana repository for 4.6.x packages
baseurl=https://packages.elastic.co/kibana/4.6/centos
gpgcheck=1
gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
сохраняем и выходим.
Устанавливаем kibana
# yum -y install kibana
В конфиге kibana подправим одну строчку:
#  vim /opt/kibana/config/kibana.yml
Ищем нужную строчку правим и раскомментируем её:
server.host: «localhost»
Далее добавим kibana в автозагрузку и запустим её:
# systemctl enable kibana
# systemctl start kibana
Установка Nginx.
Для kibana нам нужен reverse proxy, поэтому установим Nginx:
# yum -y install nginx httpd-tools
Создадим пользователя для web интерфеса kibana:
# htpasswd -c /etc/nginx/htpasswd.users admin
Далее настроим Nginx
# vim /etc/nginx/nginx.conf
nginx.conf
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
worker_connections 1024;
}

http {
log_format main ‘$remote_addr — $remote_user [$time_local] «$request» ‘
‘$status $body_bytes_sent «$http_referer» ‘
‘»$http_user_agent» «$http_x_forwarded_for»‘;

access_log /var/log/nginx/access.log main;

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;

include /etc/nginx/mime.types;
default_type application/octet-stream;

# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
}
# server {
# listen 80 default_server;
# listen [::]:80 default_server;
# server_name _;
# root /usr/share/nginx/html;

# Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;

# location / {
# }

# error_page 404 /404.html;
# location = /40x.html {
# }

# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
# }

# Settings for a TLS enabled server.
#
# server {
# listen 443 ssl http2 default_server;
# listen [::]:443 ssl http2 default_server;
# server_name _;
# root /usr/share/nginx/html;
#
# ssl_certificate «/etc/pki/nginx/server.crt»;
# ssl_certificate_key «/etc/pki/nginx/private/server.key»;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 10m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
#
# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# location / {
# }
#
# error_page 404 /404.html;
# location = /40x.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
# }

#}

Создаем файл настроек виртуального хоста
# vim /etc/nginx/conf.d/elk.corp.ru.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 в автозагрузку и запустим её:
# systemctl enable nginx
# systemctl start nginx
Проверим работу, зайдя через браузер по ссылке:
http://elk.corp.ru
elk_1
Но пока ничего тут настраивать не будем.

 

Установка Kibana Dashboards.
Kibana Dashboards это подготовленные представления для отображения данных с индексами Beats.
На сайте Elastic есть несколько клиентов (Windows, Linux, FileLinux и д.р.), вот для данных от них мы и установим готовые дашборды.
# cd ~/tmp/
# unzip beats-dashboards-1.3.1.zip
# cd beats-dashboards-1.3.1/
# ./load.sh
Обновив http://elk.corp.ru увидим новые индексы.
 elk_2
Работу с ними я рассмотрю в будущих статьях.
На этом связку ELK можно считать установленной!
Прямо сейчас можно отправлять логи syslog на 5514 порт. Ну и в качестве примера я направлю логи с D-link маршрутизатора и покажу как создать для них новый индекс.
На маршрутизаторе я прописываю в качестве syslog сервера elk.corp.ru, порт 5514 и протокол udp.
Далее заходим на http://elk.corp.ru и создаем новый индекс.
 elk_3
В качестве имени пропишем: syslog-*
elk_4
Так как в конфиге logstash, в блоке output мы всем логам присваивали имя, вида: syslog-%{+YYYY.MM.dd}
Это очень важный момент, т.к. если ELK не увидит у себя таких логов, то он и не даст создать индекс с таким именем.
 elk_5
Далее перейдем на вкладку Discover и увидим собираемые логи!

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

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