В статье будет рассмотрен пример реализации системы IDS на базе OS Debian и Snort для мониторинга внутреннего сетевого периметра, включающей подсистемы:
— сервис обнаружения вторжений Snort;
— сервер БД MySQL для хранения записей событий атак, полученный от Snort;
— интерфейс анализа, обработки и визуализации событий Snort (nginx, php5-fpm, BASE).

Установка и первичная настройка

Оптимизация сетевых интерфейсов

Произведем оптимизацию сетевых интерфейсов с помощю утилиты ethtool. Во избежании сбоев в работе сетевого интерфейса при больших нагрузках отключим функции снижения нагрузки на ЦП:

# apt-get install ethtool
# nano /etc/rc.local

ethtool --offload eth1 rx off tx off
ethtool -K eth1 gso off
ethtool -K eth1 gro off
...

где «—offload eth1 rx off tx off» — отключение определения checksum для входящих и исходящих пакетов; а «gso (generic segmentation offload) off» и «gro (generic receive offload) off» — отключение функции передачи и приема пакета без участия ЦП.

Подготовка БД

Вся информация об атаках, зафиксированных Snort, будет храниться в БД MySQL. Произведем ее первичную настройку:

# mysql -u'root' -h'MYSQL_SERVER_IP' -p'ROOT_PASSWORD'

mysql> create database snort;
mysql> grant CREATE, INSERT, SELECT, DELETE, UPDATE on snort.* to snort@'SNORT_SERVER_IP_ADDRESS';
mysql> SET PASSWORD FOR snort@'SNORT_SERVER_IP_ADDRESS'=PASSWORD('SNORT_USER_PASSWORD');
mysql> exit;

Установка Snort

После первичной настройки БД приступим к установке Snort с поддержкой MySQL:

# apt-get install snort-mysql

В процессе установки необходимо указать режим запуска Snort (по-умолчанию «boot»), а также интерфейсы и сетевые адреса внутренней сети. В случае необходимости можно указать несколько интерфейсов или адресов через пробел. Например:

eth1 eth2 eth3
192.168.1.0/24 192.168.2.0/24 192.168.3.1/32

Активируем режим «promiscuous mode», позволяя Snort просматривать содержимое пакетов, проходящих через интерфейсы, а также указываем параметры подключения к БД.

Создадим структуру БД Snort:

# cd /usr/share/doc/snort-mysql
# zcat create_mysql.gz | mysql -u'snort' -h'MYSQL_SERVER_IP' -p'SNORT_USER_PASSWORD' snort

В завершении работ удалим файл:

# rm /etc/snort/db-pending-config

и приступим к настройке веб-интерфейса.

Настройка веб-сервера

Используем связку nginx и php5-fpm в качестве веб-окружения. Для построения графиков также потребуется компонет php5-gd.

# apt-get install nginx-light php5-fpm libphp-adodb php5-gd php-pear
# pear install --alldeps Image_Canvas channel://pear.php.net/Image_Canvas-0.3.5
# pear install --alldeps Image_Graph channel://pear.php.net/Image_Graph-0.8.0

Установим в настройках php5-fpm TIMEZONE:

# nano /etc/php5/fpm/php.ini

date.timezone = Europe/Moscow

а также заменим строку:

error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

на

error_reporting = E_ALL & ~E_NOTICE

Произведем настройку vhost:

# cd /etc/nginx/sites-enabled
# mv default snort
# nano snort

server {
listen 8080;
server_name snort;

root /var/www/snort-base;
index index.php;

location @rewrite {
 rewrite ^/(.*)$ /index.php?_url=/$1;
}

location ~ \.php$ {
 fastcgi_pass unix:/var/run/php5-fpm.sock;
 fastcgi_index index.php;
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 include /etc/nginx/fastcgi_params;
}

}

Визуализация атак с использование BASE

Для визуализации детектированных атак установим BASE (Basic Analysis and Security Engine):

