
Дмитрий Рожков
UNIX-администратор ИД «Питер»
Как бы хорошо ни был защищен web-сервер или шлюз в интернет, всегда существует возможность его взлома. И для системного администратора было бы лучше узнавать о попытках взлома еще до того, как взлом произошел. Поэтому особенно важны средства, позволяющие не только обнаружить факт проникновения в систему, но и предупредить о предстоящем вторжении.
Существует два вида систем обнаружения вторжения (IDS, Intrusion Detection Systems): к первым относятся программы, выявляющие аномалии в функционировании системы, например, необычно большое количество одновременно работающих процессов, повышенный трафик, передаваемый интерфейсами системы, и т. п.; ко вторым относят IDS, работа которых заключается в поиске заранее известных признаков атаки. Что же касается великолепной программы Snort, то её можно смело отнести к обоим видам IDS. Благодаря своей открытой архитектуре, Snort легко может быть расширена для решения различных задач.
Эта статья не претендует на всеобъемлющее руководство по Snort, а лишь является моим очень вольным переводом руководства, написанного Martin Roesch (автором программы), вперемешку с моими собственными мыслями.

Исчерпывающую информацию о том, чем является Snort и как его использовать, можно найти по адресу http://www.snort.org.
Что же такое Snort? Snort - это сетевая IDS, способная выполнять в режиме реального времени анализ трафика, передаваемого по контролируемому интерфейсу, с целью обнаружения попыток взлома или попыток поиска уязвимостей (таких, как переполнение буфера, сканирование портов, CGI-атаки, идентификация операционной системы, идентификация версий используемых сетевых сервисов и др.). Гибкость и удобство Snort основываются на трех столпах:
* языке правил, используемый для описания свойств подозрительного и потенциально опасного трафика;
* механизме оповещения об обнаружении атаки;
* модульной архитектуре кода, анализирующего трафик, основанной на концепции подключаемых модулей.
Следует отметить, что процедуры, декодирующие сетевой трафик, работают начиная с канального и заканчивая прикладным уровнем. В настоящее время Snort поддерживает декодирование для интерфейсов Ethernet, SLIP и PPP.
Рассмотрим самый важный с точки зрения пользователя компонент - язык правил. Правила задаются в файле конфигурации snort. Их синтаксис довольно прост:
ACTION PROTO IP_ADDR1 PORT1 DIRECTION IP_ADDR2 PORT2 [ (OPTIONS) ]
ACTION
Имеются три основных директивы, определяющие дальнейшие действия при обнаружении сетевого пакета, соответствующего некоторому правилу: pass, log и alert.
Директива pass указывает просто игнорировать пакет. Директива log определяет, что пакет должен быть передан процедуре журналирования, выбранной пользователем, для последующей записи в файл журнала. Наконец, директива alert генерирует уведомление об обнаружении пакета, удовлетворяющего правилу - опять же определенным пользователем способом - и потом уже передает пакет процедуре журналирования для последующего анализа.
Можно также использовать еще две директивы: activate и dynamic. Они позволяют для некоторого множества пакетов из одного правила вызывать другое. Например, может потребоваться при обнаружении пакета с явными признаками атаки на переполнение буфера осуществить генерацию уведомления об атаке и записать в файл журнала несколько последующих пакетов для дальнейшего их анализа. Такая функциональность как раз и достигается совместным использованием директив activate и dynamic. Кроме того, существует возможность определения собственных директив, ассоциировав их с одной или несколькими процедурами журналирования. Например, определение
ruletype redalert
{
type alert
output alert_syslog: LOG_AUTH LOG_ALERT
output database: log, mysql, user=snort dbname= snort host= localhost
}
создает новую директиву redalert, генерирующую уведомление с последующей передачей его syslog и записью информации об обнаруженном пакете в базу данных MySQL.
PROTO
В настоящее время для анализа доступны три протокола, и, соответственно, допустимы три значения этого параметра - tcp,udp,icmp. В будущем, возможно, появится поддержка ARP, IPX, IGRP, GRE, RIP, OSPF и других.
IP_ADDR
Snort не имеет механизма для разрешения имен (и вряд ли он появится в дальнейшем - по соображениям производительности), поэтому для задания хостов необходимо использовать их IP-адреса. Ключевое слово any позволяет задать все возможные адреса, для подсетей указываются CIDR-блоки.
Символ ! инвертирует условие, т.е. !192.168.3.0/24 означает любой не принадлежащий подсети 192.168.3.0/24 IP-адрес. Кроме того, можно задавать списки адресов, перечисляя их через запятую и заключая в квадратные скобки: [192.168.2.0/24,192.169.3.54/32].
PORT
Задание номеров портов осуществляется точно также, как и в Linux-утилите ipchains. То есть кроме единственного номера порта можно задать диапазон портов через двоеточие, например, 6000:6010 - порты с 6000 по 6010 включительно, :1024 - порты с 1 по 1024, 1024: - порты с 1024 по 65536. Как и в случае IP-адресов, символ ! инвертирует условие, а ключевое слово any обозначает все порты.
DIRECTION
Этот оператор позволяет определить направление движения пакета:
-> (одностороннее) - правило будет применяться только к пакетам, идущим с IP_ADDR1 на IP_ADDR2;
Последние комментарии
1 год 14 недели назад
1 год 14 недели назад
1 год 30 недели назад
1 год 35 недели назад
1 год 41 недели назад
1 год 41 недели назад
1 год 41 недели назад
1 год 43 недели назад
1 год 46 недели назад
1 год 48 недели назад