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.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