J3qx

information archive

Установка и настройка ELK 5 (elasticsearch+kibana+logstash+filebeat)

Posted by j3qx на Февраль 5, 2017

Авторhttps://denisitpro.wordpress.com/2017/02/05/установка-elasticsearchkibanalogstashfilebeat5/

Добрый день друзья, решил поделиться с общественностью статьей по настройки ELK 5. Решение написать указанную статью, возникла после прочтения множества других статей по ELK, которые написаны под Elk 2.4. Данная статья ориентирована в прежде всего для тех, кто только начинает работать с ELK и хочет получить рабочий стенд. Мне так же было необходимо разделить хранения данных инфраструктурных и данных nginx, во время решения этой задачи и появилась эта статья.

Основные отличия от множества других

  • Статья о Elasticsearch+Logstash+kibana+filebeat 5 версии, которая все же отличается от 2.4
  • При написании, я старался сразу делать более безопасную настройку ELK5, а не просто «оно включилось, значит работает»
  • При развертывании, сразу использовалась не совсем стандартная схема, когда часть логов хранится на второй ноде elasticsearch
  • Статья написана в формате HowTo, что подразумевает, выполняя последовательно шаги из статьи – вы получите рабочее решение.
  • Статья написана для схемы, когда часть логов хранится на вспомогательном elasticsearch
  • В большинстве статей, используется tls для защиты передаваемых данных, его можно «завести» и на версии 5, но все же лучше использовать SSL

Кому интересно, добро пожаловать под кат

Общие данные

Установка производилась на сервере с Centos 7.3 с 1vCPU, 8Gb ram и двумя дисками, первый — под систему, второй под данные. Предполагается, что вы имеете уже готовый и базово настроенный сервер

Описание демо стенда

elk-01 – основной сервер хранения инфраструктурных сервисов, с полным стеком elasticsearc+logstash+kibana хранит инфраструктурные логи и маршрутизирует логи nginx на elk-02
elk-02 – сервер с elasticsearc+kibana, хранит только логи nginx
server1 — рядовой сервер, с которого мы забираем логи

Важно использовать одинаковые версии ПО для всего стека. То есть если вы используете 5ю ветку, то не стоит агентов или другой компонент стека от версии 2.x, хотя это и может работать какое-то время. Ссылки на использованные материалы, приведены в самом конце статьи

Базовая настройка

Iptables
Хорошей практикой является использование firewall, в нашем случае это iptables. Хотя вы всегда можете оставить и стандартный firewalld – тут дело привычки

sudo systemctl stop firewalld
sudo systemctl disable firewalld

не сработают, если у вас Centos 7 Minimal
Устанавливаем дополнительные компоненты

sudo yum -y install iptables-services

Теперь можно добавить iptables в автозагрузку и запустить:

sudo systemctl enable iptables.service
sudo systemctl start iptables.service

Для управления правилами iptables я использую скрипт, тут тоже дело привычки. Создадим его:

sudo nano /etc/iptables.sh

#!/bin/bash
#
# Объявление переменных
export IPT=»iptables»

# Интерфейс который смотрит в интернет
export WAN=eth0

# Очистка всех цепочек iptables
$IPT -F
$IPT -F -t nat
$IPT -F -t mangle
$IPT -X
$IPT -t nat -X
$IPT -t mangle -X

# Установим политики по умолчанию для трафика, не соответствующего ни одному из правил
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP

# разрешаем локальный траффик для loopback
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT

# Разрешаем исходящие соединения самого сервера
$IPT -A OUTPUT -o $WAN -j ACCEPT

# Состояние ESTABLISHED говорит о том, что это не первый пакет в соединении.
# Пропускать все уже инициированные соединения, а также дочерние от них
$IPT -A INPUT -p all -m state —state ESTABLISHED,RELATED -j ACCEPT
# Пропускать новые, а так же уже инициированные и их дочерние соединения
$IPT -A OUTPUT -p all -m state —state ESTABLISHED,RELATED -j ACCEPT
# Разрешить форвардинг для уже инициированных и их дочерних соединений
$IPT -A FORWARD -p all -m state —state ESTABLISHED,RELATED -j ACCEPT

