ELK + Suricata Inline mode
-
Все работает в итоге. Если нужно кому-то, то могу сделать мануал по установке/залить .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.confoutput { 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