Netgate Discussion Forum
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Search
    • Register
    • Login

    ELK + Suricata Inline mode

    Scheduled Pinned Locked Moved Russian
    16 Posts 3 Posters 8.8k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • werterW
      werter
      last edited by

      Спасибо за ссылку.

      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/

      1 Reply Last reply Reply Quote 0
      • B
        borg
        last edited by

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

        1 Reply Last reply Reply Quote 0
        • B
          borg
          last edited by

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

          1 Reply Last reply Reply Quote 0
          • werterW
            werter
            last edited by

            @borg:

            Все работает в итоге. Если нужно кому-то, то могу сделать мануал по установке/залить .ova с начальными установками.

            Супер же!
            Не надо готового. Лучше инструкцию со скринами. Чтоб люди сами. С готовым понимание того, что делать и как не прийдет.
            Заранее благодарен.

            P.s. Особенно настройки dashboard интересует.

            1 Reply Last reply Reply Quote 0
            • B
              borg
              last edited by

              Инструкция по установке 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/

              1 Reply Last reply Reply Quote 0
              • B
                borg
                last edited by

                Подредактировал автозагрузку filebeat c

                /etc/filebeat/filebeat
                

                на

                /etc/filebeat/filebeat -c /etc/filebeat/filebeat.yml
                
                1 Reply Last reply Reply Quote 0
                • werterW
                  werter
                  last edited by

                  2 borg
                  Огромное спасибо.

                  1 Reply Last reply Reply Quote 0
                  • B
                    borg
                    last edited by

                    Наткнулся на дашборды для сурикаты
                    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

                    1 Reply Last reply Reply Quote 0
                    • werterW
                      werter
                      last edited by

                      2 borg
                      Спасибо ОГРОМНОЕ )

                      Так же если кому нужно могу объяснить как создать свой патер и использовать его при использовании filebeat

                      Конечно же ! Ждем.

                      1 Reply Last reply Reply Quote 0
                      • B
                        borg
                        last edited by

                        Выяснил что

                        /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
                        
                        1 Reply Last reply Reply Quote 0
                        • B
                          borg
                          last edited by

                          Недавно вернулся к вопросу 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-*

                          1 Reply Last reply Reply Quote 0
                          • werterW
                            werter
                            last edited by

                            Доброе
                            Спасибо за дополнение.

                            1 Reply Last reply Reply Quote 0
                            • X
                              xhangmanx
                              last edited by

                              Такой топик надо закрепить, ну или в FAQ

                              1 Reply Last reply Reply Quote 0
                              • First post
                                Last post
                              Copyright 2025 Rubicon Communications LLC (Netgate). All rights reserved.