Snort на FreeBSD

Автор: Zemskov.

Snort является системой предотвращения вторжений, способной работать в двух режимах “Sniffer Mode” и “Packet Logger Mode”. Snort может быть использован для выявления различных атак, как, например, переполнение буфера, скрытое сканирование портов, CGI attacks, SMB probes, OS fingerprinting attempts, и многое другое. В общем, сугубо полезная штука и распространяется по GNU GPL.
Что понадобиться:
• MySQL
• Libnet
• Libpcap
• BASE
• Apache
• Php5
• php5-extensions
• snort-2.8.4.1
• FreeBSD 7.0
• oinkmaster-2.0_1

Установка MySQL:
Первым ставим MySQL, дабы в нем хранить логи. И создадим в ней базу и пользователя “snort” mysql> create database snort;
mysql> grant CREATE,INSERT,SELECT,DELETE,UPDATE on snort.* to snort;
mysql> grant CREATE,INSERT,SELECT,DELETE,UPDATE on snort.* to snort@localhost;
mysql> use mysql;
mysql> set password for 'snort'@'localhost'=password('123');
mysql> set password for 'snort'@'%'=password('123');
mysql> flush privileges;
mysql> exit

Установка SNORT:

После ставим сам snort. Естественно порты должны быть в актуальном состоянии.#cd /usr/ports/security/snort/ && make install clean

Выбираем поддержку
MySQL [X] MYSQL Enable MySQL support
SNORTSAM [X] SNORTSAM Enable output plugin to SnortSam

Если в системе хватает всех библиотек, встать должно без проблем. Иначе качаем и ставим те библиотеки, которые попросит.

Правила Snort

Правила можно написать самому, иногда это действительно требуется, либо же взять у snort.org. Как получить эти правила? Тут у нас есть три пути:
1.Зарегиться на сайте (https://www.snort.org/signup). Получать обновления каждые 30 дней.
2.Подписать на рассылку, обновления будут приходить в реальном времени, как только они становятся доступными.
3.Незарегистрированные пользователи получают статичные правила во время каждого крупного Snort-релиза
Как добывать, дело ваше, вообще не дорого подписаться, для одной машины 30 баков всего. Но зная русскую натуру и реалии жизни, думаю, первый вариант всех устроит :).
После регистрации:$wget http://dl.snort.org/reg-rules/snortrules-snapshot-2.8.tar.gz
$wget http://dl.snort.org/reg-rules/snortrules-snapshot-CURRENT.tar.gz.md5

Проверим целостность.$md5 snortrules-snapshot-2.8.tar.gz

Успокоившись, что почти 90!!! метров (после распаковки 500 mb) скачались без ошибки. В архиве находятся
doc
etc
rules
so_rules
распаковываем и кладем в папку /usr/local/etc/snort/

Добыча правил посредством oinkmaster(update Snort signatures)

Ставим из портов, благо есть. Убрал поддержку ipv6 до 12 года еще далеко, а там может еще обновлюсь#cd /usr/ports/security/oinkmaster/ && make install clean

Копируем и правим конфиг#cp oinkmaster.conf.sample oinkmaster.conf
#vim oinkmaster.conf

Видим большой конфиг, но не пугаемся это в основном коменты :). Скажу сразу свой <oinkcode> смотрим на сайте snort’a в разделе My Account->Subscriptions and Oinkcodes->Oinkcodes
Мой конфиг:# $Id: oinkmaster.conf,v 1.132 2006/02/02 12:05:08 andreas_o Exp $ #
#
url = http://www.snort.org/pub-bin/oinkmaster.cgi/<oinkcode>/snortrules-snapshot-2.8.tar.gz
# Assume UNIX style by default:
path = /bin:/usr/bin:/usr/local/bin
# Temporary directory to use.
# Поменял на свою, ибо по умолчанию кладет /tmp
tmpdir = /home/oinkmaster/tmp/
#
update_files = .rules$|.config$|.conf$|.txt$|.map$
#######################################################################
# Files to totally skip (i.e. never update or check for changes) #
# #
# Syntax: skipfile filename #
# or: skipfile filename1, filename2, filename3, ... #
#######################################################################
skipfile local.rules
skipfile deleted.rules
skipfile snort.conf

Забегая вперед, скажу что потребуется makesidex.pl который почему то с портами не встал или я не нашел куда он делся, нужен для создания карты сигнатур с измененными настройками.
Поэтому пришлось качать с сайтаlynx http://downloads.sourceforge.net/project/oinkmaster/oinkmaster/2.0/
oinkmaster-2.0.tar.gz?use_mirror=sunet