# Включаем фрагментацию пакетов. Необходимо из за разных значений MTU
$IPT -I FORWARD -p tcp —tcp-flags SYN,RST SYN -j TCPMSS —clamp-mss-to-pmtu

# Открываем порт для ssh
$IPT -A INPUT -i $WAN -p tcp —dport 22 -j ACCEPT

#ALLOW PING
$IPT -A INPUT -i $WAN -p icmp —icmp-type echo-request -j ACCEPT

# Записываем правила
/sbin/iptables-save > /etc/sysconfig/iptables
Сохраняем скрипт, делаем исполняемым и запускаем:

sudo chmod +x /etc/iptables.sh
sudo /etc/iptables.sh

Проверяем вывод

iptables -L -v -n

Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all — lo * 0.0.0.0/0 0.0.0.0/0
8 576 ACCEPT all — * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT tcp — eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
0 0 ACCEPT icmp — eth0 * 0.0.0.0/0 0.0.0.0/0 icmptype 8

Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 TCPMSS tcp — * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x06/0x02 TCPMSS clamp to PMTU
0 0 ACCEPT all — * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all — * lo 0.0.0.0/0 0.0.0.0/0
5 712 ACCEPT all — * eth0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all — * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
В дальнейшем, я буду добавлять правила в скрипт выше и выполнять его.

Нам так же понадобиться Java, установим ее, скачиваем и устанавливаем последнею версию Java. В момент подготовки статьи это 8u101, скачиваем версию для linux x64 rpm . Закачиваем ее на сервер в /tmp и устанавливаем и сразу же проверяем установленную версию

cd /tmp
yum -y localinstall jdk-8u111-linux-x64.rpm
java -d64 -version

Установка ELK

Сначала установим Elasticsearch
Импортируем ключ

sudo rpm —import https://artifacts.elastic.co/GPG-KEY-elasticsearch

Создаем репозитарий

sudo nano /etc/yum.repos.d/elasticsearch.repo

Внутри
[elasticsearch-5.x]
name=Elasticsearch repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

Ставим

sudo yum install -y elasticsearch

Запускаем и добавляем в автозагрузку

sudo systemctl daemon-reload
sudo systemctl enable elasticsearch.service
sudo systemctl start elasticsearch.service

Проверяем что запустился и слушает локальный порт, вывод должен быть подобный

curl -X GET http://localhost:9200

{
«name» : «gRK2ijQ»,
«cluster_name» : «elasticsearch»,
«cluster_uuid» : «FKp-LfFAQPmIRYYcgefjMw»,
«version» : {
«number» : «5.1.1»,
«build_hash» : «5395e21»,
«build_date» : «2016-12-06T12:36:15.409Z»,
«build_snapshot» : false,
«lucene_version» : «6.3.0»
},
«tagline» : «You Know, for Search»
}

Так же в случае удачного запуска, мы увидим два Java процесса слушающих 9200 и 9300 порты. Пример вывода команды

netstat -tulpn

Настройки ElasticSearch находятся в /etc/elasticsearch/elasticsearch.yml

Установка Kibana

Создаем репозитарий

nano /etc/yum.repos.d/kibana.repo

Прописываем внутри него
[kibana-5.x]
name=Kibana repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

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

yum install -y kibana

Добавляем в автозагрузку и запускаем

systemctl enable kibana
systemctl start kibana

Убедимся, что Kibana запустилась выполним

netstat -tulpn

В выводе должен быть сервис,, слушающий порт 5601. Как мы видим, слушает он на 127.0.0.1.

Во многих статьях, дальнейшие шаги, это изменить настройки kiabana, чтобы она слушала порт 5601 и разрешала доступ снаружи, мы пойдем более традиционным путем, а именно используем nginx.

Установка nginx

Для продуктивного использования, более правильно использовать nginx, к которому мы уже сделаем сертификат и базовую авторизацию

Создадим репозитарий

sudo nano /etc/yum.repos.d/nginx.repo

