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