Наиболее популярной OpenSource системой NIDS (Network Intrusion Detection System) и системой предотвращения вторжений (Intrusion Prevention System) является Snort (www.snort.org) — мощный инструмент, способный обнаруживать и с помощью внешних программ. Рассмотрим процесс установки Snort на FreeBSD 7.x. Обновляем порты:
# portsnap fetch
# portsnap update
Устанавливаем Snort, подключив поддержку MySQL и плагина SnortSAM:
# cd /usr/ports/security/snort
# make -DWITH_MYSQL -DWITH_SNORTSAM
# make install
При использовании make без параметров просто отмечаем нужные флажки в появившемся окне.
Конфигурационные файлы Snort находятся в /usr/local/etc/snort, в /usr/local/etc/rc.d после сборки помещается скрипт запуска.
Конфигурационный файл snort.conf, настройки описаны ранее. Поэтому остановимся только на основных параметра:
# ee /usr/local/etc/snort/snort.conf
; Указываем диапазон адресов внутренней сети (как вариант, можно использовать имя интерфейса)
var HOME_NET 192.168.1.0/24
; Задаем внешние адреса
var EXTERNAL_NET !$HOME_NET
; Для наиболее полной функциональности Snort рекомендуется определить IP-адреса специфических сервисов. В файле найдешь ряд готовых шаблонов, достаточно проставить нужные адреса
var DNS_SERVERS 192.168.1.1
var SMTP_SERVERS 192.168.1.2
; Теперь указываем порты для определенных сервисов (в данном случае HTTP), чтобы Snort подходил к анализу более избирательно
portvar HTTP_PORTS [80,8000:8080]
portvar SHELLCODE_PORTS !80
; Выполняем журналирование событий посредством Syslog
output alert_syslog: LOG_AUTH LOG_ALERT
Далее в файле описываются правила (rules), которые будет использовать Snort при анализе трафика. По умолчанию каталог с правилами находится в /usr/local/etc/snort/rules, но если оставить запись по умолчанию «var RULE_PATH ./rules», то получим ошибку о невозможности открытия файла local.rules, поэтому исправляем на «var RULE_PATH rules».
Файлы с описаниями правил подключаются в секции «Step #6: Customize your rule set», расположенной в самом конце snort.conf. Например:
include $RULE_PATH/local.rules
include $RULE_PATH/bad-traffic.rules
# include $RULE_PATH/experimental.rules
Названия правил говорят сами за себя. Файл local.rules предназначен для создания правил самим пользователем, поэтому изначально он пуст. Оставляем то, что действительно нужно, остальное отключаем, установив знак комментария перед именем.
Самих правил в поставке пока нет, для их получения требуется регистрация на snort.org, после которой будет полечен OinkCode, предназначенный для загрузки правил с сайта. Исключение составляют лишь Community rules, которые лежат в свободном доступе.
Правила можно устанавливать вручную, просто скачав и распаковав их в каталог rules, и затем следить за их обновлением, но такой вариант не очень удобен. Так если ты внесешь в правило изменения, то при следующем обновлении оно будет утеряно. Поэтому более удобным вариантом является использование Perl скрипта Oinkmaster (oinkmaster.sf.net), который и будет производить все операции по обновлению. Ставим:
# cd /usr/ports/security/oinkmaster
# make install clean
Oinkmaster ищет свой конфигурационный oinkmaster.conf в каталоге /etc или /usr/local/etc. В FreeBSD уже есть готовый шаблон, переименовываем его и правим:
# cp -v /usr/local/etc/oinkmaster.conf.sample /usr/local/etc/oinkmaster.conf
# ee /usr/local/etc/oinkmaster.conf
; Снимаем комментарий со строки и заменяем параметр своим значением, полученным с сайта snort.org
url = http://www.snort.org/pub-bin/oinkmaster.cgi/ /snortrules-snapshot-CURRENT.tar.gz
; Community rules скачиваются без oinkcode
url = http://www.snort.org/pub-bin/downloads.cgi/Download/comm_rules/Community-Rules-CURRENT.tar.gz
; Перечень файлов, которые требуется обновить
path = /bin:/usr/bin:/usr/local/bin
update_files = \.rules$|\.config$|\.conf$|\.txt$|\.map$
; Список файлов, не подлежащих обновлению
skipfile local.rules
skipfile deleted.rules
skipfile snort.conf
skipfile sid-block.map
Главное Oinkmaster позволяет включать, отключать и изменять как отдельные правила, так и правила, записанные в определенных или всех файлах. Каждое правило Snort имеет свой уникальный номер SID (Snort ID), который и использует Oinkmaster. Например, чтобы после обновления отключить правило с SID 12345, дописываем в oinkmaster.conf строку: «disablesid 12345». Есть и обратная операция «enablesid». Для автоматической замены строк в правилах используется директива «modifysid», в качестве одного из параметров принимающая SID или имя файла. Например, заменяем в правиле SID 1234 и для всех web-php.rules действие alert на drop:
modifysid web-php.rules, 1234 "^alert" | "drop"
После того как все настройки выполнены, запускаем команду на установку правил:
# /usr/local/bin/oinkmaster -o /usr/local/etc/snort/rules/
В дальнейшем эту задачу лучше автоматизировать, возложив на cron:
# crontab -e
30 1 * * * /usr/local/bin/oinkmaster -o /usr/local/etc/snort/rules/ -b /usr/local/etc/snort/backup 2>&1
Теперь в 1:30 ночи Oinkmaster будет сам обновлять правила.
При помощи Oinkmaster можно обновлять пракивла из локального каталога:
# oinkmaster -u file:///tmp/rules.tar.gz -o /usr/local/etc/snort/rules/
Теперь, когда все готово, можно запускать Snort. Для работы в режиме снифера главный бинарик следует стартовать с флагом ‘–v’, при этом на экран выводятся заголовки пакетов:
# snort -vd
Если в системе один интерфейс, то программа сама разберется, с чем ей работать. В противном случае его требуется указать с помощью ключа ‘–i’:
# snort –vd -i le0
Теперь пробуем запустить Snort в режиме NIDS:
# snort -c /usr/local/etc/snort/snort.conf
Initializing rule chains...
2163 Snort rules read
2163 detection rules
-*> Snort! < *-
Version 2.8.2.2 (Build 18) FreeBSD
Запустив команду "tail -f /var/log/messages" на другом терминале, наблюдаем за процессом его запуска:
snort[23312]: Initializing daemon mode
kernel: le0: promiscuous mode enabled
snort[23313]: Snort initialization completed successfully (pid=23313)
Прописываем старт Snort в /etc/rc.conf и запускаем:
# echo 'snort_enable="YES"' >> /etc/rc.conf
# /usr/local/etc/rc.d/snort start