Установка snort совместно с acid и snortsam на FreeBSD.

Snort - мощный и гибкий инструмент для обнаружения различного вида атак.

Snortsam - плагин для snort, обеспечивающий блокировку атак, имеет намного большие возможности чем широко используемый guardian. Основной отличие - может обслуживать множество фаерволов+snort с отдельной машины. Подробнее можно почитать на www.snortsam.net

Oinkmaster - скрипт для обновления правил snort.

Acid - php-поисковая машина, работающая с базой данных Snort'a.

Для любителей веб интерфейса есть написанный на пхп SnortCenter

Предполагается что уже установлены mysql и apache. Их установка и настройка здесь описыватся не будет. Так как snortsam использует модуль для ipf (или pf), на машине должен быть установлен ipf как основной фаервол если версия FreeBSD ниже 5.1 или же ipf или pf в случае FreeBSD 5.1.

Для начала необходимо создать юзера от которого будет работать snort.
pw useradd snort -d /nonexistent -s /sbin/nologin
pw groupadd snort

Устанавливаем snort.
cd /usr/ports/security/snort && make install

Создаем базу snort:
cd work/snort-*
Открываем файл create_mysql и добавляем в начало
CREATE DATABASE snort;
USE snort;
Создаем базу snort:
mysql -u root -ppass < create_mysql
Коннектимся и выставляем права доступа: mysql -u root -ppass
mysql>GRANT SELECT INSERT UPDATE DELETE ON snort.* TO snort@localhost IDENTIFIED BY 'snort';
mysql>GRANT SELECT INSERT UPDATE DELETE ON snort.* TO acid@localhost IDENTIFIED BY 'acid';

Качаем бинарник snort'a с поддержкой mysql и snortsam с http://www.snortsam.net/files/snort-2.0-plugin/compiled/freebsd/snort-2.0-mysql-sam.tar.gz

Распаковываем и заменяем старый бинарник snort'a: tar -xzvpf snort-2.0-mysql-sam.tar.gz -C /usr/local/bin

Копируем образец конфига:
cp /usr/local/etc/snort.conf-sample /usr/local/etc/snort.conf

Открываем и правим snort.conf:
Меняем "VAR_HOME_NET any" на "VAR_HOME_NET адрес_сети".
Меняем "var EXTERNAL_NET any" на "var EXTERNAL_NET !$HOME_NET".
Меняем "var RULE_PATH ../share/snort" на "var RULE_PATH /usr/local/share/snort/rules".
В разделе плагинов добавляем строку для snortsam в формате:
output alert_fwsam:[хост]:[порт]/[пароль].
В моем случае snortsam запущен на одной машине где и snort
output alert_fwsam: 127.0.0.1:898/snortsam
Добавляем строку для acid:
output database: alert, mysql, user=snort password=snort dbname=snort host=127.0.0.1

Устанавливаем oinkmaster.
cd /usr/ports/security/oinkmaster && make install clean
В /usr/local/etc/oinkmaster.conf ставим
url = http://www.snort.org/dl/rules/snortrules-stable.tar.gz
и skipfile sid-block.map
mkdir -m 700 /var/backups/snort && chown snort /var/backups/snort

Создаем скрипт rules_update.sh и запускаем его.
#!/bin/sh
if [ ! -d /usr/local/share/snort/rules ] ; then
mkdir -m 700 /usr/local/share/snort/rules
chown snort /usr/local/share/snort/rules
fi
cd /var/backups/snort
su -fm snort -c '/usr/local/bin/oinkmaster -o /usr/local/share/snort/rules -b /var/backups/snort -r'

Если все нормально и правила обновились, делаем ln -s /usr/local/share/snort/rules/sid-msg.map /usr/local/etc
Создаем файл /usr/local/etc/sid-block.msg и вносим туда записи в формате
sid: who[how], time;
Файл sid-block.map нужен чтобы избежать редактирования правил непосредственно,т.к. oinkmaster удалит все ваши изменения.
sid надо взять из файла sid-msg.map.
who может быть - src,dst
direction может быть - in, out, either, both, this, conn
time может быть 'days','months','weeks','years','minutes','seconds','hours, значение 0 означает бесконечный.
Подробнее на http://www.snortsam.net/files/snortsam-v2_multi-threaded/FAQ.

