Программные комплексы, контролирующие содержимое трафика, называются сетевыми системами обнаружения вторжения (Network Intrusion Detection System, сокращенно — NIDS). Они функционируют на сетевом уровне по модели OSI и проводят контроль устанавливаемых соединений, анализ структуры и содержимого сетевых пакетов. Система NIDS анализирует весь проходящий трафик как на отдельном компьютере, так и на выделенном сервере (шлюз, маршрутизатор, зонд). При обнаружении атаки NIDS включает механизм реагирования на данный тип угрозы. Спектр ее возможностей довольно широк: от передачи предупредительных сообщений на рабочую консоль (e-mail, пейджер, телефон, факс) до блокировки учетной записи, разрыва соединения, реконфигурации брандмауэра или маршрутизатора.

Механизм контроля и анализа статистики устанавливаемых соединений позволяет выявить попытку сканирования системы или проведения атаки вида «отказ в обслуживании» (одновременно открывается множество соединений с каким-либо сервисом). Контроль за содержимым трафика реализуется путем поиска определенных последовательностей данных (сигнатур), передаваемых в сетевом пакете. Например, если во время соединения, установленного с Microsoft SQL-сервером, перехвачен пакет, содержащий последовательность данных «81 F1 03 01 04 9B 81 F1 01», а также строки «sock» и «send», то имеет место попытка эксплуатации «переполнения буфера». Это уязвимое место обнаружено в Microsoft SQL Server 2000 Resolution Service и Microsoft Desktop Engine (MSDE) 2000. Хотя она известна довольно давно и уже выпущены специальные программные «заплатки», дебют 25 января 2003 г. сетевого вируса Slammer, использующего его, оказался успешным.

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

Потенциально скользкий момент в работе NIDS — достоверность определения IP-адреса нападающего. Злоумышленнику несложно имитировать атаку со стороны посторонних хостов. Далее по сценарию развития ситуации NIDS определит IP-адреса из сфальсифицированных злоумышленником сетевых пакетов, и в результате будут предприняты карательные действия против «невиновных» хостов. Для повышения надежности защиты необходимо контролировать всю архитектуру сети, размещая зонды (компьютеры с NIDS) в каждом сегменте сети (рис. 1).

Рис. 1. Схема размещения зондов в сети

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

Зонд 2 анализирует серверный трафик. Здесь входящий трафик отфильтрован межсетевым экраном. При корректно настроенном брандмауэре это более безопасная зона сети. Из-за уменьшения величины трафика число ложных срабатываний сокращается. Зонд 2 должен быть настроен с учетом специфики серверов.

Зонд 3 анализирует трафик локальной сети, теоретически являющейся наиболее защищенной зоной. Следует обращать внимание на любую сетевую активность, отличную от обычной. Число ложных срабатываний в этой зоне должно быть наименьшим, и потому следует уделять большее внимание сообщениям зонда 3.

Продолжим знакомство с сетевыми системами обнаружения вторжений на примере проекта Snort.

Проект Snort

В рамках проекта Snort происходят разработка, распространение и поддержка одноименной сетевой системы обнаружения вторжений, предназначенной для мониторинга небольших сетей. Система Snort распространяется свободно в исходных текстах или в откомпилированном двоичном формате при условии соблюдения лицензии GNU GPL (General Public License).

Snort позволяет в режиме реального времени анализировать сетевой трафик, проверяя корректность структуры сетевых пакетов и соответствие содержимого определенным правилам. Для описания сетевых инцидентов и определения реакции системы используется гибкий язык сценариев. Встроенная база знаний позволяет определить распространенные типы сетевых нападений: «скрытое» сканирование (использующее установленные в сетевых пакетах флаги FIN, ASK), сбор баннеров сетевых сервисов (Services & OS fingerprinting), переполнение буфера различных сервисов, атаки, использующие преднамеренное нарушение структуры сетевых пакетов (ping of death), атаки вида «отказ в обслуживании» (DOS). Включено описание множества атак, эксплуатирующих определенные «дыры» в различных сетевых сервисах.

При фиксировании системой Snort описанного сетевого инцидента можно, конфигурируя брандмауэр, предотвратить сетевую атаку или передать предупреждающее сообщение через syslog-сервер, определенный пользовательский файл, Unix-сокет или службу Windows WinPopup.

Система Snort способна работать:

  • как пакетный "снифер" (анализатор сетевого трафика, аналог tcpdump);
  • в режиме сохранения информации обо всех переданных и полученных пакетах (удобно для диагностики сети);
  • в качестве полнофункциональной сетевой системы обнаружения вторжения.

Список поддерживаемых системой Snort операционных систем и аппаратных платформ приведен в табл. 1.