Внутрь добавим
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
Для того чтобы gpgcheck работало, берем с nginx.org ключ

wget http://nginx.org/keys/nginx_signing.key
sudo rpm —import nginx_signing.key

Обновляем репозитарий, ставим nginx

yum -y install nginx httpd-tools

Далее стандартно включаем автозагрузку, запускаем nginx, проверяем статус

systemctl enable nginx
systemctl restart nginx
systemctl status nginx

Создадим файл htpasswd.users и пользователя kibana, которому и зададим пароль. Этим пользователем мы и будем входить в kibana

htpasswd -c /etc/nginx/htpasswd.users kibana

Примечание: просто добавить, в уже существующий конфиг, например разработчиков можно

htpasswd /etc/nginx/htpasswd.users developers

Создаем конфиг kibana для nginx

sudo nano /etc/nginx/conf.d/http-kibana.conf

внутри форвард на порт кибаны, а так же запрос авторизации, которую мы определили выше
server {
listen 80;

server_name example.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;
}
}
А это для SSL, предполагается, что в /etc/ssl/certs/ у вас лежат уже правильно подготовленные файлы сертификата, а если нет

openssl pkcs12 -in nginx-01.pfx -out nginx-01.pem -nodes
#Выходной файл без закрытого ключа
openssl pkcs12 -in nginx-01.pfx -out nginx-01-cert.pem -nokeys
#for RSA key
openssl rsa -in nginx-01.pem -out nginx-01-rsa.pem

sudo nano /etc/nginx/conf.d/https-kibana.conf

внутри
server {
listen 443 ssl;

server_name elk.example.com;
ssl_certificate /etc/ssl/certs/elk-01-pem.crt;
ssl_certificate_key /etc/ssl/certs/elk-01-rsa.key;
ssl_protocols TLSv1.2;

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;
}
}

Удаляем default config

rm -f /etc/nginx/conf.d/default.conf

Проверяем конфиг

nginx -t

Разрешаем Selinux для корректной работы nginx

setsebool -P httpd_can_network_connect 1

Добавляем в правила iptables правила для доступа к nginx

sudo nano /etc/iptables.sh

# ngix for kibana
$IPT -A INPUT -i $WAN -p tcp —dport 80 -j ACCEPT
$IPT -A INPUT -i $WAN -p tcp —dport 443 -j ACCEPT
Для безопасности, сделаем редирект с 80 порта на 443, снова правим конфиг

nano /etc/nginx/conf.d/http-kibana.conf

И вставляем туда следующий код
server {
listen 80;

#server_name example.com;
return 301 https://elk-01.example.com$request_uri;
}

Перезапускаем nginx и проверяем

systemctl restart nginx

Вводим логин и пароль и видим kibana

Индексация в Kibana
При входе в kibana нам предложат создать индекс, создадим по типа filebeat-*, так как для передачи логов, мы будем использовать filebeat

так как у вас еще нет подключенных агентов, то и информации на вкладке discover не будет

 

yum -y install unzip
cd ~/
curl -L -O http://download.elastic.co/beats/dashboards/beats-dashboards-1.3.1.zip
unzip beats-dashboards-1.3.1.zip
cd beats-dashboards-1.3.1/
./load.sh

 

Мы закончили базовую настройку, сейчас, если вы так же решите использовать два разных elasticsearch, вам нужно выполнить аналогичные шаги на втором сервере. Если вы планируете размещать все на одном сервере, то следуем дальнейшим шагам, корректируя правила под себя. В дальнейшем, я считаю, что у меня уже есть elk-02 с elasticsearch и kibana.

Установка Logstash

Собственно, это самая отвественная и самая долгая в отладке часть, если вы допускаете ошибки в конфигурационных файлах.