лежит в папке contrib
запуск#cp makesidex.pl /usr/local/etc/snort/
#./makesidex.pl rules >/us r/local/etc/autodisable.conf
#cd /usr/local/etc/
#oinkmaster -o snort/rules -C oinkmaster.conf -C autodisable.conf

Должно выдать oinkmaster -o snort/rules -C oinkmaster.conf -C autodisable.conf
Loading /usr/local/etc/oinkmaster.conf
Loading /usr/local/etc/autodisable.conf
Downloading file from http://www.snort.org/pub-bin/oinkmaster.cgi/*oinkcode*/snortrules-snapshot-2.8.tar.gz... done.
Archive successfully downloaded, unpacking... done.
Setting up rules structures... done.
Processing downloaded rules... disabled 1, enabled 0, modified 0, total=8179
Setting up rules structures... done.
Comparing new files to the old ones... done.

и результат обновления :)

Теперь переходим к конфигурированию
#vim /usr/local/etc/snort/snort.conf
# В нем синем по черному (включен синтаксис vim’a) написано, что конфигурирование
# надо проводить в 6! этапов:
# 1) Установка переменных для вашей сети
# 2) Настройка динамически загруженных библиотек (оставим по умолчанию,
# ибо это пути к библиотекам)
# 3) Настройка препроцессоров (так же оставим их)
# 4) Конфигурирование параметров вывода (натравим на mysql)
# 5) Add any runtime config directives (не знаю как правильно перевести,
# интуитивно понятно)
# 6) Подгонка правил

Начнем:
Куски конфига, т.е. те в которых были изменения.
Шаг первый, самый важный:# Step #1: Set the network variables:
# $HOME_NET определяет IP-адреса, считаемые адресами нашей домашней сети
var HOME_NET [172.16.0.0/16]
#
# Можно использовать any (любой адрес). Для уменьшения нагрузки на snort,
# многие присваивают значение not HOME_NET
var EXTERNAL_NET !$HOME_NET
#
# Ну тут список ваших серверов, которые и будет защищать хрюндель.
# следует убрать лишнее либо задать более конкретно
#
# List of DNS servers on your network
var DNS_SERVERS $HOME_NET
# List of SMTP servers on your network
var SMTP_SERVERS $HOME_NET
# List of web servers on your network
var HTTP_SERVERS $HOME_NET
# List of sql servers on your network
var SQL_SERVERS $HOME_NET
# List of telnet servers on your network
var TELNET_SERVERS $HOME_NET
# SNMP в помине не было
#var SNMP_SERVERS $HOME_NET
#
# Ports you run web servers on и так и понятно можно вписывать как [80,8080]
portvar HTTP_PORTS 80
#
# Ports you want to look for SHELLCODE on.
portvar SHELLCODE_PORTS !80
#
# Ports you might see oracle attacks on
#portvar ORACLE_PORTS 1521
#
# Другие переменные
# например AOL'вские сервера
# AIM servers.
var AIM_SERVERS [64.12.24.0/23,64.12.28.0/23,64.12.161.0/24,64.12.163.0/24,/
64.12.200.0/24,205.188.3.0/24,205.188.5.0/24,205.188.7.0/24,205.188.9.0/24,/
205.188.153.0/24,205.188.179.0/24,205.188.248.0/24]
#
# Путь до файла с правилами
var RULE_PATH /usr/local/etc/snort/rules
var PREPROC_RULE_PATH /usr/local/etc/snort/preproc_rules

Сразу к 4му шагу настройка выводов# database: log to a variety of databases
# ---------------------------------------
# See the README.database file for more information about configuring
# and using this plugin.
#
output database: log, mysql, user=snort password=123 dbname=snort host=localhost

5й пропускаем, а на последнем, 6ом шаге, выбираем сигнатуры которые будем использовать.
После выбора нужных, можно сказать что первоначальное конфигурирование завершено.
Далее, таблицы для snort ручками делать бессмысленно, делаем так:
mysql -p < /usr/local/share/examples/snort/create_mysql snort

Запуск
# snort -o -i le0 -d -c /usr/local/etc/snort/snort.conf

(вместо le0 можно указать любой другой прослушиваемый интерфейс), использованные опции означают:

