Очередной материал на тему централизованной системы сбора логов. Сегодня расскажу, как настроить сбор логов с устройств компании Mikrotik в ELK Stack. Статья ничем не примечательна, так как делается все стандартно и просто. Никакого парсинга и разбора логов я делать не буду. То есть будем просто хранить логи микротиков в одном месте с удобным поиском.
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.
Данная статья является частью единого цикла статьей про Mikrotik.
Введение
Ранее я рассказал, как установить и настроить elk stack, потом как загружать и анализировать логи nginx и samba. Теперь пришел черед логов Mikrotik. Я уже рассказывал, как отправлять логи микротика на удаленный syslog сервер, в качестве которого может выступать в том числе syslog-ng. В данном случае на самом микротике ничего особенного делать не надо. Будем точно так же отправлять данные на удаленный syslog сервер, в качестве которого будет трудиться logstash.
Я некоторое время рассуждал на тему парсинга и разбора логов. Но посмотрев на типичную картину стандартных логов mikrotik, понял, что ничего не выйдет. События очень разные и разобрать их одним правилом grok не получится. Если нужен парсинг и добавление метаданных к событиям, необходимо определенные события выделять и направлять отдельным потоком в logstash, где уже обрабатывать своим фильтром. Например, отдельный фильтр можно настроить на парсинг подключений к vpn или подключение по winbox с анализом имен пользователей.
Я же буду просто собирать все логи скопом и складывать в единый индекс. У записей не будет метаданных, по которым можно строить дашборды и анализировать данные. Но тем не менее, это все равно удобно, так как все логи в одном месте с удобным и быстрым поиском.
Настройка logstash на прием логов микротик
В конфиге /etc/logstash/conf.d/input.conf добавляем секцию для приема syslog логов. Вместе с логами от beats конфиг будет выглядеть вот так:
input { beats { port => 5044 } syslog { port => 5045 type => syslog } }
В конфиге с фильтрами filter.conf я разделил с помощью тэгов логи обычных роутеров, свитчей и wifi точек доступа по ip адресам. Получилось примерно так:
else if [host] == "10.1.4.19" or [host] == "10.1.5.1" { mutate { add_tag => [ "mikrotik", "gateway" ] } } else if [host] == "10.1.4.66" or [host] == "10.1.3.110" or [host] == "10.1.3.111" { mutate { add_tag => [ "mikrotik", "wifi" ] } } else if [host] == "10.1.4.14" or [host] == "10.1.5.33" { mutate { add_tag => [ "mikrotik", "switch" ] } }
Это простой случай, когда устройств мало. Если у вас много устройств, то лучше наверно придумать что-то другое, чтобы не нагружать logstash лишними правилами. Да и в ручную править конфиг неудобно. Как лучше поступать в таком случае - не знаю, не продумывал тему. Наверно имеет смысл разделить потоки по разным портам и на этом основании принимать решение о дальнейшей обработке.
Отправляем полученные логи в elasticsearch, настроив конфиг output.conf:
else if "mikrotik" in [tags] { elasticsearch { hosts => "localhost:9200" index => "mikrotik-%{+YYYY.MM}" } }
Я просто складываю все логи с тэгом mikrotik в один индекс с разбивкой по месяцам. На типы gateway, switch и wifi не разделяю, хотя можно это сделать. Тэги я добавил просто для удобства просмотра логов. С помощью тэгов можно будет быстро группировать логи по типу устройств.
Перезапускаем logstash и идем настраивать микротики на отправку логов на удаленный сервер.
Отправка логов mikrotik на удаленный сервер
Подключаемся к Mikrotik по winbox и идем в раздел System -> Logging. Изначально там вот так, если вы ничего не меняли.
Идем на вкладку Actions, выбираем remote и указываем параметры:
В данном случае:
- 10.1.4.114 - сервер elk, точнее с logstash;
- 5045 - порт, по которому logstash принимает syslog подключения.
После этого идем на вкладку Rules и дублируем стандартные правила, указывая action remote или добавляем новые правила для отправки логов. Должно получиться примерно вот так:
Все, микротик настроен на отправку логов на удаленный сервер. Больше на нем ничего делать не надо. Идем в web интерфейс Kibana.
Добавление индекса mikrotik в kibana
Если в предыдущих разделах вы все сделали правильно, в elasticsearch должны начать поступать данные от микротиков в индекс mikrotik-*. Идем в Kibana в раздел Management -> Index Patterns и добавляем новый индекс.
После этого можно в разделе Discover просматривать логи. При этом работает группировка по тэгам, которые характеризуют тип устройства.
На этом по настройке хранения логов mikrotik в elk stack все. Надеюсь, было полезно.
Заключение
Получилась простая статья по сбору логов. Для тех, кто уже работал с ELK Stack тут ничего нового нет. По сути, никакого анализа и графиков нет, а именно это чаще всего интересует при использовании elk. Я просто не придумал, что может быть полезного в логах микротика, что требует какого-то детального разбора и построения дашбордов. Если у кого-то есть идеи или примеры grok фильтров, прошу поделиться.
Напоминаю, что данная статья является частью единого цикла статьей про Mikrotik.
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.
Добрый день, как понять что микротик отправил данные на сервер ELK и также вопрос по какой причине не получается добавить index в Kibana? При попытке добавления пишет что индекса нет, хотя в файл output.conf логика была добавлена
else if "mikrotik" in [tags] {
elasticsearch {
hosts => "192.168.1.3:9200"
index => "mikrotik-%{+YYYY.MM}"
}
}
Проверить очень просто - посмотреть, появился ли индекс с соответствующим именем, а в discovery можно посмотреть его содержимое. Индекс создаётся автоматически после поступления данных.
Syslog input plugin хорошо только для логов созданных по RFC3164 style or ISO8601. Если это не так, то нужно парсить их GROK фильтром https://www.elastic.co/guide/en/logstash/current/plugins-inputs-syslog.html
Если железо древнее и на нем нельзя сменить порт сервера syslog (514 по умолчанию), то вы не сможете запустить logstash на привилегированном порту, как было в моем случае. Я нашел такое решение.
Можно воспользоваться setcap и выдать java возможность на запуск сервиса на привилегированном диапазоне портов (0-1024).
systemctl stop logstash
setcap CAP_NET_BIND_SERVICE=+eip /usr/share/logstash/jdk/bin/java
Если сейчас запустить logstash, то в /var/log/ messages будут ошибки:
logstash: /usr/share/logstash/jdk/bin/java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
Чтобы исправить создаем символьную ссылку ln -s /usr/share/logstash/jdk/lib/jli/libjli.so /usr/lib/
Обновляем кэш динамических библиотек: ldconfig
Теперь можно запускать logstash, если в конфиге указан 514 порт, то теперь можно убедиться, что он открыт netstat -ntlup
Чтобы проверить наличие возможности у бинарника - getcap /usr/share/logstash/jdk/bin/java
В выводе будет /usr/share/logstash/jdk/bin/java = cap_net_bind_service+eip
Другое решение, можно с помощью iptables включить перенаправление с 514 порта на тот, на котором запущен logstash
Владимир, вы используете в filter.conf IP адреса конкретных устройств:
"[host] == "10.1.4.19" or [host] == "10.1.5.1""
А как правильно задать необходимую подсеть?
[host] == "10.1.5.0/24"
Вот так правильно будет?
Скорее всего нет, надо проверять. Я сейчас уже не помню точно. Тут смысл не в том, чтобы указать правильно именно подсеть. Там просто берется поле host и в нем проверяется конкретная запись. То есть если нужна подсеть, то должно быть что-то в стиле "10.1.5.*" или "10.1.5." Хотя скорее всего вместо == должно стоять какое-то сравнение по шаблону, а не точное соответствие. Синтаксис надо уточнить в документации.
@Zerox зависает на этапе установки. Случайно, не нужно добавлять правила в firewall или NAT для 5045 порта на Микротике?
Что именно зависает, не понял?
У меня Windows Server выступает как logstash server.
На последнем этапе запуска команды PowerShell: bin\logstash -f mikrotik.conf
Зависает тут и дальше процесс не идет. Логи в ELK не поступают. Поддержка Elastic не очень сильна в добаление Mikrotik и убеждает, что упущенно правило на роутере.
[2021-02-10T11:57:44,364][INFO ][logstash.javapipeline ][main] Pipeline Java execution initialization time {"seconds"
=>1.88}
[2021-02-10T11:57:44,904][INFO ][logstash.javapipeline ][main] Pipeline started {"pipeline.id"=>"main"}
[2021-02-10T11:57:44,943][INFO ][logstash.inputs.syslog ][main][0f5fb9cf96985447f83be753c676bd828f1e2bbc7ab
c23dc207b3] Starting syslog tcp listener {:address=>"0.0.0.0:5045"}
[2021-02-10T11:57:44,969][INFO ][logstash.inputs.syslog ][main][0f5fb9cf96985447f83be753c676bd828f1e2bbc7ab
c23dc207b3] Starting syslog udp listener {:address=>"0.0.0.0:5045"}
[2021-02-10T11:57:45,012][INFO ][logstash.agent ] Pipelines running {:count=>1, :running_pipelines=>[:main], :
non_running_pipelines=>[]}
[2021-02-10T11:57:46,064][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
Тут очевидно, что на Windows Server должны быть разрешены входящие подключения на порт 5045, а на микротиках разрешены исходящие.
Можете, пожалуйста, подсказать по исходящему правилу на микротик?
Вот статья про настройку firewall в микротик - https://serveradmin.ru/bazovaya-nastrojka-firewall-v-mikrotik/ Там все подробно расписано.
Да, правило output не помогает.
А для анализа трафика можно использовать traffic flow в mikritik. Не пробовал связать с ELK?
Я - нет.
Добрый день.
Подскажите что я делаю не так. Микротик не отправляет логи.
input {
beats {
port => 5044
}
syslog {
port => 5045
type => syslog
}
}
output {
if [type] == "nginx_access" {
elasticsearch {
hosts => "localhost:9200"
index => "nginx-%{+YYYY.MM.dd}"
}
}
else if [type] == "nginx_error" {
elasticsearch {
hosts => "localhost:9200"
index => "nginx-%{+YYYY.MM.dd}"
}
}
else if "winsrv" in [tags] {
elasticsearch {
hosts => "localhost:9200"
index => "winsrv-%{+YYYY.MM.dd}"
}
}
else if "mikrotik" in [tags] {
elasticsearch {
hosts => "localhost:9200"
index => "mikrotik-%{+YYYY.MM}"
}
}
else {
elasticsearch {
hosts => "localhost:9200"
index => "unknown_messages"
}
}
#stdout { codec => rubydebug }
}
filter {
if [type] == "nginx_access" {
grok {
match => { "message" => "%{IPORHOST:remote_ip} - %{DATA:user} \[%{HTTPDATE:access_time}\] \"%{WORD:http_method} %{DATA:url} HTTP/%{NUMBER:http_version}\" %{NUMBER:response_code} %{NUMBER:body_sent_bytes} \"%{DATA:referrer}\" \"%{DATA:agent}\"" }
}
}
else if [host] == "172.17.113.1" or [host] == "172.17.112.1" {
mutate {
add_tag => [ "mikrotik", "gateway" ]
}
}
date {
match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]
}
geoip {
source => "remote_ip"
target => "geoip"
add_tag => [ "nginx-geoip" ]
}
}
Так сходу не подскажу, надо вникать в правила. Сделайте отдельный индекс для всех, кто не попал ни в какое правило и смотрите, поступает ли туда что-то от микротика. Возможно у вас тегирование не работает, поэтому данные не попадают в нужный индекс. А если данные вообще не идут в elastic, смотрите, что на микротике не так. Задача не сложная, я много раз собирал логи с микротов в elk. Надо все аккуратно сделать и проверить.
Логи с микрота идут, падают в unknown_messages, как правильно оформить конфиг filter? Я думаю там проблема.
Конфиги все с вашего мануала 1 в 1.
Как туда правильно добавить микротика?
Ищите, где у вас ошибка. Я все конфиги привел с работающего сервера.
Как в ELK передать название микротика то что в Identity ?
Все делал как вы и описали но увы ничего нет, не могу добавить индекс микротика(
А каким образом можно увеличить параметр Top 5 values in 500 / 500 records, хотелось бы видеть все записи, а не только топ 5?
По-быстрому не знаю как. А в общем случае сделайте визуализацию по полю tag и выведите столько значений, сколько надо. Заодно и подсчитаете вхождение каждого tag в записях.
Доброго.
В догонку habr.com/post/431600/
Спасибо за статью.
нет ли ошибки в logstash input? ведь там не указан протокол (tcp, udp)
И должен ли быть порт 5044 в состоянии LISTEN в системе?
Ошибки нет. Порт должен быть открыт и принимать соединения.
Мне удалось запустить на данной системе модуль netflow в настройках файла logstash.yml "Module Settings" раскомментируем строку modules (второй) и добавляем
modules:
-name:netflow
var.input.udp.port: 9300
Сохраняем, перезапускаем
# systemctl restart logstash.service
Идем смотреть лог
# tail -f /var/log/logstash/logstash-plain.log
После этого он будет игнорировать некоторые версии пакетов, но в индексах появиться "netflow-2018.11.30"
Гораздо более расширенные данные о трафике, и не забудьте на микроте настроить TraffikFlow с портом и таргетом на logstash
Один существенный минус, я так и не разобрался как выставить сопоставление IP адресов и DNS имен
https://github.com/robcowart/elastiflow/blob/master/INSTALL.md Вот еще лучше версия и кстати 300 готовых визуализаций
Установка и настройка прошла успешно, 7 день полет нормальный принимаю полностью статистику от микротика с выводом данных и визуализацией и движениям по сети как локальной так и внешней
Можно скриншот этой красоты увидеть? Визуализацию или дашборд готовый, если есть.
Вот скрины https://yadi.sk/d/eX5VFNDYjKzckw
Если есть вопросы могу помочь почта для вопросов valerondestoer@gmail.com
Красиво получилось, информативно. Мне кажется, эти логи будут очень много места занимать. Если нет большой нужды в таком подробном анализе логов, то весьма накладно все это хранить и обрабатывать. Хотя для расследования инцидентов, можно хранить за последние 2-3 дня и дальше чистить.
Выделил под виртуалку 600гб лог за день весит от 1.5-до 2гб на месяц должно хранить, и главное для jvm выделить не 4 а 8
А input.conf надо настраивать для netflow?
для netflow лучше использовать кодеки, и там настраивается целый стек параметров
И все таки как прикрутить грамотно dashboard сюда пока не разобрался никто
Что этот dashboard должен показывать?
Как минимум в графическом виде))
Что именно показывать? Какие данные?
Если мне не изменят память то есть готовые дашборды под названием Netflow, представленных в самой Kibana при попытке установки, и поиска информации у меня не срослось. Либо я люьтый тупень
Что по вашему все таки удобнее/оптимальнее для сбора логов с mikrotik, syslog-ng или ELK?
Прошу прощения, имел ввиду rsyslog. У вас статья была по этому поводу.
Так это совсем разные вещи, решающие разные задачи. rsyslog просто хранит логи в текстовом виде и все. А elk это целый многофункциональный комплекс с web доступом. Только для микротиков я бы не стал поднимать elk. Я бы настроил rsyslog и webmin, если хочется через браузер смотреть логи и выполнять поиск по ним.
Давно хотел почитать эти статьи про ELK, наконец, добрался.
А можно настроить какие-то уведомления на критические события? Допустим, тот же логин пользователя или, к примеру, падение интерфейса.
Полезное в логах микротика? Нагрузка на dhcp, wifi, данные PoE out. Или, например, если каждый час измеряется скорость, то можно рисовать эту скорость на графиках, но это, мне кажется, очень узкоприменимый кейс.
Мне кажется под все описанное больше zabbix подходит.
Да, zabbix сейчас и используется. Просто интересен функционал ELK с точки зрения хранения всех логов. Кстати, вопрос по уведомлениям актуален) Или, наверно, логичнее уже мониторить эти логи в zabbix?
Нужно разделять функционал. То, что вы описали вначале, не только про логи. Например, падение интерфейса. Логичнее это мониторить по snmp в zabbix и слать уведомления. Логин пользователя, тут уже надо думать, где лучше реализовывать. Можно и в заббиксе и в elk. Но мне кажется, elk все же больше про большие логи и визуализацию, поиск в них. Мониторинг не его задача. Уведомления в нем есть, но я не разбирался и не настраивал.