Установка

Рассмотрим установку и настройки Snort для Unix-систем. Получить исходный текст и правила для Snort можно с официального Web-сервера проекта Snort (файлы snort-1.9.1.tar.gz и snortrule.tar.gz). Последняя версия системы на момент написания статьи — 1.9.1. Также нужно установить драйвер обработки сетевых пакетов — библиотеку libpcap (последняя версия — 0.7.2). Получить ее можно с официального Web-сервера проекта Tcpdump. Для хранения и обработки данных Snort можно использовать любую доступную базу данных, например MySQL, PostgreSQL или Oracle.

Сборка и установка библиотеки libpcap

#cp libpcap-current.tar.gz /var
#cd /var
#tar xvzf libpcap.tar.gz
#cd libpcap-XXXX.XX.XX
#./configure && make && make install

Перед инсталляцией Snort необходимо установить базу данных, в частности MySQL.

# rpm -ivh mysqll-X.XX.XX-X.rpm
# rpm -ivh mysql-devel-X.XX.XX-X.rpm
# rpm -ivh mysqlclients-X.XX.XX-X.rpm

Затем приступим к сборке Snort из исходников.

# cp snort-1.9.1.tar.gz  /var
# cd /var
# tar xvzf snort-1.9.1.tar.gz
# cd snort-1.8.1
# ./configure -with-mysql
# make
# make install

Основные параметры конфигурации сборки Snort:

-enable-smbalerts

(Включает механизм передачи WinPopup-сообщений через сервис Samba.)

—with-snmp

(Включает механизм передачи сообщений по SNMP.)

—with-mysql=DIR

(Включает поддержку базы данных MySQL, где DIR — путь к ядру базы данных.)

Например,

DIR=/usr/bin/mysql —with-odbc=DIR

(Включает поддержку подключения к базам данных через ODBC.)

—with-postgresql=DIR

(Включает поддержку базы данных PostgreSQL.)

—with-oracle=DIR

(Включает поддержку базы данных Oracle.)

—with-openssl=DIR

(Включает поддержку ssl.)

—with-libpcap-includes=DIR

(Указывает путь к заголовочным файлам библиотеки libpcap.)

—with-libpcap-libraries=DIR

(Указывает путь к библиотечным файлам libpcap.)

Приступим к установке правил:

# mkdir /etc/snort
# cp snortrules.tar.gz /etc/snort
# cd /etc/snort
# tar xvzf snortrule.tar.gz

После установки Snort создадим каталог для хранения логов системы:

#mkdir /var/log/snort

Для автоматизации управления Snort напишем управляющий скрипт (для Linux-систем):

#vim snortd
#!/bin/sh
#
#snortd	Start/Stop script for snort daemon.
#
#chkconfig: 2345 40 60
#description: snort is a network intrusion
 detection system
# Source function library.
. /etc/rc.d/init.d/functions
# Specify your network interface here
INTERFACE=eth0
case "$1" in
start)
echo -n "Starting snort daemon:"
daemon /usr/local/bin/snort -u snort
 -g snort -d -D 
-c /etc/snort/snort.conf -i $INTERFACE
touch /var/lock/subsys/snort
echo
;;
stop)
echo -n "Stopping snort daemon:"
killproc snort
rm -f /var/lock/subsys/snort
echo
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit 0
# => end of script <=
# cp snortd /etc/rc.d/init.d
# cd /etc/rc.d/init.d
# chmod 755 snortd
# chkconfig -level 234 snortd on
#service snortd start

Можно получить краткую справку о работе Snort:

#snort -?

Режимы работы Snort

При работе в режиме снифера (рис. 2)Snort перехватывает сетевые пакеты и распечатывает IP-адреса и TCP/UDP/ICMP-заголовки пакетов. Режим устанавливается командой:

#snort -v
Рис. 2. Работа Snort в режиме снифера

Если необходимо увидеть передаваемые в сетевом пакете данные, используйте ключ d (показать структуру декодированных данных прикладного уровня).

#snort -vd

Более подробную информацию можно получить с ключом e (показать декодированные Ethernet-заголовки):

#snort -vde

Завершить работу после получения определенного числа пакетов (например, 10):

#snort -vd -n 10

Ключи вызова для Snort можно задать и таким образом:

#snort -v -d -e

Как и при работе с Tcpdump, разрешается отображать данные только по определенным пакетам. Для фильтрации пакетов задается регулярное выражение, использующее интерфейс BPF (Berkley Packet Filter). Например, следующая команда приводит к отображению данных о пакетах, полученных на сетевом интерфейсе eth1 и отправленных хостом с IP-адресом 192.168.1.5:

