ITСooky

IT-рецепты съедобные и не очень!

Установка на FreeBSD 9 системы анализа Snort и блокировки SnortSAM зловредного трафика!

дата 22.06.2014

Вот представьте себе, что ваш сервер будет отлавливать весь трафик через него проходящий смотреть в нем от кого куда, и проверять его на правила в которых описаны все зловредные действия и источники, получать эти правила автоматически платно или бесплатно, и вы сможете смотреть через вебинтерфейс статистику угроз и что самое главное автоматически сервер будет блокировать самые опасные угрозы!

Snorby_-_Dashboard_-_2014-06-22_18.11.40

Представили? Ну все на самом деле не совсем так радужно… Да Snort ловит трафик, но обрабатывать его не умеет, для этого надо поставить barnyard2 чтобы он его перегонял в MySQL. Также Snort не умеет сам скачивать правила для этого будем ставить oinkmaster. Будем ставить Snorby(не понравился он мне, через руби-он-рейлс сделано и глючит), чтобы смотреть что barnyard2 прочитал в логах Snort’a. Также Snort(уже нет, в старых версиях да) не умеет общаться с блокировщиком для этого к barnyard2 прикрутим SnortSAM но автоматически ему сказать блокируй все красные угрозы мы не сможем… То есть, мы сможем ему сгенерировать файл на какие он угрозы будет реагировать полуавтоматическим способом, но вот встроенного 100% способа нет, почему то!(и да это самая долгая и костыльная установка эвер)

Устанавливаем Snort
Mysql и Apache у нас уже стоит

cd /usr/ports/security/snort
make

-убираем поддержку IP6
-когда появятся настройки установки barnyard2 выбираем c MySQL
make install

Редактируем файл
vi /usr/local/etc/snort/snort.conf

тут пишем свою локальную сеть

ipvar HOME_NET [192.168.2.0/24]

пока больше ничего туда не пишем, хотя там можно для каждого сервиса прописать свой ip если есть, или порты например для HTTP серверов

правим пути с

var RULE_PATH ./rules
var SO_RULE_PATH ./so_rules
var PREPROC_RULE_PATH ./preproc_rules

на

var RULE_PATH rules
var SO_RULE_PATH so_rules
var PREPROC_RULE_PATH preproc_rules

и еще две на

var WHITE_LIST_PATH rules
var BLACK_LIST_PATH rules

Находим и блокируем строчки

#include $RULE_PATH/local.rules

И разблокируем подправив (главное удалить nostamp)

output unified2: filename snort.log, limit 32, mpls_event_types, vlan_event_types

Создаем папки которые прописаны в настройках, но не созданы
mkdir /usr/local/etc/snort/rules
mkdir /usr/local/etc/snort/so_rules
mkdir /usr/local/etc/snort/rules/local.rules
mkdir /var/log/snort/

Также создаем файлы пустые но нужные
touch /usr/local/etc/snort/rules/black_list.rules
touch /usr/local/etc/snort/rules/white_list.rules

Ставим систему обновления правил, работает с персональным кодом полученным на сайте snort.org. Незарегистрированные могут скачать какие-то правила, зарегистрированные настоящие правила с задержкой в месяц. Так что пока ставится регестрируемся и получаем в My Accaunt > Subscriptions and Oinkcodes тот самый Oinkcodes надо будет нажать Generate Code

cd /usr/ports/security/oinkmaster
make
make install

Копируем конфиг
cp /usr/local/etc/oinkmaster.conf.sample /usr/local/etc/oinkmaster.conf
и правим его
vi /usr/local/etc/oinkmaster.conf

доводим секцию

# Example for Snort-current ("current" means cvs snapshots).

до вида

url = http://www.snort.org/pub-bin/oinkmaster.cgi/oinkcode/snortrules-snapshot
-CURRENT.tar.gz