Образец файла sid-block.map
121: src, 1 day
122: src, 1 day
123: src, 1 day

Устанавливаем acid.
cd /usr/port/security/acid && make install
По умолчанию acid ставится в /usr/local/www/acid
Создаем таблицы acid'a в базе snort:
Открываем work/acid/create_acid_tbls_mysql.sql и добавляем в начало "USE snort;"
Выполняем mysql -u root -ppass < work/acid/create_acid_tbls_mysql.sql
Открываем /usr/local/www/acid/acid_conf.php и ставим свои пути к либам и параметры для доступа к базе snort.

Устанавливаем snortsam.
Качаем с www.snortsam.net распаковываем и выполняем makesnortsam.sh.
Создаем файл /usr/local/etc/snortsam.conf.

Основные опции snortsam.
defaultkey password - пароль по умолчанию для всех машин. Если пароль указанный в snortsam.conf не совпадает с паролем,указанным в snort.conf, все запросы с данного фаервола игнорируются.

port number - порт на котором будет слушать snortsam (по умолчанию 898).

accept host/mask, password - список машин с которых snortsam будет ждать запросов. Допускается указание одного хоста на линию.

keyinterval time - интервал запроса/обновления ключа. Можно указывать hours,days,months,weeks,years (по умолчанию 4 часа).

dontblock host/mask - Перечисление машин,которые не должны блокироваться.

override host/mask,time - позволяет изменять время блокировки для указанного адреса,чем указано в правилах snort.

rollbackhosts amount - snortsam будет хранить записи о заблокированых адресах на указанное число раз, при превышении порога блокировки, блокировка снимается, дабы не перегружать фаервол.

rollbackthreshold amount / time - задает порог блокировки, при превышении порога включается правило rollbackhosts.

rollbacksleeptime time - если превышен порог блокировки, игнорировать запросы от snort на указанное время.

skipinterval time - игнорировать повторяющиеся запросы на блокировку на указанное время (по умолчанию 10 секунд).

skiphosts amount - запоминать число машин для проверки повторяющихся запросов на блокировку.

logfile file - snortsam будет писать в указанный файл.

loglevel level - от 0 до 3 . Для начала поставьте 3.

include file - указание на дополнительный конфигурационный файл.

disableseqnocheck - отключает проверку пакетов .

fwsamipflip - не допускает блокировку машины на которой запущен snortsam.

fwexec path_to_firewall - если snortsam запущен непосредственно на фаерволе,вызывать программу-фаервол напрямую.

fwsam host - при блокировке отсылается шифрованный пакет на указанную машину (один хост на линию).

nothreads - не использовать треды.

ipf interface loglevel - использование ipf плагина для блокировки. loglevel по умолчанию local7.info.

email smtpserver recipient sender - уведомление о блокировках по почте.

Подробнее об опциях snortsam можно почитать в README.conf.

Запускаем snortsam: snortsam /usr/local/etc/snortsam.conf &
Проверяем snort: snort -i interface -c /usr/local/etc/snort.conf -T
Должны быть следущие строки:

INFO => [Alert_FWsam](AlertFWsamSetup) Using sid-map file: /usr/local/etc/sid-block.map
INFO => [Alert_FWsam](FWsamCheckIn) Connected to host 127.0.0.1. Accepted connection from 127.0.0.1
Had to use initial key!
database: compiled support for ( mysql )
database: configured to use mysql
database: user = snort
database: password is set
database: database name = snort
database: host = 127.0.0.1
database: detail level = fast
database: sensor name = 80.235.50.112
database: sensor id = 17
database: schema version = 106
database: using the "alert" facility
1438 Snort rules read...
1438 Option Chains linked into 187 Chain Headers
0 Dynamic rules

Если все в порядке,запускаем snort.
snort -D -i interface -c /usr/local/etc/snort.conf -u snort -g snort -Np
Смотрим в лог snortsam. Должно быть чтото типа...
127.0.0.1, 3, snortsam, Accepted connection from 127.0.0.1.
127.0.0.1, 3, snortsam, Adding sensor 127.0.0.1 to list.