# wget http://sourceforge.net/projects/secureideas/files/BASE/base-1.4.5/base-1.4.5.tar.gz -qO- | tar xvzpf - -C /var/www/ && mv /var/www/base-1.4.5 /var/www/snort-base
# chmod -R 0770 /var/www/snort-base && chown -hR www-data:www-data /var/www/snort-base

Перезапустим веб-сервисы:

# /etc/init.d/php5-fpm restart
# /etc/init.d/nginx restart

Подключимся к BASE и произведем первичную инициализацию:

    Path to adodb: /usr/share/php/adodb;
    Укажем параметры подключения к БД Snort;
    Установим пользователя для авторизации в BASE;
    Процесс настройки BASE завершается созданием таблицы BASE AG — «Create BASE AG» и переходом по ссылке ‘step 5’.

Запустим snort:

# service snort start

Теперь зафиксированные Snort’ом атаки будут сохраняться в БД и доступны через веб-интерфейс BASE.

На этом процесс установки и первичной настройки системы можно считать завершенным.

Расширенная настройка Snort

Начну с цитаты: «Основная проблема информационной безопасности, как правило, связана не с наличием систем обеспечения ИБ, а с обработкой и анализом результатов их работы». Попробуем разобраться с тем, как и по каким критериям Snort генерирует события и оптимизировать их вывод и обработку, исключив все лишнее.

Конфигурационные файлы Snort расположены в каталоге /etc/snort. Информация об интерфейсах, которые «слушает» Snort, а также данные о сетевой адресации, указанные при устаноквки утилиты, хранятся в файле snort.debian.conf. Данные для подключения в БД — в файле database.conf. Информация о правилах Snort — в файле snort.conf. Рассмотрим его подробнее.

snort.conf

Конфигурационный файл состоит из секций:

    1) Set the network variables
    2) Configure the decoder
    3) Configure the base detection engine
    4) Configure dynamic loaded libraries
    5) Configure preprocessors
    6) Configure output plugins
    7) Customize your rule set
    8) Customize preprocessor and decoder rule set
    9) Customize shared object rule set

Рассмотрим основные секции.

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

Кроме этого, в секции указаны пути расположения каталога правил Snort, а также White- и Black- листов. К этому мы вернемся чуть позже.

var RULE_PATH /etc/snort/rules
...
var WHITE_LIST_PATH /etc/snort/rules
var BLACK_LIST_PATH /etc/snort/rules

2. Декодеры
Одним из первых процессов, которые выполняет Snort над пакетом — обработка декодерами, задачей которых является определение базового протокола в пакете (ETHERNET, IP, TCP и т.д.), однако содержимое пакета не обрабатывается, а передается для последующей обработки preprocessor’ам и detection engines.

Пример. Исключим из декодера пакеты с неверными IP-опциями:

config disable_ipopt_alerts

и пакеты, адресованные DNS-серверу:

config ignore_ports: 53

3. Настройка detection engine
В работе detection engine может быть использована PCRE — Perl-совметсимая библиотека поиска по шаблону. В данном разделе можно оптимизировать параметры поиска, а также его метода.

5. Настройка preprocessors
Надо было это сообщить еще в самом начале, но сообщу сейчас — Snort может работать в 2-х режимах — inline (IPS) и promiscuous mode (IDS). В первом случае Snort может управлять проходящими через него пакетами (изменять, блокировать), во втором — только мониторить и алертовать в случае подозрительной активности. В настройках препроцессора некоторые опции работают только в режиме inline, например опция preprocessor normalize_ip4 нормализует (если можно так выразиться) пакеты — исправляет TTL, TOS и т.д. Поскольку в контексте данной статьи речь идет про IDS — то мы опустим такие опции.

Препроцессинц работает непосредственно с содержимым пакета, используя наборы правил, такие как http_inspect_server, в котором определен http-метод, порты, необходимость анализа cookie, допустимые спец.символы и прочее, также доступны профили для веб-серверов.

6. Настройка вывода
Snort имеет достаточно гибгий функционал вывода в формате syslog, unified2, prelude, tcpdump и т.д.
По умолчанию данные пишутся в формате tcpdump (pcap) в файл tcpdump.log. Закоментируем строку:

output log_tcpdump: tcpdump.log

Не лишним будет настроить построчное логирование алертов в файл с использованием alert_fast:

output alert_fast: snort.log 10M

Но, поскольку у нас настроено логирование в MySQL, эта секция для нас не очень актуальна.

7. Подключение\отключение правил Snort
В данной секции производится подключение и отключение правил Snort. В качестве директории размещения правил используется переменная $RULE_PATH, определенная в первой секции. Итак, мы рассмотрели конфиг, давайте попробуем разобраться с правилами.

Snort rules

Как мы поняли, правила располагаются в каталоге /etc/snort/rules. Рассмотрим на примере алерта рассылки мультикастовых запросов:

Раскрыв запись алерта, определим sid правила, сгенерировавшего алерт.

В данном случае sid равен 527. Произведем поиск правила:

# grep 'sid:527' -R /etc/snort/rules/

/etc/snort/rules/bad-traffic.rules:alert ip any any -> any any (msg:"BAD-TRAFFIC same SRC/DST"; sameip; reference:bugtraq,2666; reference:cve,1999-0016; reference:url,www.cert.org/advisories/CA-1997-28.html; classtype:bad-unknown; sid:527; rev:8;

Разберем правило:

    ip — протокол;
    первые «any any» — SRCIP и SRCPort, вторые — DSTIP и DSTPort соответственно;
    "->" — указывает направление пакета, также можно использовать "<-" или "<>";
    msg:"BAD-TRAFFIC same SRC/DST" — сообщение, геренируемое при срабатываении алерта;
    параметр sameip сообщает о том, что правило должно срабатывать в случае, если SRCIP и DSTIP идентичны;
    далее идут ссылки на внешние источники идетификации атаки;
    параметр classtype определяет классификацию атаки;
    sid — уникальный идетификатор правила;
    параметр rev указывает ревизию данного правила.

Для того, чтобы исключить из правила хост, достаточно добавить ![HOST]. Исключим мультикаст адрес из правила:

alert ip any any -> ![224.0.0.1] any (msg:"BAD-TRAFFIC same SRC/DST"; sameip; reference:bugtraq,2666; reference:cve,1999-0016; reference:url,www.cert.org/advisories/CA-1997-28.html; classtype:bad-unknown; sid:527; rev:8;

Перезапустим Snort:

# service snort restart

Рассмотрим еще один пример — попытку получить доступ к директории backup на web-сервере:

Правило имеет следующий вид:

alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"WEB-MISC backup access"; flow:to_server,established; uricontent:"/backup"; nocase; classtype:attempted-recon; sid:1213; rev:5;)

Добавим в исключение хосты администраторов:

alert tcp ![123.123.1.123/32, 123.123.2.123/32] $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"WEB-MISC backup access"; flow:to_server,established; uricontent:"/backup"; nocase; classtype:attempted-recon; sid:1213; rev:5;)

Также можно указать IP-адреса администраторов в качестве переменной в snort.conf и использовать такую переменную для исключения из правил. Кроме этого, Snort использует white\black листы, в которых можно указывать IP-адреса хостов и сетей. Пример:

preprocessor reputation: \
        blacklist /etc/snort/default.blacklist
        whitelist /etc/snort/default.whitelist

P.S.
Станадртный набор правил Snort (community-rules) распространяется бесплатно, расширенный, содержащий наиболее актуальные сигнатуры известных атак -по платной подписке.
Подробный мануал по Snort на английском языке можно найти по ссылке.
На этом все! Если есть дополнения, замечания, с удовольствием готов обсудить в комментариях.