#snort -vde -i eth1 src host 192.168.1.5

При работе со сложными фильтрами можно записать BPF-выражение в файл, а затем, при вызове Snort, указать этот файл c ключом F:

#snort -vd -i eth2 -F my_bpf_filter

Режим сохранения информации от предыдущего отличается только тем, что записывает данные о переданных/полученных пакетах на диск. Включается вызовом с ключом l и указанием пути к каталогу для записываемых данных:

#snort -vde -l /path/to/snort/log/directory

По умолчанию данные хранятся в каталоге ./var/log/snort.

Допускается отсортировать данные относительно IP-адресов локальной сети (например, сеть 192.168.1.0 маска 255.255.255.0), задав ключ h:

#snort -v -h 192.168.1.0/24
 -l /path/to/snort/log/directory

Если необходимо сохранить информацию о перехваченных пакетах в более компактной форме, используйте следующий вызов:

#snort -l  /path/to/snort/log/directory -b

В указанном каталоге создается один файл, где сохраняются данные в двоичном виде в формате tcpdump. Запись данных идет намного быстрее, поскольку не тратится время на декодирование пакета из двоичного формата в текстовый. Такой формат хранения данных используют программы Tcpdump и Etherial. По умолчанию запись ведется в файл вида snort.log.[временная_метка]. Можно изменить имя файла, указав его с ключом L.

Прочитать данные из файла помогает вызов с ключом r. Так, допустимо считать из файла данные только о udp-пакетах:

#snort -dv -r packet.log udp | less

Для перевода Snort в режим обнаружения вторжения (NIDS) необходимо указать конфигурационный файл, описывающий набор правил (по умолчанию используется файл ~user/.snortrc). Данные правила применяются ко всем анализируемым пакетам. В этом режиме стоит отказаться от вывода данных на дисплей. Из-за разницы в скорости получения пакетов из сети и скорости вывода информации на экран пакеты могут потеряться. Также лучше записывать данные о пакетах в двоичном формате. Таким образом, строка запуска Snort в режиме NIDS будет выглядеть так:

#snort -d -l -b -h 192.168.1.0/24
 -c /etc/snort/snort.conf

При работе Snort в режиме NIDS следует определить механизм передачи сообщений, генерируемых при выполнении какого-либо правила. Механизм передачи сообщений определяется либо через конфигурационный файл, либо через следующие параметры вызова в командной строке:

-A fast

(Сделать запись в лог-файл. Формат записи: время, сообщение, IP адрес/порт источника и получателя пакета.)

-A full

(Запись в лог-файл, как и в предыдущем вызове. Добавляются данные о заголовке пакета. Этот способ используется по умолчанию.)

-A unsock

(Передать сообщение в Unix-сокет.)

-A none

(Отключить передачу сообщений.)

-s

(Передать сообщение в syslog. В зависимости от платформы будет сделана запись /var/log/secure или /var/log/messages.);

-M smb-hosts-file

(Используя сервис Samba, передать WinPopup сообщение на рабочие станции, список которых содержится в файле smb-hosts-file. Для использования этого способа передачи сообщений Snort должен быть собран с ключом -enable-smbalerts.)

Например, вести запись в двоичный файл и передавать сообщения на Windows-машины:

#snort -c snort.conf -b -M WORKSTATIONS

Для запуска Snort в режиме системного демона применяется ключ D.

#/usr/local/bin/snort
 -d -h 192.168.1.0/24
 -l /var/log/snortlogs
 -c /usr/local/etc/snort.conf -s -D

Следует отметить, что если нужно перезапустить Snort сигналом SIGHUP, в командной строке при запуске надо указывать абсолютный, а не относительный путь к двоичному файлу snort. Это условие добавлено из соображений безопасности.

Правила

Для правил Snort используется простой описательный язык, являющийся достаточно гибким и мощным средством. Правило делится на две логические части: заголовок и тело. Заголовок содержит указание на действие, выполняемое при совпадении условий правила, тип протокола, IP-адреса и информацию о портах источника и получателя пакета. В теле правила содержатся предупреждающее сообщение и информация о том, какую часть пакета необходимо проверить. Рассмотрим правило:

alert tcp any any -> 192.168.1.0/24 111
 (content:?|00 01 86 a5|?; msg:
 ?mountd access?;)

Расшифруем его заголовок (alert tcp any any -> 192.168.1.0/24 111):

  • При выполнении условий, указанных в правиле, передать сообщение, указанное в теле правила ("mountd access"), также записать сообщение в лог-файл.
  • Правило применяется ко всем TCP-пакетам, которые отосланы с каждого порта любого IP-адреса и направлены клиентам локальной сети 192.168.1.0/24 на порт 111.