вместо oinkcode пишем свой оинк код с сайта
вместо CURRENT пишем версию Snort смотрим её
snort -V

   ,,_     -*> Snort! <*-
  o"  )~   Version 2.9.6.0 GRE (Build 47) FreeBSD
   ''''    By Martin Roesch & The Snort Team: http://www.snort.org/snort/snort-team
           Copyright (C) 2014 Cisco and/or its affiliates. All rights reserved.
           Copyright (C) 1998-2013 Sourcefire, Inc., et al.
           Using libpcap version 1.5.2
           Using PCRE version: 8.33 2013-05-28
           Using ZLIB version: 1.2.7

значит писать надо 2960

Правила большие ждемс пока скачает!

Вставляем в расписание обновление правил на 5:30 утра
crontab -e
вставляем
30 5 * * * /usr/local/bin/oinkmaster -o /usr/local/etc/snort/rules/ >/dev/null 2>&1

Пытаемся запустить Snort
snort -c /usr/local/etc/snort/snort.conf

Ругается говорит нет правил sensitive-data.rules
делаем ему этот файл из sample(конечно надо бы и заглянуть в него, но сейчаси так много непонятного)
cp /usr/local/etc/snort/preproc_rules/sensitive-data.rules-sample /usr/local/etc/snort/preproc_rules/sensitive-data.rules

Опять запускаем вроде бы не ругается значит работает как бы!

В rc.conf
vi rc.conf
Добавляем
snort_enable="YES"

Еще один момент snort будет создавать файлы логов лимит по 32 мегабайта(limit 32 в snort.conf) то есть дойдя до 32 мегабайт он начнет писать в новый и так далее — ротации логов нет никакой!!! Надо об этом подумать — будем через крон удалять файлы в папке логов снорта старше 15 дней создания — есть маленькая вероятность что при долгом простоее можно удалить файл в который snort еще пишет… но очень маленькая
crontab -e
вставляем строчку удалять в 6 утра все файлы в этой папке старее 15 дней

* 6 * * * /usr/bin/find /var/log/snort/ -type f -mtime +15 -exec rm -f {} \; >/dev/null 2>&1

Или по такому сценарию каждые пару часов удалять все кроме последних 5-ти файлов, это если мы уверены что Barnyard2 успевает их прочитать те что до последних 5-ти(а он может и не успевать). Для этого файлы должны быть достаточно большими, если у вас в минуту 200 мегабайт, то чтобы это правило успешно работало надо или вместо 5 последних если в snort linit на один файл гораздо меньше 200, ставить последние 30 чтобы хранились или увеличивать limit…

* */3 * * * /bin/ls -t1 /var/log/snort | awk -vpath=/var/log/snort/ '{print path$1}' | /usr/bin/tail -n +6 | /usr/bin/xargs /bin/rm -r

Теперь подключаем Snort к базе MySQL через Barnyard2
он установился вместе со Snort по умолчанию(надо только галочку ставить MySQL при его Барнярд настройки). Он берет предупреждения из логов Snort и вставляет их в Mysql

Создаем для него базу
Заходим в MySQL

mysql -u root -p

CREATE DATABASE snort;
GRANT ALL PRIVILEGES ON snort.* TO 'snort'@'localhost' IDENTIFIED BY 'snortpassword';
FLUSH PRIVILEGES;
quit

создаем структуру
mysql -u snort -psnortpassword snort < /usr/local/share/examples/barnyard2/create_mysql

в файле
vi /usr/local/etc/barnyard2.conf
находим заблокированную строчкуу разблокируем её и приводим к виду

output database: log, mysql, user=snort password=snortpassword dbname=snort host=localhost

Также прописываем
config hostname: ITCooky_VPS
config interface: em0

Разблокируем
# enable printing of the interface name when alerting.
#
config alert_with_interface_name

Проверяем
/usr/local/bin/barnyard2 -c /usr/local/etc/barnyard2.conf -d /var/log/snort -f snort.log
Должен запуститься

По идеии надо rc.conf
vi /etc/rc.conf
добавляем чтобы сам стартовал на загрузке
barnyard2_enable="YES"
Но у меня это не приводит к старту обраточика логов snort тобишь barnyard он должен старатнуть прочесть те что у же есть и висеть ждать новых.

Судя по /var/log/message на старте он пытает зайти в MySQL, не получается, она видимо еще не поднялась и он отрубается - не знаю что с этим делать...

...Так что стартанука я его через crontab на ребуте!
crontab -e
вставляем
@reboot /usr/local/bin/barnyard2 -Dn -c /usr/local/etc/barnyard2.conf -d /var/log/snort -f snort.log >/dev/null 2>&1

Или вот так, перед запуском удаляется все старые логи останется только один, а так как при перезагрузки Snort создает новый файл логов то это нам просто очистить папку.
@reboot /bin/ls -t1 /var/log/snort | awk -vpath=/var/log/snort/'{print path$1}' | /usr/bin/tail -n +2 |/usr/bin/xargs /bin/rm && /usr/local/bin/barnyard2 -Dn -c /usr/local/etc/barnyard2.conf -d /var/log/snort -f snort.log >/dev/null 2>&1

Устанавливаем web-interface Snorby

Скачиваем как-нибудь с сайта snorby.org последнею версию и как нибудь кладем её на сервер.

Как это не удивительно, но вот если взять мой сервер и сервисы на нем каждый из них для вебинтерфейса использует свою реализацию вебсервера эммм. Snorby как мне кажется работает на модном Ruby on Rails конечно его у меня не стояло... Процесс установки Snorby хорошо описан в 2011 году в 7 номере BSD Magazine обычным человеческим, тоесть FreeBSD способом его не установить, это ведь даже не через жаву сделано!!!

Нужно
cd /usr/ports/devel/ruby-gems/
make
make install

Нужно
cd /usr/ports/devel/git
make -DBATCH install clean

Продолжаем
/usr/local/bin/gem install prawn --no-rdoc --no-ri
/usr/local/bin/gem install rake -v 0.8.7 --no-rdoc --no-ri
/usr/local/bin/gem install rails --no-rdoc --no-ri
/usr/local/bin/gem install mysql --no-rdoc --no-ri
/usr/local/bin/gem install passenger --no-rdoc --no-ri
/usr/local/bin/passenger-install-apache2-module -a

делают папку под Snorby
mkdir /usr/local/www/snorby
cd /usr/local/www/snorby

кладем туда заранее скаченный файл и распаковываем его
tar -xzf snorby-2.6.2.tar.gz
все содержимое папки /usr/local/www/snorby-2.6.2 перетаскиваем в /usr/local/www/snorby меня консоль выбисила перенес через MC
chown -R www:www /usr/local/www/snorby

тут исполняем следующие комманды
bundle pack
bundle install --path vender/cache
rake snorby:setup

Радует конечно что не через жаву, но почему не через нормальное место, почему каждый раз надо выдумывать свой веб-сервер, веб-язык, веб-всё!!!

С последней командой возникнет масса проблем
первая

Gem::LoadError: You have already activated rake 10.3.2, but your Gemfile requires rake 0.9.2. Prepending `bundle exec` to your command may solve this.

слушаемся и добавляем
bundle exec rake snorby:setup

ошибка не может сама скопировать чтоли

Snorby Configuration Error
* Please EDIT and rename config/snorby_config.yml.example to config/snorby_config.yml

Правим ручкой сразу несколько таких файлов

cp /usr/local/www/snorby/config/snorby_config.yml.example /usr/local/www/snorby/config/snorby_config.yml
Следущий файл имеет смысл отредактировать, страно что бсдымагазин не пишет об этом в 2011 году, зато у них все как по маслу!
cp /usr/local/www/snorby/config/database.yml.example /usr/local/www/snorby/config/database.yml
vi /usr/local/www/snorby/config/database.yml

тут Пишим root пароль от Mysql чтобы сам сделал базу

snorby: &snorby
adapter: mysql
username: root
password: "Enter Password Here" # Example: password: "s3cr3tsauce"
host: localhost

повторяем
bundle exec rake snorby:setup

ошибка

[datamapper] Created database 'snorby'
rake aborted!
Unknown table engine 'InnoDB'

Как становится понятно мой MySQL не поддерживает InnoDB (почему то вдруг вот)это становится понтяно если зайти в консоль MySQL и посмотреть что поддерживает:
mysql> SHOW ENGINES;

Достаем InnoDB хотя MySQL нам сообщает что он включен начиная с версии 5.1.23 по факту его нет!

Помогает переустановка, другие средства InnoDB не помогли включить... даже странно, может повыщение версии помогло!
make deinstall
make rmconfig
make
make install

Стираем базу snorby(она успела создаться при недоустановки и её наличе будет ошибкой в новой установке) и запускаем опять:

bundle exec rake snorby:setup

вроде бы все хорошо прошло, немного пугает что в последних строчках о какихто snorby ворк процессах, это что вебстраничку надо будет с консоли запускать ыыыы...

Опять делаем
chown -R www:www /usr/local/www/snorby

При одной из установок говорились что надо в apache конфиг вствить следующие
vi /usr/local/etc/apache22/httpd.conf
вставляем в самом низу(неважно)

LoadModule passenger_module /usr/local/lib/ruby/gems/1.9/gems/passenger-4.0.44/buildout/apache2/mod_passenger.so
   <IfModule mod_passenger.c>
     PassengerRoot /usr/local/lib/ruby/gems/1.9/gems/passenger-4.0.44
     PassengerDefaultRuby /usr/local/bin/ruby19
   </IfModule>

тут же
Находим строку

Listen 80

добавляем под ней

Listen 3001

Находим строку и раскоменчиваем её

Include etc/apache22/extra/httpd-vhosts.conf

Редактируем виртуальные хосты
vi /usr/local/etc/apache22/extra/httpd-vhosts.conf
весь файл выглядит так

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot "/usr/local/www/apache22/data"
 <Directory "/usr/local/www/apache22/data">
                AllowOverride all
                Order deny,allow
                Allow from all
        </Directory>

</VirtualHost>

<VirtualHost *:3001>
        ServerAdmin webmaster@localhost
        DocumentRoot "/usr/local/www/snorby/public"

        <Directory "/usr/local/www/snorby/public">
                AllowOverride all
                Order deny,allow
                Allow from all
                Options -MultiViews
        </Directory>

</VirtualHost>

На 80ом порту висит просто вебсервер, а на 3001 висит Snorby!

Перезагружаем Апаче
/usr/local/etc/rc.d/apache22 restart

Пробуем зайти по
http://ваш_айпи:3001
Думает, думает иии ГОНОЛУЛА!

Snorby_-_Please_log_in_to_continue..._-_2014-06-03_15.18.43

Заходим
имя: snorby@snorby.org
пароль: snorby
Веб-интерфейс Snorby запустился...
Snorby_-_Dashboard_-_2014-06-07_08.30.53

...и только тут понимаешь что при установки Snorby не было ни слово о его связи с Snortом или с базой Snorta!

Это не значит что предушие шаги были неважны для работы, они были важны для установки, а значит и для работы! Snorby не умеет читать логи Snort, Snorby создал свою базу в ней теже поля что в базе barnyard2, но и куча своих. barnyard2 умеет читать логи Snort и пишет их в свою базу! Очевидно надо barnyard2 подсунуть базу Snorby, чтобы писал в неё! Snorby при установки хотел работать с MySQL только от рута, значит ему надо подсунуть пользователя snort!

Заходим в MySQL
mysql -u root -p

Делаем
GRANT ALL PRIVILEGES ON snorby.* TO 'snort'@'localhost' IDENTIFIED BY 'newsnortpassword';
quit

в файле
vi /usr/local/etc/barnyard2.conf
находим строчку настройками базы и приводим к виду
output database: log, mysql, user=snort password=newsnortpassword dbname=snorby host=localhost
Тоже в snorby
vi /usr/local/www/snorby/config/database.yml
тут Пишим root пароль от Mysql чтобы сам сделал базу
snorby: &snorby
adapter: mysql
username: snort
password: "newsnortpassword" # Example: password: "s3cr3tsauce"
host: localhost

UPD: Snorby продолжает удивлять
он пишет огромный лог в
/usr/local/www/snorby/log/
Что с этим делать не понятно - буду тупо тереть через crontab
crontab -e
вставляем строку
*/30 * * * * /bin/rm /usr/local/www/snorby/log/*.log >/dev/null 2>&1

Перезагружаемся, надо бы конечно рестартануть только снорт, баньярд и наверное снорби - но мне лень, для дома и семьи не страшно и перезагрузить лишний разок другой целиком сервер.

Это еще не всё!

В настойках админа ставим ваш наш часовой пояс(это вродебы важно)
Snorby_-_User_Settings_-_2014-06-07_09.14.18

UPD: О Времени
Неважно какой вы выберите часовой пояс в вебинтерфейсе - если он такой же как и у вашего сервера то даты в Events будут на час в перед, а в инфе об обнолвение графиков на 2 часа в перед. Единствнно место где время будет правильно это срок запуска процессов Snorby...

...и нельзя просто так взять и указать свой часовой пояс в
/usr/local/www/snorby/config/snorby_config.yml
в строке time_zone
production:
domain: localhost:3001
wkhtmltopdf: /usr/local/bin/wkhtmltopdf
ssl: false
mailer_sender: 'snorby@snorby.org'
geoip_uri: "http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/
GeoIP.dat.gz"
rules:
- ""
authentication_mode: database
# uncomment to set time zone to time zone of box from /usr/share/zoneinfo, e.g.
"America/Cancun"
time_zone: 'Eroupe/Moscow'

Надо еще и в файле
/usr/local/www/snorby/config/application.rb
вот эту строчку надо закоментить

##    time_zone = CONFIG[:time_zone] # set your local time zone here. use rake time:zones:local to choose a value, or use UTC.

а эту добавить, после

time_zone = "Europe/Moscow"

Проблему с временем это не решит. Но будет грузится без ошибки на настройки.

Snorby пока еще не работает видим ошибку
The Snorby worker is not currently running.

Ошибка известная еще в 2011 году обещали скоро исправить!
Создаем скрипт, в журнале предлагает bash скрипт который и сам по себе с ошибками и не работает так как надо!

Вообще как то с bash у меня не сложилось, нужен мне был язык который заменяет глаза и руки админа - ну тоесть выполнил команду - вижу что какое то значение столько - значит надо сделать то-то. И вот это я нашел в Expect

Устанавливаем
cd /usr/ports/lang/expect
make
make install

пишем
vi /root/run_snorby_WP
вставляем

#!/usr/local/bin/expect -f
set timeout 1000
spawn /bin/ps aux
expect "delayed_job" {
exit
}
cd /usr/local/www/snorby
spawn /usr/local/bin/ruby ./script/delayed_job start RAILS_ENV=production
expect "ERROR: there is already one or more instance(s) of the program running" {
cd /usr/local/www/snorby
system /usr/local/bin/ruby ./script/delayed_job restart RAILS_ENV=production
}
exit

UPD: Второй вариант чтобы заставить Snorby обновлять графики!
Но скорее всего у вас как и уменя Snorby все равно не будет обновлять графики и ни что из фебинтерфейса заставить его это сделать не сможет.

Чтобы это исправить прикручиваем следующий костыль!
пишем
vi /root/run_snorby_WP2
вставляем

#!/usr/local/bin/expect -f
set timeout -1
log_user 0
#exp_internal 1
set mysqlpass none
spawn /usr/bin/sed -n "s/^.*password\: \"\\(.*\\)\".*/\\1/p" /usr/local/www/snorby/config/database.yml
#spawn /usr/bin/sed -n "/Mysql/{n\;n\;p\;}" /root/dp
expect "\[a-z,A-z,0-9]*" {
set mysqlpass $expect_out(buffer)
}
interact
spawn /usr/local/bin/mysql -u snort -p
expect "Enter password:" {
send "$mysqlpass\n"}
expect "mysql>" {
send "use snorby;\n"}
expect "Database changed" {
send "TRUNCATE TABLE caches;\n"}
expect "Query OK" {
send "exit\n"}
set killid 0
spawn /bin/ps aux
expect "delayed_job" {
set killid 1
}
if $killid==0 {
catch {system cd /usr/local/www/snorby\;/usr/local/bin/ruby /usr/local/www/snorby/script/delayed_job start RAILS_ENV=production}
catch {system cd /usr/local/www/snorby\;/usr/local/bin/rails runner \"Snorby\:\:Jobs\:\:SensorCacheJob.new\(false\).perform\;\"}
catch {system cd /usr/local/www/snorby\;/usr/local/bin/rails runner \"Snorby\:\:Jobs\:\:DailyCacheJob.new\(false\).perform\;\"}
} else  {
system cd /usr/local/www/snorby
catch {system cd /usr/local/www/snorby\;/usr/local/bin/ruby /usr/local/www/snorby/script/delayed_job restart RAILS_ENV=production}
catch {system cd /usr/local/www/snorby\;/usr/local/bin/rails runner \"Snorby\:\:Jobs\:\:SensorCacheJob.new\(false\).perform\;\"}
catch {system cd /usr/local/www/snorby\;/usr/local/bin/rails runner \"Snorby\:\:Jobs\:\:DailyCacheJob.new\(false\).perform\;\"}
}
exit


Этот скрипт берет пароль пользователя Snorby к базе MySQL, заходит сбрасывает caches и перезапускает рабочий процесс Snorby.

НО! Скрипт (хотя я думаю это все из-за Snorby) не всегда кульминируетца запуском того что нужно - вот нет! И тут пригодится первый скрипт!
В crontab вот такая конструкция которая гарантирует обновление Snorby, раз в час с гарантией 66,666666666666666666666%

50 * * * * /usr/local/bin/expect -f /root/run_snorby_WP2 >/dev/null 2>&1

Сам перезапуск длится мянут пять!

вручную можно запустить процесс так
expect /root/run_snorby_WP

убить можно посмотрев какой у него ID (или у них, их два)
ps aux | grep -v "grep" | grep delayed_job

root     1420   0.0  6.8  94668  69632 ??  S     1:05PM  0:02.52 ruby: delayed_job (ruby)

и
kill 1420

Вставляем в crontab
crontab -e
строку чтобы проверялся(на 50-ой минуте, каждого часа) запущенли и на загрузке

50 * * * * /usr/local/bin/expect -f /root/run_snorby_WP >/dev/null 2>&1
@reboot /usr/local/bin/expect -f /root/run_snorby_WP >/dev/null 2>&1

И так для чистоты диагностики перезагрузимся!!!

Минут через 5-10 все что нужно и пошла информацияяя
Snorby_-_Dashboard_-_2014-06-07_16.05.21
Информация обновляется раз в 7 минут(почему-то)!
За одну секунду набралось 30000 желтых, пакеты они такие летают со скростью близкой к скорости света!

Можно посмотреть совершенно полнейшею информацию по совершенно не понтяному почему в легкой степени не хорошему пойманому трафику!

Snorby тупит! Иногда он перестает сам обновлять информацию, вы заходите в него, а события только за прошлую неделю, хотя они в базе есть... Разрабы Snorby решили эту проблему добавили кнопку More optiones > Force cache update

ВНИМАНИЕ: Snorby опять остановился, на это раз это не остановка Snort, не самоубийство процесса delayed_job он запушен... Это просто он не хочет обновить данные, если вы не видете последних данные, а знаете что они есть(да они даже в его Events видны) но на графике их нет, нажимайте More optiones > Force cache update! Делать это придется не каждый раз, но постоянно!

Все больше укрепляюсь в мысли, что Snorby - параша. Ведь выж с сами прикиньте, что от него требуется - прочитать базу MySQL - в которую усилиями snort и barnyard2 уже положены записи о событиях. И будь Snorby написан на каком-нибудь PHP проблем вообще бы с этим не было, но он на ruby on rails он какие-то процессы хочет, не можети, запустить чтобы что? ЧТОБЫ ПРОСТО ПРОЧИТАТЬ БАЗУ!!! Нет достопочимые господа, порашас она и есть параша!

UPD: Нерешенная проблема По моему мнению, большой объем ингформации из-за правила stream5: TCP session without 3-way handshake в купе с глючностью всего подвешивает работу всего IDS!!! Хотелось бы еще отключить собтыие stream5: TCP session without 3-way handshake но я не нашел где как!

Всё! Ставим SnortSAM
Снортсам скорее мертв чем жив, мертв сайт и все старые способы его установки и работы. Но вот есть подсказка, бесценная раньше он работал через Snort сейчас через Barnyard2 README.snortsam она и спасает!

Устанавливаем!
cd /usr/ports/security/snortsam/
make

По умолчанию, главное чтобы галочка была на IPFW

Тут установка ругается говорит не может скачать нужный файл, такое бывает, и главное говорит какой файл. Делаем руками, скачиваем у Никалая Эрнестовича, ему можно доверять он проверенный товарищ.
cd /usr/ports/distfiles/
fetch http://val.bmstu.ru/unix/snort/snortsam-src-2.70.tar.gz

Возврашаемся
cd /usr/ports/security/snortsam/
make
make install

Копируем файл настроек из примера
cp /usr/local/etc/snortsam/snortsam.conf.sample /usr/local/etc/snortsam/snortsam.conf
он большой и весь закоменченный, редактируем
vi /usr/local/etc/snortsam/snortsam.conf
открываем и меняем строки

defaultkey pAs$VV0roI

тут пишем ключ с которым Снорт будет подключаться

port 898

тут пишем порт на котором он будет слушать (он должен быть свободен)

accept 127.0.0.1

тут прописываем от кого принимать команды на блокировку, пароль будет поумолчанию заданные выше

dontblock <host>/<mask>
dontunblock <host>/<mask>

хорошие строки кого никогда не блокировать и кого никогда не разблокировать(единожды заблокировав так надо это понимать?)

много там таких полезных настроек
system /usr/local/bin/rails runner "Snorby::Jobs::SensorCacheJob.new\\(false\\).perform;Snorby::Jobs::DailyCacheJob.new\\(false\\).perform;"

logfile snortsam.log

имя лог файла, в таком виде будет писаться в /root/ директорию
так что правим на

logfile /var/log/snortsam.log
loglevel 2

да так

fwexec /sbin/ipfw

путь к нашему файрволу

ipfw2 em0 1 2

пишем так чтобы слушал и блокировал на внешнем интерфейсе em0.

В ipfw добавляем правило повыше
vi /etc/rc.firewall
такое

${FwCMD} add deny ip from any to "table(1)" via em0
${FwCMD} add deny ip from "table(2)" to any via em0

Теперь правим Barnyard2 раньше надо было тоже самое писать в Snort но это осталось в прошлом!
vi /usr/local/etc/barnyard2.conf

Добавляем в самом конце

output alert_fwsam: 127.0.0.1:898/pAs$VV0roI

В rc.conf не ставим
snortsam_enable="YES"
я подчеркиваю НЕ СТАВИМ, а то сервер не загрузится!

Добавим в
crontab -e
строку

@reboot /usr/local/sbin/snortsam  >/dev/null 2>&1

И возьмемка и перегрузим Сервер чтобы перезагрузить всея.

Создадим файл с нашим тестовым правилом
vi /usr/local/etc/snort/rules/local.rules/test.rules
в него добавим строку

alert tcp 192.168.1.200 any -> 192.168.1.100 any (msg:"TEST block localserver port 80"; sid:5555501; rev:1; priority:1;)

rev это версия правила, если её вообще не писать то правило работать не будет.

priority 1 это страшность это правило будет красным!

Когда пишем правило помним что блокируется трафик проходящий через шлюз, а собственно локальная сеть если IP в одной маске то они общаются напрямую без шлюза! То есть дискриминация применима к трафику на внешние сети! (при этом шлюз слышит весь внутренний трафик конечно же, и который не через него)

И еще snort слушает на внешнем интерфейсе em0(192.168.1.200), и как бы за NAT тоесть для него все локальные запросы видны как с 192.168.1.200, под это и пишем правило!

В snort.conf пишем строчку

include $RULE_PATH/local.rules/test.rules

Проверяем наше правило (всмысле все сразу но и новое правило тоже)
snort -T -c /usr/local/etc/snort/snort.conf
Хорошо если не ругается

В тойже папке где лежит barnyard2.conf создаем файл sid-block.map
vi /usr/local/etc/sid-block.map

а туда вставлем строчку с SID направлением и временем блокировки

5555501: dst, 10 min

это значит что мы 192.168.1.200 блокируем доступ на 192.168.1.4 (если тут писать src то заблокируется наоброт и ничего не даст)

Перезапускаем Snort и Barnyard2
/usr/local/bin/snort restart
Не срабатывает, ну и хрен с ним, перегружу сервер целиком

Пытаемся зайти на 192.168.1.4 он может даже открыться но пройдет пару секунд и!

ERROR
The requested URL could not be retrieved

While trying to retrieve the URL: http://192.168.1.4/

The following error was encountered:

    Connection to Failed 

The system returned:

    (13) Permission denied

The remote host or network may be down. Please try the request again.

Your cache administrator is webmaster.
Generated Sun, 22 Jun 2014 12:08:09 GMT by localhost.ITCookoy_VPS (squid/2.7.STABLE9) 

Смотрим Snorby собщает о красном случае под названием Snort Alert [1:5555501:1]
snort_snorby_001

Посмотрим заблокировали ли нас в файрволе IPFW
ipfw -i table 1 list

192.168.1.4/32 0.0.0.0

ipfw -i table 2 list

192.168.1.4/32 0.0.0.0

Ура, правило сработало, блокировка сработала!!!

Но это не все надо теперь со всеми красными правилам от snort полученных автоматом по апдейту сделать тоже самое...
...хотя нет всё!!! Установка завершена!!! Готового способа сгенерировать sid-block.map нет, а придумывать это не на одну неделю задача (надо еще это привезать к обновлению правил oinkmaster)

UPD: Удалось! Пройти ад регулярных выражений и - автоматически сгенерировать файл блокировок sid-block.map для snortsam!

Регулярное выражение словами хватаем строку:
^[^\#] - которая не начинается с #
.*sid: - любая белеберда в строке слева на право, которая содержит sid:
(.[0-9]*[0-9]\) - как я понял () это то что мы хватаем, а [0-9]*[0-9] любое последовательное количество цифр
.* - билерда на конце
дальше то что касается sed
s// - оператор какойто связанный с записью
который записывает \1":" "src," "30min"/p"
\1 - то что мы поймали раньше
":" "src," "30min" - текст который мы к нему прикрепляем, тут внутри ковычек вот эти ковычки " " задают пробел
\p - это переход на новую строку энтер

Далее пишем пути к файлам, через пробел, выбирал по страшности название, многие бесплатно полученные файлы пусты, другие в правилах содержать URL не знаю подходят ли они для блокировки через IPFW. Тут в конце тестовые правила для симуляции red alert - в реальности его не дождешься!

Также не берусь судить стоит ли все эти правила блокировать по src

sed -n "\%^[^\#].*sid:\(.[0-9]*[0-9]\).*% s//\1":" "src," "30min"/p" /usr/local/etc/snort/rules/backdoor.rules /usr/local/etc/snort/rules/bad-traffic.rules /usr/local/etc/snort/rules/black_list.rules /usr/local/etc/snort/rules/botnet-cnc.rules /usr/local/etc/snort/rules/ddos.rules /usr/local/etc/snort/rules/exploit-kit.rules /usr/local/etc/snort/rules/exploit.rules /usr/local/etc/snort/rules/blacklist.rules /usr/local/etc/snort/rules/malware-backdoor.rules  /usr/local/etc/snort/rules/malware-cnc.rules /usr/local/etc/snort/rules/malware-other.rules /usr/local/etc/snort/rules/malware-tools.rules /usr/local/etc/snort/rules/phishing-spam.rules /usr/local/etc/snort/rules/policy-spam.rules /usr/local/etc/snort/rules/spyware-put.rules /usr/local/etc/snort/rules/virus.rules /usr/local/etc/snort/rules/web-attacks.rules /usr/local/etc/snort/rules/local.rules/test.rules >  /usr/local/etc/sid-block.map

Перезагружаем Barnyard2 как-нибудь...красивого способа не вижу!
Выясняем номер его процесса
ps aux | grep barnyard2

root     1268   0.0  0.5  18632   5140 ??  Ss   12:32PM 0:00.40 /usr/local/bin/barnyard2 -Dn -c /usr/local/e

Убиваем его
kill 1268
И опять стартуем
/usr/local/bin/barnyard2 -Dn -c /usr/local/etc/barnyard2.conf -d /var/log/snort -f snort.log

UPD: Автоматизируем всё! Обновление правил с сайта Snort и обновление затем что блакировать! Так как с первым справляется oinkmaster, то займемся вторым!

Для начала разделим правила которые надо блокировать по src(источник запроса), и dst (пункт назначения)!
В бесплатных правилах много пустых правил, так что из тех что есть...ммм

Бесплатные правила похоже бесполезны чуть менее чем совсем! Или я не понял что они призваны блокировать? Всю сеть если кто-то просканировал такой порт, я то надеялся что SNort умеет знать источники атак? Ну да ладно, мне главное написать скрипт автоматизации - создать идеальные правила безопасности такой задачи не стоит!

Так как многие правила безопасности пустые то я придумаю два файла правил:
/tmp/test/blocksrc.rules - блокирует источник опасности
/tmp/test/blockdst.rules - блокирует пункт назначения опасности

У нас будут две команды sed

удаляет старый файл вставляет в него все записи по новой из файла blocksrc.rules блокирует по src

sed -n "\%^[^\#].*sid:\(.[0-9]*[0-9]\).*% s//\1":" "src," "30min"/p" /tmp/test/blocksrc.rules >  /tmp/test/sid-block.map

добавляет в уже созданный файл записи блокирующие по dst

sed -n "\%^[^\#].*sid:\(.[0-9]*[0-9]\).*% s//\1":" "dst," "30min"/p" /tmp/test/blockdst.rules > /tmp/test/sbd_tmp.map

Мне не удалось заставить sed дописать в первый файл блокировки dst, так что третей командой склеиваем два файла

cat /tmp/test/sbd_tmp.map >> /tmp/test/sid-block.map

Итого в crontb
crontab -e
Модифицируем запись oinkmaster чтобы он по его окончании выполнял пересборн файл блокировок и перезагрузку barnyard2

30 5 * * * /usr/local/bin/oinkmaster -o /usr/local/etc/snort/rules/&&/usr/bin/sed -n "\%^[^\#].*sid:\(.[0-9]*[0-9]\).*% s//\1":" "src," "30min"/p" /tmp/test/blocksrc.rules >  /tmp/test/sid-block.map&&/usr/bin/sed -n "\%^[^\#].*sid:\(.[0-9]*[0-9]\).*% s//\1":" "dst," "30min"/p" /tmp/test/blockdst.rules > /tmp/test/sbd_tmp.map&&/bin/cat /tmp/test/sbd_tmp.map >> /tmp/test/sid-block.map&&/bin/ps aux | /usr/bin/grep -v "grep" | /usr/bin/grep /usr/local/bin/barnyard2 | /usr/bin/awk '{print $2}' | /usr/bin/xargs kill&&/usr/local/bin/barnyard2 -Dn -c /usr/local/etc/barnyard2.conf -d /var/log/snort -f snort.log >/dev/null 2>&1

UPD: Для этой системы требутся ресурсы, потому что совершенно неожиданные моменты могут создать кучу трафика Snort его честно и быстро засунет в файлы своего лога, а Barnyard2 вместе с MySQL будет по полчаса вытаскивать!

Вот например за две минуты Snort родил 200 мегабайт трафика, а Barnyard2 (сижу на него смотрю) запихивает уже сорок минут в MySQL и это на виртуальной машине с харками Intel(R) Core(TM)2 Duo CPU E8400 @ 3.00GHz с 2 GB RAM выделено два ядра 60% и 1 Gb! Что выразилось в падение скорости интернета для полдьзователей на этом шлюзе, даже не падения а они стали долго ждать открытия страницы, хотя после ожидания открывается быстро. НО нагрузка на Barnyard2 невлияет на блокировку, он такая же быстра (со второго зловредного запроса, с первого не успевает, пока воткнет)

Зато можно посмотреть кто создал чудовищный трафик:
это vk.com/widget_like.php пока насчитано 92 тысячи мусорных запросов
Snorby_-_Listing_Sessions_-_2014-06-22_22.44.18
Немного беспокоит что взрыв трафика произошел на планшете под Android, в момент открытия сайта где есть виджет лайкнуть вконтакте и он наверняка повторится...

UPD: Экспорт отчетов snorby в PDF
Идем за конвертором
cd /usr/ports/converters/wkhtmltopdf
и ставим
make
make install

И это всё. В PDF будет все что на графиках (как способ получать более точную и актуальную инфу значит не подойдет). Красиво выглядит, из минусов только странный формат не A4!
snorby_to_pdf


7 комментариев to “Установка на FreeBSD 9 системы анализа Snort и блокировки SnortSAM зловредного трафика!”

  1. Jamal:

    Respekt Avtoru.
    Oqromnoe vam spasibo za prekrasniy dokument

  2. Jamal:

    Tolko barnyard v daemon rejime rabotaet

    I on padaet lish v tom sluchae koqda, ne mojet chitat novie logi ot /var/log/snort

    I za etoqo ya sozdal novoqo polzovatelya snort i barny i i dobavil v cron nijnyuyu stroku ivse.

    # Snort logs chown
    */1 * * * * root chown -R barny:snort /var/log/snort

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *