ELK + Suricata Inline mode
-
Доброго времени суток господа.
Имеется Esxi 6, на нем поднятый Pfsense 2.3.2-RELEASE (amd64) built on Tue Jul 19 12:44:43 CDT 2016 и настроенная Suricata работающая в inline mode. Так же настроенный ELK кушающий логи фаервола.
Пытаюсь сделать так, чтобы алерты сурикаты так же кушались ELK, настроил Barnyard2, логи приходят на ELK, но понимаю что он их не распазнает т.к. отсутствует патерн и конфиг для логов сурикаты и собственно вопрос:
Есть ли у кого готовые файлы под сурикату для ELK? Или же знающие люди которые направят на путь истинный?Пробовал создавать лог сурикаты и отправлять его в системные логи, но ничего хорошего из этого не вышло.
-
Доброе.
Также исп. Suricata. Замечательное решение (после небольшого "обучения" что блокировать, что нет).Галка на Log to System Log в настр. не помогает ? И ,как вариант - рестарт suricata после галки или , кардинально, рестарт pf.
настроенная Suricata работающая в inline mode. Так же настроенный ELK кушающий логи фаервола.
А вот с этого места поподробнее :) Можно ли инс-ции по настройке связки elk + pf ? И ваш собственный со скринами.
Буду категорически благодарен. -
Галка на Log to System Log в настр. не помогает ? И ,как вариант - рестарт suricata после галки или , кардинально, рестарт pf.
Если поставить галку, то события будут записываться в формате простого текста, который ELK так же не распознает.
Пример результата:Time Process PID Message Aug 18 14:03:57 suricata 60302 [Drop] [1:2010935:2] ET POLICY Suspicious inbound to MSSQL port 1433 [Classification: Potentially Bad Traffic] [Priority: 2] {TCP} x.x.x.x:xxxx -> x.x.x.x:1433
Нужно чтобы лог именно разделялся как в Alerts и при этом создать шаблон в ELK, при котором он бы распознавал логи сурикаты.
А вот с этого места поподробнее :) Можно ли инс-ции по настройке связки elk + pf ? И ваш собственный со скринами.
Буду категорически благодарен.Все выполнял по инструкции http://pfelk.3ilson.com/ на чистой ubuntu-14.04.5-server-amd64 (на 16й не завелось), заработало без всяких проблем.
-
Спасибо за ссылку.
P.s. В гугле по suricata elk stack pfsense сразу выдало:
https://blog.reboost.net/suricata-on-pfsense-to-elk-stack/
https://www.aldeid.com/wiki/ELK-Stack
https://blog.inliniac.net/2014/07/28/suricata-flow-logging/
https://redmine.openinfosecfoundation.org/projects/suricata/wiki/_logstash_kibana_and_suricata_json_outputИ такое чудо еще - http://elatov.github.io/2016/04/suricata-logs-in-splunk-and-elk/
-
Попробуем-с поиграться с фаилбитом, о результатах отпишусь, спасибо.
-
Штудировал https://www.digitalocean.com/community/tutorials/how-to-install-elasticsearch-logstash-and-kibana-elk-stack-on-centos-7 и http://elatov.github.io/2016/04/suricata-logs-in-splunk-and-elk/
Добавил logstash-* и вуаля, получилось получить правильные логи, все работает, но вот есть одно но, по какой то причине не работает карта, появляется заполнение https://otile2-s.mqcdn.com/tiles/1.0.0/map/2/0/1.jpeg. Ломаю голову как это починить… возможно нужно обновить кибану, но пока не знаю точно.
Нашел тему по этой проблеме https://github.com/elastic/kibana/issues/7717 сделал настройки карты как тут https://cloud.githubusercontent.com/assets/20421688/16770938/a6967a86-4846-11e6-92cd-c5a529663235.png
Все работает в итоге. Если нужно кому-то, то могу сделать мануал по установке/залить .ova с начальными установками. -
Все работает в итоге. Если нужно кому-то, то могу сделать мануал по установке/залить .ova с начальными установками.
Супер же!
Не надо готового. Лучше инструкцию со скринами. Чтоб люди сами. С готовым понимание того, что делать и как не прийдет.
Заранее благодарен.P.s. Особенно настройки dashboard интересует.
-
Инструкция по установке ELK с настройками для Suricat'ы c использованием Filebeat для передачи в logstash eve.json
Установка происходит на чистый CentOS-7-x86_64-Minimal-1511 с оф сайта.Инструкция пишется для VM на Esxi 6. Для настройки нам понадобятся дополнительные пакеты: net-tools для простого определения полученного ip dhcp сервером через ifconfig и для подключения к серверу через putty, nano для более удобного редактирования, wget для скачивания пакетов, open-vm-tools для удобного управления через vsphere client.
Устанавливаем net-tools nano wget open-vm-tools:
yum install net-tools -y yum install nano -y yum install wget -y yum install open-vm-tools -y
Узнаем IP нашего сервера
ifconfig >inet 10.10.10.150 ...
Установка Java 8
Скачиваем rpmwget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u73-b02/jdk-8u73-linux-x64.rpm"
Устанавливаем
sudo yum -y localinstall jdk-8u73-linux-x64.rpm
Установка Elasticsearch
Импортируем ключ в rmprpm --import http://packages.elastic.co/GPG-KEY-elasticsearch
Создаем файл репозитория
echo '[elasticsearch-2.x] name=Elasticsearch repository for 2.x packages baseurl=http://packages.elastic.co/elasticsearch/2.x/centos gpgcheck=1 gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch enabled=1 ' | sudo tee /etc/yum.repos.d/elasticsearch.repo
Устанавливаем Elasticsearch
yum nstall -y elasticsearch
Запускаем
systemctl start elasticsearch
Добавляем в автозагрузку
systemctl enable elasticsearch
Установка Kibana
Создаем файл репозиторияnano /etc/yum.repos.d/kibana.repo
Добавляем содержимое
[kibana-4.4] name=Kibana repository for 4.4.x packages baseurl=http://packages.elastic.co/kibana/4.4/centos gpgcheck=1 gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch enabled=1
Устанавливаем Kibana
yum -y install kibana
Включаем
systemctl start kibanachkconfig kibana on
Утсанавливаем Nginx
yum -y install epel-release yum -y install nginx httpd-tools
Создаем админа с паролем для веб интерфейса Kibana, где kibanaadmin логин который вы хотите использовать для входа
htpasswd -c /etc/nginx/htpasswd.users kibanaadmin
Редактируем конфиг Nginx
nano /etc/nginx/nginx.conf
Нужно удалить блок server {}. 2 последние строчки должны быть
include /etc/nginx/conf.d/*.conf; }
Создаем новый блок server{} в новом файле
nano /etc/nginx/conf.d/kibana.conf
Добавляем содержимое, где example.com имя сервера
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; } }
Запускаем Nginx
systemctl start nginx systemctl enable nginx
Отключаем SELinux
setsebool -P httpd_can_network_connect 1
Установка Logstash
Создаем файл репозиторияnano /etc/yum.repos.d/logstash.repo
Добавляем содержимое
[logstash-2.2] name=logstash repository for 2.2 packages baseurl=http://packages.elasticsearch.org/logstash/2.2/centos gpgcheck=1 gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch enabled=1
Устанавливаем
yum -y install logstash
Устанавливаем GeoIP
cd /etc/logstash curl -O "http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz" gunzip GeoLiteCity.dat.gz
Создаем конфиг
nano /etc/logstash/conf.d/suricata-beats.conf
Наполняем содержимым
input { beats { type => SuricataIDPS port => 5044 codec => json } } filter { if [type] == "SuricataIDPS" { date { match => [ "timestamp", "ISO8601" ] } ruby { code => "if event['event_type'] == 'fileinfo'; event['fileinfo']['type']=event['fileinfo']['magic'].to_s.split(',')[0]; end;" } } if [src_ip] { geoip { source => "src_ip" target => "geoip" database => "/etc/logstash/GeoLiteCity.dat" add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ] add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ] } mutate { convert => [ "[geoip][coordinates]", "float" ] } if ![geoip.ip] { if [dest_ip] { geoip { source => "dest_ip" target => "geoip" database => "/etc/logstash/GeoLiteCity.dat" add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ] add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ] } mutate { convert => [ "[geoip][coordinates]", "float" ] } } } } } output { elasticsearch { hosts => ["localhost:9200"] } stdout { codec => rubydebug } }
Проверим правильность конфигурации
service logstash configtest
Если получаем Configuration OK, идем дальше
Перезагружаем logstash и добавляем в загрузку
systemctl restart logstash chkconfig logstash on
Настраиваем Filebeat на pfsense
Находим тут нужный нам файл, взависимости от того какой у нас pfsesnehttps://beats-nightlies.s3.amazonaws.com/index.html?prefix=jenkins/filebeat/760-3850d0e6675293fc903528601eb304792c442dc3/
Например это filebeat-freebsd-amd64
Качаем
fetch https://beats-nightlies.s3.amazonaws.com/jenkins/filebeat/760-3850d0e6675293fc903528601eb304792c442dc3/filebeat-freebsd-amd64
Создаем каталог, перемещаем, делаем исполняемым
mkdir /etc/filebeat mv ~/filebeat-freebsd-amd64 /etc/filebeat/ cd /etc/filebeat/ mv filebeat-freebsd-amd64 filebeat chmod +x filebeat
Создаем конфиг для него
nano /etc/filebeat/filebeat.yml
И заполняем, где * имя интерфеса, 10.10.10.150 - адрес сервера ELK
filebeat: prospectors: - paths: - /var/log/suricata/*/eve.json input_type: log document_type: SuricataIDPS output: logstash: hosts: ["10.10.10.150:5044"]
Проверяем правильность конфига
/etc/filebeat/filebeat -configtest
Если пусто то все ок
Для того чтобы добавить filebeat при старте pfsens'a нужно установить пакет Shellcmd (System, Packages). После установки, его можно найти в Services.
В /usr/local/etc/rc.d/ создать filebeat.shnano /usr/local/etc/rc.d/filebeat.sh chmod +x filebeat.sh
и заполнить
#!/bin/sh . /etc/rc.subr name="filebeat" rcvar=filebeat_enable load_rc_config "$name" : ${filebeat_enable="NO"} command="/etc/filebeat/filebeat" command_args="-c /etc/filebeat/filebeat.yml" start_cmd=filebeat_start pidfile="/var/run/${name}.pid" filebeat_start() { echo "Starting filebeat." /usr/sbin/daemon -c -f -p $pidfile ${command} ${command_args} } run_rc_command "$1"
Нажать в Shellcmd на + и в поле Command ввести /usr/local/etc/rc.d/filebeat.sh onestart оставить shellcmd type. После этого нужно перезагрузить pfsense.
Если хотите проверить работает ли он без перезагрузки тоcd /etc/filebeat ./filebeat
Теперь необходимо спровоцировать Alert, например запустить сканер на телефоне с мобильного интеренета по своему хосту (при условии его доступности из вне)
В /etc/filebeat/logs должен появиться filebeat файл с логом с успешным запуском2016-08-19T16:16:12+03:00 INFO Home path: [/etc/filebeat] Config path: [/etc/filebeat] Data path: [/etc/filebeat/data] Logs path: [/etc/filebeat/logs] 2016-08-19T16:16:12+03:00 INFO Setup Beat: filebeat; Version: 5.0.0-alpha6-git3850d0e 2016-08-19T16:16:12+03:00 INFO Max Retries set to: 3 2016-08-19T16:16:12+03:00 INFO Activated logstash as output plugin. 2016-08-19T16:16:12+03:00 INFO Publisher name: pfSense.localdomain 2016-08-19T16:16:12+03:00 INFO Flush Interval set to: 1s 2016-08-19T16:16:12+03:00 INFO Max Bulk Size set to: 2048 2016-08-19T16:16:12+03:00 INFO filebeat start running. 2016-08-19T16:16:12+03:00 INFO Registry file set to: /etc/filebeat/data/registry 2016-08-19T16:16:12+03:00 INFO Loading registrar data from /etc/filebeat/data/registry 2016-08-19T16:16:12+03:00 INFO States Loaded from registrar: 1 2016-08-19T16:16:12+03:00 INFO Loading Prospectors: 1 2016-08-19T16:16:12+03:00 INFO Load previous states from registry into memory 2016-08-19T16:16:12+03:00 INFO Previous states loaded: 1 2016-08-19T16:16:12+03:00 INFO Starting Registrar 2016-08-19T16:16:12+03:00 INFO Loading Prospectors completed. Number of prospectors: 1 2016-08-19T16:16:12+03:00 INFO All prospectors are initialised and running with 1 states to persist 2016-08-19T16:16:12+03:00 INFO Starting prospector of type: log 2016-08-19T16:16:12+03:00 INFO Start sending events to output 2016-08-19T16:16:12+03:00 INFO Starting spooler: spool_size: 2048; idle_timeout: 5s 2016-08-19T16:16:42+03:00 INFO No non-zero metrics in the last 30s 2016-08-19T16:16:52+03:00 INFO Harvester started for file: /var/log/suricata/suricata_em012321/eve.json
На ELK сервере в /var/log/logstash файл logstash.stdout должен набрать толщину и иметь записи больше чем
Sending logstash logs to /var/log/logstash/logstash.log.
Если все так, как я описал, то все работает.
Набираем http://10.10.10.150/ в браузере. Используем логин и пароль который мы ранее создали после установки Nginx. Нам сразу же предложат создать патер logstash-*. Создаем его. Если его создать нельзя, значит нет логов, а если нет, значит что то пошло не так c filebeat.
Если же все успешно, то переходим в Visualize -> Tile map -> From a new search -> Options, галочку на WMS compliant map serverWMS url* http://ows-tile.terrestris.de/osm-basemap/service? WMS layers* OSM-WMS WMS version* 1.1.1 WMS format* image/jpeg
Далее жмем Save Visualization, назавем к примеру Map
Идем в Dashboard -> Add visualization, выбираем наш Map, растягиваем как нам нжуно. Жмем Save и называем как хотим.
Пример того что у меня Картинка
Тут отображено на карте места где пакеты дропнуты, 1й круг - количество дропов по странам, 2й круг - дропнутые страны и города, 3й - страны по типу атак, таблица - дата, страна, город, на какой порт атака, тип атак, кол-во атакЕсли у кого возникнут вопросы или трудности, отвечу как смогу.
Источники:
https://www.digitalocean.com/community/tutorials/how-to-install-elasticsearch-logstash-and-kibana-elk-stack-on-centos-7
http://elatov.github.io/2016/04/suricata-logs-in-splunk-and-elk/ -
Подредактировал автозагрузку filebeat c
/etc/filebeat/filebeat
на
/etc/filebeat/filebeat -c /etc/filebeat/filebeat.yml
-
2 borg
Огромное спасибо. -
Наткнулся на дашборды для сурикаты
https://github.com/StamusNetworks/KTS
Все ранее созданные дашборды будут удалены и будут созданы новые патерны, поэтому если нужно, можно сделать экспорт в settings -> objects.
Для того чтобы все не сыпалось ошибками нужно во всех файлах находящихся в каталогах search и visualization изменитьlogstash-alert-* logstash-dns-* logstash-fileinfo-* logstash-flow-* logstash-http-* logstash-smtp-* logstash-ssh-* logstash-tls-*
на
logstash-*
для того чтобы все работало:
/opt/kibana/bin/kibana plugin -i elastic/timelion git clone https://github.com/StamusNetworks/KTS.git patch -p1 -d /opt/kibana/ < /root/KTS/patches/kibana-integer.patch patch -p1 -d /opt/kibana/ < /root/KTS/patches/timelion-integer.patch cd KTS ./load.sh
Так же если кому нужно могу объяснить как создать свой патер и использовать его при использовании filebeat
-
2 borg
Спасибо ОГРОМНОЕ )Так же если кому нужно могу объяснить как создать свой патер и использовать его при использовании filebeat
Конечно же ! Ждем.
-
Выяснил что
/etc/filebeat/filebeat -c /etc/filebeat/filebeat.yml
вешает весь автозапуск у пфснса, нужен другой метод запуска
в /usr/local/etc/rc.d/ создать filebeat.sh
#!/bin/sh . /etc/rc.subr name="filebeat" rcvar=filebeat_enable load_rc_config "$name" : ${filebeat_enable="NO"} command="/etc/filebeat/filebeat" command_args="-c /etc/filebeat/filebeat.yml" start_cmd=filebeat_start pidfile="/var/run/${name}.pid" filebeat_start() { echo "Starting filebeat." /usr/sbin/daemon -c -f -p $pidfile ${command} ${command_args} } run_rc_command "$1"
и добавить в shellcmd строку
/usr/local/etc/rc.d/filebeat.sh onestart
-
Недавно вернулся к вопросу elk и Pfsense
Дополню про templateДля того чтобы входящие логи имели нужный нам индекс, нам необходимо в /etc/logstash/conf.d/suricata-beats.conf изменить блок output, например у нас будет индекс для логов от сурикаты suricata.
output { elasticsearch { hosts => ["localhost:9200"] index => "suricata-%{+YYYY.MM.dd}" } stdout { codec => rubydebug } }
Для того чтобы работало GeoIP необходимо создать template (я взял от logstash (/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-output-elasticsearch-2.7.1-java/lib/logstash/outputs/elasticsearch/elasticsearch-template.json) и поменял в нем значение на suricata)
mkdir /etc/logstash/templates sudo nano /etc/logstash/templates/suricata.json
{ "template" : "suricata-*", "settings" : { "index.refresh_interval" : "5s" }, "mappings" : { "_default_" : { "_all" : {"enabled" : true, "omit_norms" : true}, "dynamic_templates" : [ { "message_field" : { "match" : "message", "match_mapping_type" : "string", "mapping" : { "type" : "string", "index" : "analyzed", "omit_norms" : true, "fielddata" : { "format" : "disabled" } } } }, { "string_fields" : { "match" : "*", "match_mapping_type" : "string", "mapping" : { "type" : "string", "index" : "analyzed", "omit_norms" : true, "fielddata" : { "format" : "disabled" }, "fields" : { "raw" : {"type": "string", "index" : "not_analyzed", "ignore_above" : 256} } } } } ], "properties" : { "@timestamp": { "type": "date" }, "@version": { "type": "string", "index": "not_analyzed" }, "geoip" : { "dynamic": true, "properties" : { "ip": { "type": "ip" }, "location" : { "type" : "geo_point" }, "latitude" : { "type" : "float" }, "longitude" : { "type" : "float" } } } } } } }
После регистрируем его
sudo curl -XPUT 'http://localhost:9200/_template/suricata?pretty' -d@/etc/logstash/templates/suricata.json
Затем дополняем блок output suricata-beats.conf
sudo nano /etc/logstash/conf.d/suricata-beats.conf
output { elasticsearch { hosts => ["localhost:9200"] index => "suricata-%{+YYYY.MM.dd}" template => "/etc/logstash/templates/suricata.json" template_overwrite => true } stdout { codec => rubydebug } }
Конечный файл выглядит так:
input { beats { type => SuricataIDPS port => 5044 codec => json } } filter { if [type] == "SuricataIDPS" { date { match => [ "timestamp", "ISO8601" ] } ruby { code => "if event['event_type'] == 'fileinfo'; event['fileinfo']['type']=event['fileinfo']['magic'].to_s.split(',')[0]; end;" } } if [src_ip] { geoip { source => "src_ip" target => "geoip" database => "/etc/logstash/GeoLiteCity.dat" add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ] add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ] } mutate { convert => [ "[geoip][coordinates]", "float" ] } if ![geoip.ip] { if [dest_ip] { geoip { source => "dest_ip" target => "geoip" database => "/etc/logstash/GeoLiteCity.dat" add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ] add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ] } mutate { convert => [ "[geoip][coordinates]", "float" ] } } } } } output { elasticsearch { hosts => ["localhost:9200"] index => "suricata-%{+YYYY.MM.dd}" template => "/etc/logstash/templates/suricata.json" template_overwrite => true } stdout { codec => rubydebug } }
После этих действий желательно удалить все индексы
curl -XDELETE 'http://localhost:9200/_all'
После чего удаляем на pfsense директории /etc/filebeat/data и /etc/filebeat/logs и стартуем filebeat
/usr/local/etc/rc.d/filebeat.sh onestart
Идем в Kibana settings/Indices добавляем pattern suricata-*
-
Доброе
Спасибо за дополнение. -
Такой топик надо закрепить, ну или в FAQ