Logstash — это Collect, Parse, Transform Logs. В нашем случае, используя его, мы планируем разделять логи безопасности и системы — отдавать на один elasticsearch доступный одной группе пользователей, а логи nginx на другой, который уже доступный уже другой группе пользователей. Так же обмен логами между filebeat > logstash будет идти по SSL. при этом будет взаимная проверка подлинности. Обращаю внимание, что logstash и filebeat не проверяют CRL (находится ли сертификат в списке отозванных). В моем случае я использовал для сертификатов MIcrosoft CA, но увы можете использовать OpenSSL либо другое ПО, которое выпускает соответствующие требованиям сертификаты — https://www.elastic.co/guide/en/beats/filebeat/5.0/configuration-output-ssl.html

Создаем файл с настройками repo

nano /etc/yum.repos.d/logstash.repo

Внутри

[logstash-5.x]
name=Elastic repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
Устанавливаем

yum -y install logstash

Настраиваем правила Logshatsh

Создадим конфиг с правила для входящих клиентов filebeat. В нем мы указываем на каком порту принимать соединения, что соединение идут по SSL, а так же пути до сертификата RootCA, сертификата сервера и закрытый ключ сервера. Так же устанавливаем режим принудительной проверки подлинности ssl_verify_mode => force_peer. Я предполагаю, что сертификаты у вас уже есть, если нет, то как перевести из pfx в нужный формат

#Convert a PKCS#12 file (.pfx .p12) containing a private key and certificates to PEM

openssl pkcs12 -in server.pfx -out server.pem -nodes

#генерируем сертификат (выходной файл без закрытого ключа)

openssl pkcs12 -in server.pfx -out server.crt -nokeys

# генрируем ключ RSA key — подходит для filebeat

openssl rsa -in server.pem -out server-rsa.key

#Конвертируем в pkcs8 — он необходим logstash

openssl pkcs8 -topk8 -inform pem -in server-rsa.key -outform pem -nocrypt -out server-pkcs8.key

 

Настройка правил INPUT

Для приема данных, мы будем использовать легкие beats — https://www.elastic.co/products/beats.

Создаем файл конфигурации для logstash, конфигурационный файл предельно простой , указываем порт, на котором слушаем, что порт защищен SSL, путь до CA сертификата и до сертификата сервера, а так же путь до закрытого ключа сервера и режим проверки ssl.

nano /etc/logstash/conf.d/02-beats-input.conf

Внутри
input {
beats {
port => 5044
ssl => true
ssl_certificate_authorities => [«/etc/pki/tls/certs/rootCA-01.crt»]
ssl_certificate => «/etc/pki/tls/certs/elk-01-cert.crt»
ssl_key => «/etc/pki/tls/certs/elk-01-pkcs8.key»
ssl_verify_mode => «force_peer»
}
}

Сразу добавим правила в iptables

sudo nano /etc/iptables.sh

#allow logstash
$IPT -A INPUT -i $WAN -p tcp —dport 5044 -j ACCEPT

Настройка правил FILTERING

Правила фильтрации для nignx, в них будут обрабатываться логи только NGINX, приходящие с типом nginx-access, мы будем отправлять на elk-02, остальные писать на себя

sudo nano /etc/logstash/conf.d/10-filter-nginx.conf

внутри

filter {
if [type] == «nginx-access» {
grok {
match => [ «message» , «%{COMBINEDAPACHELOG}+%{GREEDYDATA:extra_fields}»]
overwrite => [ «message» ]
add_tag => [«nginx_access»]
remove_tag => [«beats_input_codec_plain_applied»]
}

mutate {
convert => [«response», «integer»]
convert => [«bytes», «integer»]
convert => [«responsetime», «float»]
}

geoip {
source => «clientip»
database => «/opt/logstash/geoip/GeoLite2-City.mmdb»
target => «geoip»
#add_tag => [ «nginx-geoip» ]
add_field => [ «[geoip][coordinates]», «%{[geoip][longitude]}» ]
add_field => [ «[geoip][coordinates]», «%{[geoip][latitude]}» ]
}
mutate {
convert => [ «[geoip][coordinates]», «float»]
}

date {
match => [ «timestamp» , «dd/MMM/YYYY:HH:mm:ss Z» ]
remove_field => [ «timestamp» ]
}

useragent {
source => «agent»
}
} else if [type] == «nginx-error» {
grok {
match => [ «message» , «(?%{YEAR}[./-]%{MONTHNUM}[./-]%{MONTHDAY}[- ]%{TIME}) \[%{LOGLEVEL:severity}\] %{POSINT:pid}#%{NUMBER}:
%{GREEDYDATA:errormessage}(?:, client: (?%{IP}|%{HOSTNAME}))(?:, server: (%{IPORHOST:server})?)(?:, request: %{QS:request})?(?:, upstream:
\»%{URI:upstream}\»)?(?:, host: %{QS:host})?(?:, referrer: \»%{URI:referrer}\»)?»]
overwrite => [ «message» ]
add_tag => [«nginx_error»]
}

geoip {
source => «client»
target => «geoip»
add_tag => [ «nginx-geoip» ]
}

date {
match => [ «timestamp» , «YYYY/MM/dd HH:mm:ss» ]
remove_field => [ «timestamp» ]
}
}
}

