Опять про IDS или ELK для suricata

    Привет, привет!
    Сегодня хочу поделиться с вами опытом по настройке ELK и IDS Suricata. В инете много мануалов, но ни один из них не позволит «завезти» связку этих продуктов в текущих версиях.
    Также есть готовый дистрибутив SELKS — www.stamus-networks.com/open-source/#selks или же, в качестве альтернативы, связка snort, snorby и barnyard2 в SecOnion — blog.securityonion.net.
    Для остальных прошу под кат.

    Итак, что нам надо:
    Систему, которая будет наглядно отображать события с IDS, и чтобы это не был ArcSight, OSSIM, QRadar и т.п.
    Для начала найдем что-нибудь из RHEL7 или CentOS7. Можно и Ubuntu LTS, что вам больше нравится для продакшена.
    А также сами компоненты ELK и IDS.
    Suricata — suricata-ids.org
    ElasticSearch — www.elastic.co/products/elasticsearch
    Logstash — www.elastic.co/products/logstash
    Kibana — www.elastic.co/products/kibana
    Ну и дунуть, чтобы получилось чудо… В смысле, думать!

    IDS


    Для начала доустановим необходимые компоненты (java, json):
    yum -y install java-1.8.0-openjdk-devel.x86_64
    yum -y install gcc libpcap-devel pcre-devel libyaml-devel file-devel   zlib-devel jansson-devel nss-devel libcap-ng-devel libnet-devel tar make   libnetfilter_queue-devel lua-devel
    

    Скачиваем и устанавливаем ids suricata:
    wget http://www.openinfosecfoundation.org/download/suricata-3.0.tar.gz
    tar -xvzf suricata-3.0.tar.gz
    cd suricata-3.0
    ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-nfqueue --enable-lua
    

    Далее
    make; sudo make install; sudo ldconfig
    

    Или следующие команды для автоматического конфигурирования: make install-conf; make install-rules
    make install-full –если вам не нужно что-то тонко настраивать, рекомендую использовать данную команду. Автоматически будут созданы переменные, папки и правила докачаются соостветсвенно в директорию /rules
    При автоматической установке нужная нам директория с логами будет располагаться в:
    @srv-ids ~]# cd /var/log/suricata/
    

    Здесь будут файлы: eve.json fast.log http.log stats.log. Но не все файлы одинаково полезны. Нам нужен тот у которого хвост json
    Теперь необходимо настроить IDS. Мы остановимся только на том, чтобы alerts попадали в json файл. Идем в /etc/suricata/suricata.yaml и находим там блок вывода логов или alerts. Для вывода в json нужен такой конфиг:
    - eve-log:
          enabled: yes
          filetype: regular #regular|syslog|unix_dgram|unix_stream|redis
          filename: eve.json
    

    Остальной конфиг на ваше усмотрение. Благо там есть над чем задуматься.

    ELK


    Далее elsasticsearch:
    Проверяем что там с java:
    java –version
    echo $JAVA_HOME
    

    Если все ок, продолжаем (иначе, в начало заметки).
    Скачиваем и устанавливаем elasticsearch:
    wget https://download.elasticsearch.org/elasticsearch/release/org/elasticsearch/distribution/rpm/elasticsearch/2.2.1/elasticsearch-2.2.1.rpm
    sudo rpm -Uvh ./elasticsearch-2.2.1.rpm 
    sudo systemctl daemon-reload
    sudo systemctl enable elasticsearch.service
    sudo systemctl start elasticsearch.service
    sudo systemctl status elasticsearch.service
    

    Status –OK? Поехали за Logstash
    wget https://download.elastic.co/logstash/logstash/packages/centos/logstash-2.2.2-1.noarch.rpm
    sudo rpm -Uvh ./logstash-2.2.2-1.noarch.rpm
    

    Тверь нужно его настроить, идем в /etc/logstash/conf.d/
    Вот так выглядит рабочий конфиг logstash для текущих версий компонентов ПО:
    input {
      file {
        path => ["/var/log/suricata/eve.json"]
        #sincedb_path => ["/var/lib/logstash/"]   
        codec =>   json
        type => "SuricataIDPS-logs"
        start_position => "beginning"  
    }
    }
    filter {
      if [type] == "SuricataIDPS-logs" {
        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 => "/opt/logstash/vendor/geoip/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 }	
    }
    

    Сохраняем, проверяем конфигурацию:
    @srv-ids ~]# service logstash configtest
    Configuration OK
    

    Напоследок устанавливаем web лицо нашей системы IDS — Kibana4.
    wget https://download.elastic.co/kibana/kibana/kibana-4.4.2-linux-x64.tar.gz
    

    Распаковываем в папку, например так: /opt/kibana4/ или /var/www/html/. В директории /opt/kibana4/bin/ стартуем веб-интерфейс. Можно сделать службу, как — описано здесь discuss.elastic.co/t/run-kibana-as-service-on-centos/23971/2. Я не делал.
    Бывает, что при запуске kibana появляется ошибка «kibana is still indexing», это можно увидеть в консоли или на вэбке в дашборде «Status». Для устранения ошибки делаем следующие команды с проверкой успешности:
    curl -XDELETE http://localhost:9200/.kibana
    curl -XDELETE http://localhost:9200/*
    

    Теперь нам нужны индексы. Идем сюда github.com/StamusNetworks/KTS. Здесь мы найдем уже подготовленные индексы и дашборды.
    git clone https://github.com/StamusNetworks/KTS.git
    patch -p1 -d /opt/kibana4/ < /opt/kibana4/KTS/patches/kibana-integer.patch
    patch -p1 -d /opt/kibana4/ < /opt/kibana4/KTS/patches/timelion-integer.patch
    ./load.sh
    

    Go, go, go!

    Для запуска движка IDS вводим:
    @srv-ids ~]# /usr/bin/suricata -c /etc/suricata//suricata.yaml -i eth0
    

    Обратите внимание на название интерфейса и режим его работы. Для пассивного анализа, необходимо перевезти интерфейс в режим promisc ну и SPAN сессией тоже лучше обзавестись:
    @srv-ids ~]# ifconfig eth0 promisc 
    

    После запуска IDS, размер лог файлов должен существенно увеличиваться.
    Если критичных ошибок при старте не было, заходим на 5601 порт. Выбираем индексы logstash-*, идем в Dashboards и создаем интерфейс отображения под себя. Может получиться что-нибудь похожее на это:

    Или на это (скрин не мой):

    Для того чтобы смотреть на карту, нужно раскоментировать в конфиге logstash эту строку: #database => "/opt/logstash/vendor/geoip/GeoLiteCity.dat" и скачать собственно указанный или аналогичный файл с геолокацией по IP.
    Да еще не забудьте про Log rotation.
    В /etc/logrotate.d/ создаем файл suricata cо следующим содержанием:
    /var/log/suricata/*.log /var/log/suricata/*.json
    {
        rotate 3
        missingok
        nocompress
        create
        sharedscripts
        postrotate
                /bin/kill -HUP $(cat /var/run/suricata.pid)
        endscript
    }
    

    Буду рад вашим комментариям.
    Если будете пробовать и не заведтся ELK или suricata, пишите, может что и выйдет=)
    • +7
    • 17,4k
    • 4
    Поделиться публикацией

    Комментарии 4

      0
      Да, совместимость продуктов меня повергла в смятение. Пытался поднять ELK "родным" методом — репозиторий, установка, конфигурация — фигли, последние версии продуктов друг друга не видят! Нашел готовый SELKS, а там используются более старые пакеты :) Попробовал их же вручную — с полпинка завелись.
      Где я свернул невтуды на последних версиях? Или это не баг, а фича?
        0
        Это open source=), приходится читать про те малюсенькие изменения, которые делают разработчики, так сказать своеобразная плата за продукты.
          0
          да у того же logstash уже так просто порт на прослушку не откроешь :D А если откроешь, он не будет отдавать их в elasticsearch..
        0
        Тверь => Теперь

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое