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

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