А так же правила фильтрации общего назначения для обычных логов

sudo nano /etc/logstash/conf.d/14-filter-general.conf

Внутри

filter {
if [type] == «syslog» {
grok {
match => { «message» => «%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}» }
add_field => [ «received_at», «%{@timestamp}» ]
add_field => [ «received_from», «%{host}» ]
add_tag => [«syslog-%{type}»]
remove_tag => [«beats_input_codec_plain_applied»]
}
date {
match => [ «syslog_timestamp», «MMM d HH:mm:ss», «MMM dd HH:mm:ss» ]
}
}
else if [type] == «log» {
syslog_pri {
add_tag => [«log-general»]
remove_tag => [«beats_input_codec_plain_applied»]
}
date {
match => [ «syslog_timestamp», «MMM d HH:mm:ss», «MMM dd HH:mm:ss» ]
}
}
}

Настройка правил OUTPUT

Правила output, будет логи от nginx направлять на ноду elasticsearch обрабатывающей только логи nginx, остальные логи на локальную ноду elasticsearch

nano /etc/logstash/conf.d/30-elasticsearch-output.conf

внутри

output {
if [type] == «nginx-access» {
elasticsearch {
hosts => «ip-elk-02:9200»
index => «%{[@metadata][beat]}-%{[type]}-%{+YYYY.MM.dd}»
}
}
else {
elasticsearch {
hosts => «localhost:9200»
index => «%{[@metadata][beat]}-%{[type]}-%{+YYYY.MM.dd}»
}
}
}

Проверяем корректность файлов, если ничего не вышло — значит все хорошо, процедура не быстрая

/usr/share/logstash/bin/logstash —path.settings /etc/logstash -t

Так как в модули nginx, мы указали что используем GeoIP database, необходимо ее добавить

cd /tmp
wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz
gunzip GeoLite2-City.mmdb.gz
mkdir -p /opt/logstash/geoip/
mv GeoLite2-City.mmdb /opt/logstash/geoip/

Запускаем и добавляем в автозагрузку

sudo systemctl restart logstash
sudo systemctl enable logstash

Проверяем, что сервис удачно запустился

netstat -tulpn


В случае если так и не произошел запуск, смотрим лог

tail -f /var/log/logstash/logstash-plain.log

Установка filebeat (клиент) — general

Для клиента nginx — будет отдельный конфи, ниже в инструкции, сейчас мы установим filebeat на рядовой сервер, например server1
Импортируем ключ и создаем репозитарий

sudo rpm —import https://packages.elastic.co/GPG-KEY-elasticsearch
sudo nano /etc/yum.repos.d/elastic-beats.repo

Внутри
[elastic-5.x]
name=Elastic repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
Устанавливаем

yum -y install filebeat