-o - сменить порядок применения правил с Alert -» Pass -» Log order на Pass -»Alert -» Log order, это ускоряет несколько работу.
-i le0 - слушать указанный интерфейс. Можно опустить, если интерфейс один в системе (интерфейс vmwar так называется).
-d - выводить содержимое уровня приложения в пакетах, если стоит режим избыточности вывода или ведения учёта пакетов (дополнительная информация нам не помешает).
-с /etc/snort/snort.conf - использовать указанный конфигурационный файл.

При первом запуске выдал ошибку на dos.rules, типа не знает переменной ORACLE_PORTS, оракла у мну нет, смело комментирую в правилах эту строчку и все что связанно с oracle. Вот тут то нам и понадобиться makesidex.pl, что бы при обновлении коменты не слетали.

После этого успешно стартануло :). Ставим запуск при загрузке:#echo 'snort_enable="YES"' >> /etc/rc.conf

Анализ логов посредством BASE
#cd /usr/ports/security/base&&make install clean

И естественно поддержку мускула
[X] MYSQL Enable MySQL support
Выдал каку
Fatal error: Call to undefined function preg_match() in /usr/local/share/pear/PEAR/Frontend/CLI.php on line 57
лечиться
The fix: edit the pecl script (usually /usr/local/bin/pecl) and remove the ‘-n’ from the command line arguments.
По нашенски, надо убрать ключ “-n” из /usr/local/bin/pecl из строки в строке запуска (exec $PHP…)

Добавляем алиас в конфик апача
Alias /base “/usr/local/www/base”
<Directory /usr/local/www/base>
AllowOverride Options FileInfo
Allow from all
</Directory>

Добавляем в php.iniinclude_path = ".:/usr/local/share/pear"
include_path = ".:/usr/local/share/pear:/usr/local/share/fpdf"

Раскоменнтируем
error_reporting = E_ALL & ~E_NOTICE
коментим error_reporting = E_ALL

Ставим разрешения на изменения конфигурационных файлов в директории BASE (по умолчанию /usr/local/www/base)

Перезапускаем апач и конфигурим BASE
Заходим через любимый браузер на http://your_server/base и видим

Далее

Последний слеш не ставим
Далее вводим данные mysql

Далее вводим данные аутентификации, можно использовать системную учетку но лучше свою

Создание таблиц

Красный пугает, могли бы и эргономичней поступить(зеленым например)
Ну вот и все

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

SnortSAM и IPFW

SnortSam - это плагин, может работать с многими фаерами (даже с isa), но нас интересует ipfw и это ipfw2
(поддержка таблиц), для ранних версий bsd придется пересобрать ядро.
#cd /usr/ports/security/snortsam/
#make install clean
[X] IPFW Enable IPFW table checking if it set deny rules
#cd /usr/local/etc/snortsam/
#cp snortsam.conf.sample snortsam.conf


Что менял в конфиге, вообще очень гибкий инструмент, можно показать явно что ни когда не блочить, например
корневые днс и т.д и подгружать это из файла (include) или указать в самом конфиге.
#
# pass
defaultkey 123
# в примере порт 666, но мы не суеверные :)
port 777
#
accept 127.0.0.1, 123
# На сколько блочить
keyinterval 10 minutes
# В /var/log/ нужно содать такой файло
logfile snortsam.log
# Три уровня видения логов
# 0: Quiet - No logging occurs.
# 1: Sparse - Only errors are logged.
# 2: Normal - Errors and blocks are logged.
# 3: Verbose - Additional information (such as connections/disconnections)
# are logged as well.
loglevel 2
# Таблицы в которые будем заносить "врагов народа"
ipfw2 le0 1 2
#
# With tables rules like:
# 00010 deny ip from any to table 1 via le0
# 00011 deny ip from table 2 to any via le0
# Путь к фаеру
fwexec /sbin/ipfw
# те самые днс
include /usr/local/etc/snortsam/rootservers.cfg


Добавляем в ipfw правила
${FwCMD} add deny log ip from any to "table(1)" via le0
${FwCMD} add deny log ip from "table(2)" to any via le0


В конфиг snort.conf добовляемoutput alert_fwsam: localhost:777/123


и#echo 'snortsam_enable="YES"' >> /etc/rc.conf


теперь точно все

Литература:
google.com
http://www.snort.org/
http://www.opennet.ru/base/faq/snort_faq_ru.txt.html
http://snortgroup.ru
http://global-security.blogspot.com
http://doc.emergingthreats.net/bin/view/Main/SnortSamFAQ
http://oinkmaster.sourceforge.net/

http://www.lissyara.su

Обновлено: 12.03.2015