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 ? И ваш собственный со скринами.
    Буду категорически благодарен.



  • @werter:

    Галка на 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, при котором он бы распознавал логи сурикаты.

    @werter:

    А вот с этого места поподробнее :) Можно ли инс-ции по настройке связки elk + pf ? И ваш собственный со скринами.
    Буду категорически благодарен.

    Все выполнял по инструкции http://pfelk.3ilson.com/ на чистой ubuntu-14.04.5-server-amd64 (на 16й не завелось), заработало без всяких проблем.





  • Попробуем-с поиграться с фаилбитом, о результатах отпишусь, спасибо.



  • Штудировал 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 с начальными установками.



  • @borg:

    Все работает в итоге. Если нужно кому-то, то могу сделать мануал по установке/залить .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
    Скачиваем rpm

    wget --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
    Импортируем ключ в rmp

    rpm --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 kibana

    chkconfig 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
    Находим тут нужный нам файл, взависимости от того какой у нас pfsesne

    https://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.sh

    nano /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 server

    WMS 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