Опубликован: 20.02.2007 | Доступ: свободный | Студентов: 3482 / 786 | Оценка: 4.42 / 4.03 | Длительность: 40:03:00
Лекция 14:

Анализаторы сетевых потоков

Инструмент snort: система обнаружения вторжений

Мы уже говорили о системах обнаружения вторжений (IDS) в этой книге. Инструменты IDS также являются анализаторами сетевых потоков (sniffer). Сетевые администраторы размещают IDS в стратегической точке в сети, где проходит весь трафик. IDS исследует все пакеты, которые проходят через сеть, ища определенные сигнатуры, которые определены администратором. Затем IDS сообщает обо всем трафике, который соответствует этим сигнатурам. Идея заключается в том, чтобы сконфигурировать IDS с сигнатурами нежелательных пакетов, таких, как искореженные пакеты сканирования портов, созданные nmap, или программы с потенциально уязвимыми местами ( exploits ), как Code Red.

Snort - устойчивая IDS. Он выполняется на нескольких версиях системы Unix и на Windows. Кроме того, он абсолютно бесплатный (http: // www.snort.org/).

Snort не прост в изучении. Фактически, о программе Snort можно было бы написать целую книгу (и вероятно она была написана). Здесь мы не сможем отдать ей должное, но опишем некоторые из основных концепций, которые делают Snort превосходной IDS. С деталями вы сможете ознакомиться в документации по Snort на сайте http://www.snort.org/docs/writing_rules/.

Установка и реализация

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

Режимы инструмента snort

Snort может действовать, как автономный анализатор и перехватчик сетевых пакетов, как регистратор пакетов, или как система обнаружения вторжений (IDS). Первые два режима действительно не имеют никакого преимущества по отношению к другим анализаторам, за исключением того, что регистратор пакетов инструмента Snort может регистрировать пакеты на диск в каталоге с хорошо организованной структурой. Работа Snort с файлом правил (обычно snort.conf) вынудит его регистрировать только те пакеты, которые соответствуют правилам, указанным в этом файле.

Конфигурирование вывода инструмента snort

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

Как уже упоминалось, пакеты могут быть зарегистрированы в каталоге с хорошо организованной, удобочитаемой структурой или в двоичном файле перехваченных данных tcpdump. Если вы находитесь в сети с большим объемом трафика, вы захотите использовать режим регистрации данных в двоичном формате просто для того, чтобы не вынуждать Snort делать анализ в реальном времени. Пытаясь отформатировать вывод перехваченных данных, он мог бы пропускать некоторые пакеты. Сохраните данные в двоичном формате и используйте другую программу (возможно, Ethereal ) чтобы проанализировать их позже.

Правила инструмента snort: краткий обзор

Правила инструмента Snort похожи на выражения для пакетного фильтра, которые вы создаете в tcpdump и Ethereal. Они могут отфильтровывать пакеты, основываясь на IP-адресах, портах, данных заголовка, флагах и содержании пакета. У Snort три вида правил.

  • Правила предупреждений. Пакеты, которые удовлетворяют правилу предупреждений, будут зарегистрированы в указанном вами формате и будет послано предупреждение.
  • Правила пропуска. Пакеты, которые удовлетворяют правилам пропуска, будут пропущены и проигнорированы.
  • Правила регистрации. Пакеты, которые удовлетворяют правилам регистрации, будут зарегистрированы, но без предупреждения.

Snort поставляется со стандартным набором правил, который проверяет такую деятельность, как скрытное сканирование с помощью nmap, поиск уязвимых мест (vulnerability exploits), попытки взлома путем переполнения буфера, анонимный доступ по FTP, и многое другое.

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

Когда вы лучше познакомитесь с синтаксисом правил инструмента Snort, вам захочется написать правила игнорирования некоторого трафика. Например, в нашей сети, любое время было огромное количество DNS-запросов, отправленных нашему DNS-серверу другими DNS-серверами из интернета, Snort обнаруживал ложное UDP-сканирование портов и зондирование DNS. Очевидно, мы не хотели, чтобы наши файлы регистрации были завалены всеми этими ложными срабатываниями. Поэтому мы установили наш собственный файл правил и определили переменную DNS_SERVERS, которая содержала IP-адреса всех наших DNS-серверов. Затем мы написали следующие правила:

var DNS_SERVERS [192.168.1.150/32,192.168.1.151/32]

pass udp $DNS_SERVERS 53 - $DNS_SERVERS 53
pass udp $EXTERNAL_NET 53 - $DNS_SERVERS 53

Эти правила вынудили Snort пропускать (или игнорировать) любой DNS-трафик между нашими DNS-серверами и пропускать весь DNS-трафик между нашими DNS-серверами и DNS-серверами во внешней сети ( EXTERNAL_NET, который определен в главном файле snort.conf). Но проблема все еще сохранялась. Поскольку правила соответствий проверяются в таком порядке: правила предупреждений, пропуска, регистрации, то пакеты все еще сначала вызывали предупреждения. Нам было необходимо изменить порядок проверки соответствий. К счастью, Snort предусматривает опцию -o, которая изменяет порядок проверки правил на пропуск, предупреждение, регистрацию.

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

Наше второе правило пропуска фактически оставляет потенциальную дырку в нашем IDS. Мы предполагали, что только внешние DNS-серверы будут говорить с нашими DNS-серверами с порта отправителя 53. Если посторонний человек узнал бы об этом правиле, он мог бы перекинуть любой трафик мимо нашего IDS, сделав так, чтобы все были уверены, что DNS-запросы и попытки переноса зоны, прибывают с порта отправителя 53. Именно поэтому вы должны быть чрезвычайно осторожны при написании правил пропуска пакетов для Snort.

Синтаксис правил инструмента snort

Детали, касающиеся синтаксиса правил инструмента Snort можно найти на сайте http://www.snort.org/. Мы дадим краткое резюме того, как пишутся эти правила.

Основные правила Snort состоят из двух частей: заголовка и опций. Первая часть заголовка сообщает инструменту Snort, какого типа правило последует (предупреждение, регистрация, пропуск). Остальная часть заголовка указывает протокол (ip, udp, icmp или tcp), оператор направления (или - >, чтобы определить направление от отправителя к получателю или < >, чтобы определить двунаправленность), а также IP-адрес и порт отправителя и получателя. IP-адрес отправителя и получателя можно написать, используя синтаксис aaa.bbb.ccc.ddd/yy, где yy - число сетевых байтов (то есть маска сети). Это позволяет вам указать как сети, так и отдельные хосты. Несколько адресов можно указать, помещая их в скобках и отделяя запятыми подобно примеру. [192.168.1.0/24,192.168.2.4,192.168.2.10]. Диапазоны портов могут быть указаны с помощью двоеточия (так, что :1024 означает все порты вплоть до 1024, 1024: означает 1024 и выше, а 1024:6000 означа ет порты от 1024 до 6000). Вы также можете использовать ключевое слово any, чтобы указать все IP-адреса и порты. Можно использовать восклицательный знак ( !) для отрицания IP-адреса или порта (например, запись 1:1024 и !1025: эквивалентны).

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

Ниже приводится пример правил для инструмента Snort, которые обнаруживают тех, кто пытается получить доступ к cmd.exe через IIS Web-сервер.

alert tcp $EXTERNAL_NET any - $HTTP_SERVERS 80 
  (msg:"WEB-IIS cmd.exe access";
flags: A+; content:"cmd.exe"; nocase; classtype:web-application-attack;
sid:1002; rev:2;)

alert tcp $EXTERNAL_NET any - $HTTP_SERVERS 80 
 (msg:"WEB-IIS cmd?
access"; flags: A+; content:".cmd?&"; nocase; 
  classtype:web-application-attack;
sid:1003; rev:2;)"

Заданный по умолчанию набор правил для Snort состоит из единственного файла, называемого snort.conf и нескольких файлов с расширением .rules. Файл snort.conf является главным файлом правил, но он включает другие файлы правил, используя инструкцию include. Это позволяет вам разбивать правила на логические разделы. Файл snort.conf позволяет вам также определять переменные, которые могут использоваться во всех ваших правилах. Это сделано с помощью команды var.

В предыдущем примере, мы определили переменную с именем DNS_SERVERS. Файл snort.conf позволяет вам определять несколько переменных такого рода, и вы можете указать в своих правилах, какие машины являются Web-серверами, какие - почтовыми серверами, SQL-серверами, DNS-серверами и так далее. Это поможет инструменту Snort применять правила соответствия более рационально и эффективно. Например, нет никакого смысла в применении правил, написанных для обнаружения программных средств Web-сервера (то есть использования этих средств с целью взлома), применительно к трафику, поступающему с машины, на которой отсутствует Web-сервер.

Другое специальное правило инструмента Snort - правило конфигурации (config rule), которое позволяет вам указать некоторые из опций конфигурации, которые вы обычно помешаете в командную строку, в файле snort.conf.

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

Недавно в Snort добавили также поддержку динамических правил, которые являются "активизируются" другими правилами инструмента Snort. Фактический метод, в котором это сделано, находится в центре реконструкции предпринятой разработчиками Snort, но концепция осталась той же самой. Правило, имеющее "активизирующий" тип, включит "динамическое" правило, которое с ним связано. Это чрезвычайно полезно. До появления этих типов правил, бывало, что если кто-то успешно применил программу взлома (exploit) к одной из ваших систем, то Snort мог зарегистрировать этот факт, потому что пакет программы взлома соответствовал правилу. Но чтобы ни делал хакер после успешного применения программы взлома, никогда не регистрировалось, потому что оно не соответствовало никаким правилам. Если же мы используем активизирующий тип правила для обнаружения этой программы взлома, то оно может связаться с динамическим правилом, которое за тем перехватит следующие 500 пакетов хакера, которые позволят понять то, что он делал после успешного взлома.

Правила являются душой и сердцем инструмента Snort. Если вы овладеете этими правилами, то можете точно отрегулировать Snort, превращая его в чрезвычайно мощное оружие против потенциальных взломщиков.

Дополнительные модули к программе snort (Plug-In)

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

Предпроцессоры

Предпроцессоры устанавливаются в файле snort.conf, с помощью команды preprocessor. Они обрабатывают пакеты после того, как те были получены и декодированы инструментом Snort, но прежде, чем начнется применение правил соответствия. Таблица 14.3 описывает наиболее популярные предпроцессоры (те, которые имеются в версии Snort 1.8 ).

Таблица 14.3. Предпроцессоры инструмента snort
Предпроцессор Опции Описание
http_decode <port_list> Берет любые Web-URL, которые перехвачены из трафика передачи портов в <port_list>, и расшифровывает их в ASCII-текст. Так как URL не могут содержать некоторые специальные символы (например, пробелы), вы будете часто видеть символы подобные %21 в URL. Этот процессор преобразовывает эти символы к ASCII-коду так, чтобы правила были способны должным образом обнаружить предупреждения, основанные на совпадении URL.
port scan <network><num_ports><period><logfile> Одно из наиболее полезных дополнений к программе. Сканнер порта прослушивает <network> и регистрирует предупреждение в файл <logfile> всякий раз, как порт с номером <num_ports> или (и) другие порты в вашей сети задействуются в пределах интервала <period>, заданного в секундах.
port scan- ignorehosts <host_list> Вспомните наш пример с DNS-сервером. Мы не хотим получать сообщения о сканировании порта некоторых машин в нашей сети, потому что это фактически законный трафик. Здесь вы можете определить список IP-адресов (разделенный пробелами, а не запятыми) которые вы хотите игнорировать.
frag2 memcap <bytes> timeout <seconds> Выполняет дефрагментацию всех перехваченных фрагментированных пакетов. Использует заданный по умолчанию объем памяти в 4 мегабайта и 60-секундный перерыв для выполнения дефрагментации.
stream4 noinspect keepstats detect_scans detect_state_problems Позволяет Snort обрабатывать TCP-потоки (или сеансы) и делать инспекцию пакетов, давая заключение об их состоянии. Имеющиеся опции позволяют отключать инспекцию, регистрировать информацию о сеансе в файле, предупреждать о сканировании порта, и предупреждать о проблемах состояния (например, перепутанные порядковые номера пакетов), соответственно.
Модули вывода

Модули вывода также устанавливаются в файле snort.conf, с помощью команды output, которая управляет тем, как, где и в каком формате Snort хранит полученные данные. Для любого типа определенных вами правил можно указать определенный модуль вывода, который будет с ним использоваться. В таблице 14.4 описаны наиболее популярные модули вывода (в версии Snort 1.8).

Таблица 14.4. Модули вывода инструмента Snort
Модуль Опции Описание
alert_fast <logfile> Так же как с режимом быстрых предупреждений, который может быть определен из командной строки как -A fast, вы можете в этом месте определить отдельный файл. Эта опция полезна, если вы определяете свои собственные правила и хотите, чтобы некоторые правила использовали модуль alert_fast для регистрации данных в одном файле, в то время как другие правила использовали модуль alert_fast для регистрации данных в другом файле.
alert_full <logfile> Подобен модулю alert_fast за исключением того, что для предупреждений он использует заданный по умолчанию режим полной регистрации инструмента Snort.
alert_smb <workstation_list_file> Подобно свойству -M, посылает предупреждения WinPopup рабочим станциям Windows, перечисленным в файле.
alert_syslog <syslog_facility> <syslog_priority> Подобно опции -s, позволяет посылать предупреждающие сообщения инструмента Snort непосредственно в syslog, используя средства и приоритет, который вы определяете.
log_null Модуль полезен при определении типов правил, когда вы хотите вывести предупреждение, но не заботитесь о регистрации данных пакета.
log_tcpdump <logfile> То же, что и работа Snort в двоичном формате регистрации данных (-b) и указания другого имени файла для регистрационного файла tcpdump (-L).
alert_unified, log_unified <logfile> Новый, чрезвычайно эффективный метод регистрации, который скоро станет в инструменте Snort заданным по умолчанию способом регистрации данных. Оба формата регистрации будут сделаны в двоичном коде, и отдельные программы (типа Barnyard) будут использоваться при анализе двоичных файлов и приведении их в удобочитаемые форматы.
database <rule_type> <database_type> < parameters > Сохраняет данные согласно правилам регистрации Snort или правилам предупреждений Snort (в зависимости от <rule_type>) во внешней базе данных. <database_type> указывает тип внешней базы данных SQL (MySQL, Oracle, PostgreSQL или UnixODBC). А список параметров содержит необходимую информацию: хост базы данных, имя пользователя и пароль, название базы данных и так далее.
xml <rule_type> <parameters> Сохраняет данные согласно правилам регистрации Snort или правилам предупреждений Snort (в зависимости от <rule_type>) в файл в формате SNML (Simple Network Markup Language). Параметры <parameters> управляют местоположением и макетом файла.
CSV <logfile> <format> Выбор из доступных элементов тех, которые будут регистрироваться при выводе инструментом Snort в формате строки <format> в файл, названный <logfile> и содержащий значения, отделяемые друг от друга запятой.
trap_snmp <event_type> <sensor_id> <trap_type> <address> <community> Посылает SNMP-предупреждение станции сетевого управления по адресу <address> в SNMP сообщество <community>.