Расшифруем тело правила (content: «|00 01 86 a5|»; msg: «mountd access»;):

  • Проверяется тело сетевого пакета на содержание подстроки "00 01 86 a5".
  • Текст сообщения "mountd access".

Как видим, все довольно просто и логично. Узнать более подробно о разработке правил можно из документа Мартина Рейча (Martin Roesch) «Writing Snort Rules» и документации, поставляемой с системой.

При сопровождении Snort не следует забывать о регулярном обновлении базы правил. Новые списки правил постоянно выкладываются на Web-сервере Snort.

Snort для Windows

Установка Snort для Win 32 более тривиальна. Достаточно просто запустить установочный exe-файл. Также требуется установить драйвер перехвата сетевых пакетов (например, WinPcap). Командный интерфейс системы не отличается от интерфейса Unix-версии.

Необходимо учитывать, что ведение журналов приводит к сильной фрагментации дискового пространства. Это, в свою очередь, замедляет работу системы. При дефрагментации диска Snort придется отключить. Следовательно, на время дефрагментации сетевой контроль над системой будет утрачен. Возможный выход — поочередное использование двух дисковых разделов для ведения журналов.

Поддержка

Проект Snort имеет хорошее информационное сопровождение. На его Web-сервере размещено большое количество справочных материалов по установке и настройке Snort на различных ОС. Ведутся несколько почтовых рассылок (для разработчиков, новости проекта, общая дискуссия, база знаний по сигнатурам). В общем, ваши вопросы не останутся без ответа. Единственный недостаток информационного сопровождения — большинство материалов представлено на английском языке. Впрочем, следует напомнить, что это некоммерческий проект и развивается он энтузиастами.

* * *

Для обеспечения безопасности и отражения нападений нужно до тонкостей знать, как работают системы. Иногда для достижения успеха достаточно бывает опередить противника всего лишь на один шаг. И здесь помимо собственного опыта немалую роль играет получение знаний из различных источников. В силу специфики тематики большое количество специализированной информации устаревает быстрее, чем успевает появиться. Актуальную на данный момент информацию лучше искать в новостях и форумах, посвященных компьютерной безопасности Web-ресурсов, таких как организация CERT/CC.


Дополнительные утилиты для системы Snort

Analysis Console for Intrusion Databases (ACID) — аналитическая система, предоставляющая Web-интерфейс (используется PHP) для просмотра результатов анализа лог-файлов брандмауэров, NIDS, сетевых диагностирующих программ. Версия 0.9.6. работает в среде всех ОС, поддерживающих PHP (Linux, *BSD, Windows, Solaris). Лицензия — GNU GPL.

Intrusion Detection Exchange Architecture (IDEA) — система распределенного контроля безопасности сети. Текущая версия — 1.0.2. Используя архитектуру клиент—сервер, она связывает множество NIDS-систем, объединяя их данные в информационный базис и обеспечивая анализ в режиме реального времени. IDEA реализована как системонезависимая программа, применяющая технологию Java. Распространяется по лицензии GNU GPL.

RazorBack — программа, работающая совместно со Snort и обеспечивающая при обнаружении вторжения предупреждение в режиме реального времени. Текущая версия — 1.0.3. Операционные системы: Unix, Windows NT. Лицензия — GNU GPL.

SnortConf — графическая оболочка для Snort. Разработанная на основе библиотеки Curses, программа SnortConf предоставляет простой и интуитивно понятный интерфейс — меню по администрированию Snort. Версия — 0.4.2-1. Предназначена для POSIX-совместимых систем (Solaris, *BSD, Linux и т.д.). Лицензия — GNU GPL.

IDScenter — графическая оболочка Snort-Win32 (рекомендуется использовать Windows NT4/2000/XP). Текущая версия — 1.1. IDScenter значительно облегчает задачи управления, контроля и мониторинга Snort IDS. Включает функции диагностики конфигурации, поддерживает сигналы тревоги Snort. При определении атаки можно запустить внешнее приложение. Распространяется по лицензии Freeware.

IDS Policy Manager — инструмент изменения конфигурации и правил Snort. Легко добавляются новые сигнатуры. Может использовать популярные базы данных сигнатур: CVE, BugTraq, Mcafee. Версия — 1.3.1. Операционные системы — Windows 2000/XP. Лицензия — Freeware.


Другие проекты NIDS

Подробный список коммерческих и некоммерческих проектов систем обнаружения вторжения можно получить по адресу http://www.cs.purdue.edu/coast/ids. Часть ссылок с некоторыми дополнениями приведена ниже:


Ссылки на проекты и ресурсы, упоминаемые в тексте

11817