Для удобства, я ранее уже сделал подготовленный файл конфигураций с параметрами, удалив все комментарии командой
grep -vE ‘(^[[:space:]]*([#;!].*)?$)’
Я настоятельно рекомендую, тем кто ставит первый раз, все же внимательно изучить конфигурационный файл filebeat и его комментарии. Причины удаления комментариев из основного файла конфигурации filebeat — это очень много комментариев, которые через некоторое время не нужны, так как все равно, сначала читаешь документацию на сайте, только потом правишь конфигурационный файл

Копируем конфигурационный файл в filebeat.original и создаем новый пустой

mv /etc/filebeat/filebeat.yml /etc/filebeat/filebeat.original
nano /etc/filebeat/filebeat.yml

Помним, что в YML, используем пробелы, а не табуляцию

Описание параметров можно посмотреть в официальной документации, ниже мы выполняем следующее
Задаем тип входных данных, задаем пути откуда считывать логи, явно определяем тип документа как syslog, явно задаем формат utf-8, явно указываем, что передаем данные в logstash, а так же пути до rootCA сертификата, до приватного ключа клиента, до сертификата клиента. Предполагается, что у вас они уже есть, но если нет

#Convert a PKCS#12 file (.pfx .p12) containing a private key and certificates to PEM
openssl pkcs12 -in server.pfx -out server.pem -nodes
#генерируем сертификат (выходной файл без закрытого ключа)
openssl pkcs12 -in server.pfx -out server.crt -nokeys
# генрируем ключ RSA key — подходит для filebeat
openssl rsa -in server.pem -out server-rsa.key

Вставляем внутрь файла

filebeat.prospectors:
— input_type: log
paths:
— /var/log/messages
— /var/log/secure
document_type: syslog
encoding: utf-8
output.logstash:
hosts: [«elk-01.example.com:5044»]
ssl.certificate_authorities: [«/etc/pki/tls/certs/rootCA-01.cer»]
ssl.certificate: «/etc/pki/tls/certs/server1-cert.crt»
ssl.key: «/etc/pki/tls/certs/server1-pkcs8.key»

Стартуем, добавляем в автозагрузку и проверяем статус клиента filebeat

sudo systemctl start filebeat
sudo systemctl enable filebeat
sudo systemctl status filebeat

если все сделано правильно, будет подобный вывод

Так же можно поглядеть что соединение реально установлено

netstat -tan | grep 5044


у вас должно быть ESTABLISHED в сторону вашего logstash
На самом сервере с EKL — elk-01 проверим запросом

cd ~/
curl -XGET ‘http://localhost:9200/filebeat-*/_search?pretty’

Пример вывода

Так же проверим, что у нас начались создаваться индексы

curl ‘localhost:9200/_cat/indices?v’


так же если мы зайдем в kibana то на вкладке discover мы увидим события от наших клиентов

Запуск filebeat в интерактивном режиме

Если что-то пошло не так и надо посмотреть, ошибки которые выводит filebeat.
Остановим сервис filebeat и запустим его в интерактивном режиме и смотрим ошибки

/usr/share/filebeat/bin/filebeat -c /etc/filebeat/filebeat.yml -e -v

Со стороны logstash смотрим лог

tail -f /var/log/logstash/logstash-plain.log

 

На сервере elk-01 скачаем json template для проверки корректности работы

cd ~
curl -O https://gist.githubusercontent.com/thisismitch/3429023e8438cc25b86c/raw/d8c479e2a1adcea8b1fe86570e42abab0f10f364/filebeat-index-template.json

Проверка, что все ок

curl -XPUT ‘http://localhost:9200/_template/filebeat?pretty’ -d@filebeat-index-template.json

Если все хорошо, будет подобный вывод
Output:
{
«acknowledged» : true
}

Добавление диска под данные и логи

Хранение данных в корневом разделе не лучшая идея, перенесем данные на специально выделенный диск. Предполагается, что вы уже добавили диск и он имеет имя sdb. Диск будет использовать файловую систему BTRFS.

Убедимся что он есть

fdisk -l

Если все ок и вы видите устройство ( в нашем примере /dev/sdb)
Установим необходимые компоненты

yum install btrfs-progs -y

Собственно готовим диск

pvcreate /dev/sdb
vgcreate VolGroup00 /dev/sdb
lvcreate VolGroup00 -n lvname -l100%FREE
mkfs.btrfs /dev/mapper/VolGroup00-lvname

Добавим его в fstab

nano /etc/fstab

внутри
/dev/mapper/VolGroup00-lvname /mnt/elk btrfs compress=lzo 0 0

Создадим точку монтирования и смонтируем из fstab

mkdir /mnt/elk
mount -a

Создадим папки под логи и данные и выдадим права

mkdir -p /mnt/elk/data
mkdir -p /mnt/elk/logs
chown -R elasticsearch.elasticsearch /mnt/elk/

Правим конфиг elastisearch

sudo nano /etc/elasticsearch/elasticsearch.yml

Внутри в секции пути, добавляем наш путь до папки с данными и логами

# ———————————— Paths ————————————
#
# Path to directory where to store the data (separate multiple locations by comma):
#
# path.data: /path/to/data
path.data: /mnt/elk/data
#
# Path to log files:
#
# path.logs: /path/to/logs
path.logs: /mnt/elk/logs
#
После правки нужно рестартануть сервис elasticsearch и выдать права, имеет так же смысл, перенести данные со старого места в новое, иначе команду mv пропустить

mv /var/lib/elasticsearch/nodes/0/indices/ /mnt/elk/data/nodes/0/indices/
chown -R elasticsearch.elasticsearch /mnt/elk/
systemctl restart elasticsearch

Настройки iptables
разрешим доступ к kibana и logstash

sudo nano /etc/iptables.sh

# allow kibana
$IPT -A INPUT -i $WAN -p tcp —dport 80 -j ACCEPT
$IPT -A INPUT -i $WAN -p tcp —dport 443 -j ACCEPT
#allow logstash
$IPT -A INPUT -i $WAN -p tcp —dport 5044 -j ACCEPT
Применим правила

sudo /etc/iptables.sh

Проверим

sudo iptables -L -v -n

Chain INPUT (policy DROP 883 packets, 155K bytes)
pkts bytes target prot opt in out source destination
540K 384M ACCEPT all — lo * 0.0.0.0/0 0.0.0.0/0
126K 33M ACCEPT all — * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
1 52 ACCEPT tcp — eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
51 3708 ACCEPT icmp — eth0 * 0.0.0.0/0 0.0.0.0/0 icmptype 8
1 52 ACCEPT tcp — eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
8 416 ACCEPT tcp — eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
67 3484 ACCEPT tcp — eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:5044

Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 TCPMSS tcp — * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x06/0x02 TCPMSS clamp to PMTU
0 0 ACCEPT all — * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
540K 384M ACCEPT all — * lo 0.0.0.0/0 0.0.0.0/0
150K 41M ACCEPT all — * eth0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all — * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
На этом можно считать настройку законченной.

Дополнительные материалы

Пример конфигурационного файла filebeat.yml для nginx

filebeat.prospectors:
— input_type: log
paths:
— /var/log/messages
— /var/log/secure
document_type: syslog
encoding: utf-8
— input_type: log
paths:
— /var/log/nginx/access.log
document_type: nginx-access
encoding: utf-8
es_index_name: nginx
es_document_type: nginx.log
— input_type: log
paths:
— /var/log/nginx/error.log
document_type: nginx-access
encoding: utf-8
es_index_name: nginx
es_document_type: nginx.log

output.logstash:
hosts: [«elk-01.example.com:5044»]
ssl.certificate_authorities: [«/etc/pki/tls/certs/rootCA-01.crt»]
ssl.certificate: «/etc/pki/tls/certs/server-nginx1.crt»
ssl.key: «/etc/pki/tls/certs/server-nginx1-rsa.key»
так же в имени путей до логов в filebeat.yml поддерживается символы поиска по маски например *.log.

Полезные команды

Посмотреть ноды

curl ‘localhost:9200/_cat/nodes?v’

Посмотерть статус работы Elasticsearch:

curl ‘localhost:9200/_cat/health?v’

Просмотр индексов:

curl ‘localhost:9200/_cat/indices?v’

Удаление всех индексов:

curl -XDELETE ‘localhost:9200/*’

Вместо * можно указать неугодный индекс, например:

curl -XDELETE ‘localhost:9200/winlogbeat-2016.02.10’

Проверка состояния Elasticsearch

curl -XGET http://localhost:9200/_cluster/health?pretty=true

Проверка конфигурации logastash

/usr/share/logstash/bin/logstash —path.settings /etc/logstash -t

путь до обработчиков Logastash

cd /etc/logstash/conf.d/

Проверка конфига filebeat

/usr/bin/filebeat.sh -configtest -e

Запуск в режиме отладки, уровень инфо

/usr/share/filebeat/bin/filebeat -c /etc/filebeat/filebeat.yml -e -v

Debug filebeat — полный

/usr/share/filebeat/bin/filebeat -c /etc/filebeat/filebeat.yml -e -d «*»

Известные проблемы

Не соединяется клиенты filebeat — Error publishing events (retrying): EOF
Решение — убедиться что стоит самая актуальная версия filebeat, если проблема массовая, то на сервере с logstash выполнить

/usr/share/logstash/bin/logstash-plugin update logstash-input-beats

filebeat CLOSE_WAIT
Клиент filebeat висит бесконечно в CLOSE_WAIT

Решение:

в большинстве случаев помогает рестарт клиента

systemctl restart filebeat

Перестали подключаться клиенты к logstash
В логах logstsash
[2016-11-21T07:29:29,952][ERROR][logstash.outputs.elasticsearch] Retrying individual actions
[2016-11-21T07:29:29,968][ERROR][logstash.outputs.elasticsearch] Action

Со стороны клиента ошибки filebeat
I/O timeout
Решение — необходимо проверить, что отключен SELinux на сервере с ELK (например включился после обновления)

nano /etc/selinux/config

внутри
SELINUX=disable
Рестарт сервера, если нужно онлайн то в консоли вводим

SELINUX=permissive

Особое внимание, когда используется несколько elasticsearch в связке, тогда надо провести изменения на вспомогательных elasticsearch, потом уже на центральном ELK.
Коллеги, я понимаю, что SELinux нужная вещь, но пока не успел протестировать, проблемы начались с ним недавно

После миграции с hyper-v на hyper-v ELK перестал отвечать на пинги, в консоли «kernel in hyper-v cause hv_netvsc problem»
Проблема связана с багом ядра до версии 3.15, сейчас в Centos 3.10.x — если сервера ставятся из стандартных репозитариев вендора.
Должно помочь обновления ядра до версии выше 3.15. Обновления ядра описано тут https://www.ostechnix.com/install-linux-kernel-4-9-centos-ubuntu/

Используемые материалы

Блоги

 

Реклама

комментариев 6 to “Установка и настройка ELK 5 (elasticsearch+kibana+logstash+filebeat)”

  1. Rostyslav said

    Спасибо за подробную инструкцию.
    Правильно ли я понимаю, Nginx использует common log?

    Также я столкнулся с ошибкой в 10-filter-nginx.conf, скорее всего связанная с форматирование статьи,
    вот кусок лога: Pipeline aborted due to error {:exception=>#\d\d){1,2})[.\/-](?:(?:0
    Могли бы вы опубликовать grok { без форматирования?

    Спасибо!

  2. j3qx said

    это же ожидаемо, если примеров в статье не достаточно, могу загрузить конфиги на GIT, там точно форматирование сохраниться

  3. Rostyslav said

    Да, пожалуйста. По примерам легче изучить и понять работу, т.к. мануалы не достаточно тонкости и подводные камни описывают.
    Спасибо!

  4. j3qx said

    Собственно репозитарий — код интересный вас в conf.d/ https://github.com/VNyercbb/elk

    input — обработчик входящий
    filtr — преобразования
    out — исходящие обработчики

    Оч помогает пониманию всего если сделать слияние в один конфиг, тогда понимаешь -как оно работает и как в обще выглядит конфиг для системы

  5. j3qx said

    и да по nxing лог типовой, сейчас в проработки решения — когда разрабы пишут не типовой лог — а мы его парсим, но пока не готово

  6. Rostyslav said

    Спасибо!

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

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

 
%d такие блоггеры, как: