The Snort FAQ The Snort Core Team Перевод на русский язык: Роман Лепешков rlepeshkov@yandex.ru Предложения по развитию данного документа всегда приветствуются. Отправляйте их на адрес erek@snort.org. Если в данном документе есть разработанная вами часть и вы не видите свое имя в списке, напишите нам. Список авторов этого FAQ: Marty Roesch Fyodor Yarochkin Dragos Ruiu Jed Pickel Max Vision Michael Davis Joe McAlerney Joe Stewart Erek Adams Roman Danyliw Christopher Cramer Frank Knobbe Phil Wood Toby Kohlenberg Ramin Alidousti Jim Hankins Dennis Hollingworth Paul Howell Stef Mit Ofir Arkin Jason Haar Blake Frantz Lars Norman SЬndergaard Brent Erickson Brian Caswell Scot Wiedenfeld Chris Green Jeff Wirth Edin Dizdarevic Detmar Liesen Don Ng Matt Kettler Joe Lyman Jim Burwell Jed Haile Andrew Hutchinson Jeff Nathan Alberto Gonzalez Jason Haar Dragos Ruiu: This version of this guide has been brought to you by the kind generosity and sponsorship of Wiley and Sons publishers whose support let myself, and other snort developers Jeff Nathan and Jed Haile take the time to work on this document and other tutorials for Snort due out in our upcoming book. (route++) Содержание 1. Общие сведения 1.1 Как произносятся имена некоторых авторов snort? 1.2 Федор Ярочкин - тот самый Федор, написавший nmap? 1.3 Где я могу узнать побольше о snort? 1.4 Что я могу почитать (послушать курсы) об IDS? 1.5 Понимает ли snort дефрагментированные пакеты? 1.6 Может ли snort анализировать TCP-поток? 1.7 Обеспечивает ли snort анализ протоколов? 1.8 У меня сеть на коммутаторах, могу ли я использовать snort? 1.9 Устойчив ли snort к генераторам пакетов, таким как "Stick" и "Snot"? 1.10 Можно ли обойти snort, используя полиморфизм шеллкода? 1.11 Записывает ли snort пакет, вызвавший alert, полностью? 2. Начинаем + 2.1 Где найти пакеты с бинарниками для BlueHat BSD-Linux-RT? + 2.2 Как запустить snort? + 2.3 Где находятся файлы с логами и как они называются? + 2.4 Почему snort ругается на /var/log/snort? + 2.5 В какое место в сети лучше поставить snort? + 2.6 Libpcap ругается на проблемы с правами, в чем дело? + 2.7 У меня RedHat и .... + 2.8 Где можно взять последнюю версию libpcap? + 2.9 Где можно взять последнюю версию Winpcap? + 2.10 Какая версия Winpcap мне нужна? + 2.11 Почему при компиляции snort ругается на неразрешенные ссылки? + 2.12 Почему компиляция snort прерывается с ошибками "... yylex" и "... lex_init"? + 2.13 Я хочу сделать выделенную машину для snort. Сможет ли мое железо <список железа> обработать <вот такой> трафик? + 2.14 Что такое сетевые маски CIDR? + 2.15 Как использовать ключ "-r" для чтения файлов tcpdump? 3. Конфигурирование Snort + 3.1 Как мне установить snort на невидимый интерфейс? + 3.2 Как мне сделать ethernrt-кабель, работающий только на прием? + 3.3 Что такое HOME_NET и EXTERNAL_NET? + 3.4 В моей ЛВС несколько IP-сетей, как мне задать HOME_NET? + 3.5 Как мне задать EXTERNAL_NET? + 3.6 Как мне запустить snort для работы на нескольких интерфейсах сразу? + 3.7 Я получаю свой IP динамически, могу ли я использовать snort в этом случае? + 3.8 У меня один физический интерфейс и два логических, как мне заставить snort слушать на обоих адресах? + 3.9 Как мне игнорировать трафик с определенного адреса(сов)? + 3.10 Как настроить snort, чтобы он писал не только заголовки, но и содержимое пакетов? + 3.11 Почему нет поддиректорий в /var/log/snort с IP-адресами? + 3.12 Почему плагин portscan записывает "stealth"-пакеты, хотя я указал их в списке portscan-ignorehosts? + 3.13 Что такое ``Stealth scan''? + 3.14 Что такое SYNFIN scan? + 3.15 Что более приоритетно - опции командной строки или в snort.conf? + 3.16 Как работает порядок обработки правил? + 3.17 Как сконфигурировать stream4? + 3.18 Как обновлять набор правил? Как их подключать? + 3.19 Как получить последнюю версию snort через CVS&? + 3.20 Как мпользовать удаленный syslog? + 3.21 Как работать с ACID? 4. Правила и алерты + 4.1 Ошибки загрузки файлов правил + 4.2 Snort говорит "Rule IP addr ("1.1.1.1") didn't x-late" + 4.3 Snort находится за файрволом и отвратительно молчит... + 4.4 Может ли snort видеть пакеты, фильтруемые IPTables/IPChains/IPF/PF? + 4.5 У меня много сообщений . Что делать? Где поподробнее об этом почитать? + 4.6 Что делать с ложными алармами? + 4.7 Что за ICMP-файлы в поддиректроиях /var/log/snort? + 4.8 Почему генерируются алерты для пакетов, которые имеют свое пропускающее правило? + 4.9 Что за алерт "ICMP destination unreachable"? + 4.10 Почему во многих правилах есть установленные флаги P (TCP PuSH) и A (TCP ACK)? + 4.11 Snort говорит "BACKDOOR SIGNATURE...", на моей машине троян? + 4.12 Что такое "CGI Null Byte attacks"? + 4.13 Почему определенные алерты в логах идут с IP 'unknown' в ACID? + 4.14 Можно ли назначать приоритеты, используя ACID? + 4.15 Что это за алерты 'SMB Name Wildcard'? + 4.16 Что такое SYNFIN scan? + 4.17 У меня слишком много ложных "IIS Unicode attack detected" и/или "CGI Null Byte attack detected? Как мне их отключить? + 4.18 Как протестировать работу алертов и логов snort? + 4.19 Какая разница между ``Alerting'' и ``Logging''? + 4.20 Как используются ключевые слова в правилах (с помощью логических операций OR или AND)? + 4.21 Может ли snort работать с правилами, основанными на MAC-адресах? + 4.22 Как мне отключить правило? + 4.23 Как мне задать адрес "все, кроме конкретных хостов" ? + 4.24 После добавления/отключения правил как мне перезапустить snort? + 4.25 Как влияют ключевые слова distance и within keywords на работу правил? + 4.26 Как указать список портов в правиле? + 4.27 Как мне защищать web-сервера, работающие по протам, отличным от 80? + 4.28 Как мне отключить алерты "spp:possible EVASIVE RST detection"? + 4.29 Есть ли номера SID для частного использования, чтобы мои правила не конфликтовали с существующими? + 4.30 Насколько длинны могут быть списки адресов, переменных и правил? 5. Навешиваем рюшечки + 5.1 Люди говорят о ``Barnyard''. Что это? + 5.2 Как создать отчеты из логов? + 5.3 Как настроить логи в несколько баз или плагинов? + 5.4 Как мне протестировать snort без сетевой карты? + 5.5 Как запустить snort в режиме сервиса win32? + 5.6 Возможно ли с помощью snort добавлять правила в ipfilter/ipfw? + 5.7 Каков наилучший способ использования snort для блокировки атак? + 5.8 Snort ругается на ключевое слово "react"... + 5.9 Как заставить snort посылать мне алерты по e-mail? + 5.10 Как записывать определенный вид трафика и посылать алерты на syslog? + 5.11 Возможнго ли вызвать внешнюю программу по алерту? + 5.12 Как мне настроить snort для записи http URL или трафика smtp? + 5.13 Как мне выгрузить данные из snort db в snort_archive db, также, как это делает ACID? + 5.14 Что мне почитать для лучшего понимания логов, адресов-отправителей, откуда вообще пришли пакеты? + 5.15 Как мне проводить анализ логов и алертов? + 5.16 Как мне более детально проверить содержимое пакета? 6. Проблемы + 6.1 Мне кажется, я нашел баг, что делать? + 6.2 Не работают алерты SMB, что не так? + 6.3 Snort говорит "Garbage Packet with Null Pointer discarded!". И чего? + 6.4 Snort говорит "Ran Out Of Space". И чего? + 6.5 Во время длительных операций с помощью ACID отваливается соединение с БД по таймауту. (например, во время удалений кучи алертов) + 6.6 Почему ACID продолжает менять номер сенсора, и как мне его зафиксировать. + 6.7 Почему snort сообщает "Packet loss statistics are unavailable under Linux"? + 6.8 Директория /var/log/snort стала очень большой..... + 6.9 Почему появляется сообщение 'error deleting alert' при попытке удалить алерт в ACID? + 6.10 Похоже, ACID глючит, если его смотреть в Lynx + 6.11 У меня сообщение 'snort [pid] uses obsolete (PF_INET, SOCK_PACKET)' что делать? + 6.12 На HP-UX получаю: "device lan0 open: recv_ack: promisc_phys: Invalid argument" + 6.13 Snort подыхает с ошибкой 'can not create file', а у меня куча свободного места, что не так? + 6.14 У меня Snort под Windows и я получаю ошибку "OpenPcap() error upon startup: ERROR: OpenPcap() device open: Error opening adapter". Что не так? + 6.15 Snort не пишет в базу! + 6.16 Portscan-сообщения не пишутся в базу. + 6.17 Snort не пишет в syslog + 6.18 У меня туча сообщений spp_portscan, даже с тех адресов, которые в списке переменной $DNS_SERVERS. + 6.19 Почему snort в chrooted-окружении помырает, если ему послать SIGHUP? + 6.20 Как мне перезапустить Snort после того, как он упал? + 6.21 Почему на моем autoswitch-хабе я не вижу один из трафиков - 10Mbps или 100Mbps? + 6.22 При инсталляции snort: "bad interpreter: No such file or directory" + 6.23 Я не вижу ни одного интерфейса в списке под Win32. + 6.24 Snort не работает в Win32, как мне понять, snort это или WinPcap? + 6.25 Я скачал новые правила и теперь snort на них ругается. about the rules. + 6.26 Как мне ускорить работу ACID и MySQL ? + 6.27 Почему я получаю так много алертов "SMTP RCPT TO overflow" ? + 6.28 Я получаю много сообщений "ICMP Ping Speedera", это плохо? + 6.29 Почему мои алерты в unified-формате сдвинуты на +/- N часов? + 6.30 Я пытаюсь стартовать snort и он выдает ошибку "ERROR: Unable to open rules file: /root/.snortrc or /root//root/.snortrc". Что мне сделать, чтобы поправить ситуацию? * 7 Разработка + 7.1 Как запустить snort в режиме отладки? * 8 Разное + 8.1 Что такое "snort drinking game"? 1. Общие сведения 1.1 Как произносятся имена некоторых из разработчиков snort? Roesch - "Рэш" Ruiu - "Рю" Pickel - "Пикел" 1.2 Федор Ярочкин - тот самый Федор, написавший nmap? Неа. fyodor@insecure.org - автор nmap, использующий псевдоним, совпадающий с именем snort-овского Федора. 1.3 Где я могу узнать побольше о snort? Зайдите на сайт http://www.snort.org/ . Другие ресурсы доступны с исходными текстами, включающими Snort Users Manual и файл USAGE. Есть еще прекрасный лист рассылки snort users. Как на них подписаться, найдете на http://www.snort.org/lists.html . Также вы можете присоединиться к каналу #snort на irc.freenode.het. 1.4 Что еще я могу почитать (или какие можно послушать курсы) об IDS? Вот некотоые из предлагаемых курсов по Обнаружению Вторжений: * SANS - http://www.sans.org * Usenix - http://www.usenix.org/event/ * Networld/Interop - http://www.key3media.com/interop/ * CanSecWest - http://www.cansecwest.com Вот все уже выпущенные книги по Snort: +------------------------------------------------------------------------------- -------------------------+| | | | | ||----------------------------------+---------------------------+--------------- -+--------------+---------|| Snort: The Complete Guide | Jeff Nathan, Dragos Ruiu, | Wiley&Sons | 0471455970 | 06/2003 ||----------------------------------+---------------------------+--------------- -+--------------+---------|| to Intrusion Detection | Jed Haile | | | ||----------------------------------+---------------------------+--------------- -+--------------+---------|| Intrusion Detection with Snort: | Rafeeq Rehman | Prentice Hall | I0131407333 | 05/2003 ||----------------------------------+---------------------------+--------------- -+--------------+---------|| Advanced IDS Techniques | | | | ||----------------------------------+---------------------------+--------------- -+--------------+---------|| Snort Intrusion Detection | Ryan Russell | Syngress Media | 1931836744 | 02/2003 ||----------------------------------+---------------------------+--------------- -+--------------+---------|| Snort Intrusion Detection | Jack Koziol | New Riders | 157870281X | 04/2003 ||----------------------------------+---------------------------+--------------- -+--------------+---------|| | | | | |+------------------------------------------------------------------------------ --------------------------+Доступно много хороших книг по Обнаружению вторжений, вот некоторые из них:+--------------------------------------------------------------------------- ----------+| | | ||---------------------------------------------------+--------------------+----- -------|| Network Intrusion Detection An Analyst's Handbook | Stephen Northcutt | 0735708681 ||---------------------------------------------------+--------------------+----- -------|| Intrusion Signatures and Analysis | Stephen Northcutt | 0735710635 ||---------------------------------------------------+--------------------+----- -------|| TCP/IP Illustrated, Volume 1 The Protocols | W. Richard Stevens | 0201633469 ||---------------------------------------------------+--------------------+----- -------|| Intrusion Detection | Rebecca G. Bace | 1578701856 ||---------------------------------------------------+--------------------+----- -------|| | | |+------------------------------------------------------------------------------ -------+ 1.5 Понимает ли snort дефрагментированные пакеты?Да, используйте "preprocessor frag2"1.6 Может ли snort анализировать TCP-поток?Да, посмотрите препроцессор stream4 (см. FAQ 3.17), который анализирует записиTCP-сессий, осуществляет разбор TCP-пакетов и многое другое.1.7 Обеспечивает ли snort анализ протоколов?Да, (см. FAQ 3.17) и это тоже.1.8 У меня сеть на коммутаторах, могу ли я использовать snort?Короткий ответ:Возможность прослушивать трафик в сети, построенной на коммутаторах, зависит от типа используемых коммутаторов. Если коммутатор может зеркалировать трафик,настройте зеркалирование на порт машины с установленным snort.Развернутый ответ:Есть несколько способов использоваиня NIDS (Network Intrusion Detection System - Системы Обнаружения Сетевых атак) в сетях, построенных на коммутаторах, сосвоими плюсами и минусами. Их использование зависит от ваших нужд, какой из сегментов вы хотите мониторить, а также вашего бюджета. Вот некоторые общие методы:1. Коммутатор с зеркальным портом (mirror port) - если коммутатор можетзеркалировать трафик, настройте зеркалирование на порт коммутатора, к которомуподключен ваш snort. Плюсы - простой способ, работает на большинстве коммутаторов. Минусы - если у вас 100 Мбит коммутатор, то зеркалировать вы можете максимум 100 Мбит. Так как каждый порт коммутатора поддерживает 100 Мбит на каждое направление, пропускная способность, соответственно, получается 200 Мбит, таким образом, коммутатор не сможет отзеркалировать весь трафик на один порт в случае высокой загрузки сети. - у некоторых коммутаторов падает производительность в случае использования зеркалирования 2. Концентратор (хаб) - вставляем хаб в сеть и легко можем ловить весь трафик. Работает отлично для домашних сетей, но будем терять данные из-за коллизий при загрузке более 50%, таким образом, 10Мбитный хаб будет отличным решением для работы с трафиком из каналов T1/E1, DSL - модемов. Если у вас DS3 или круче, смотрите п.3 + Плюсы: -простой метод -никаких заморочек с производительностью и конфигурациями коммутаторов -цена + Минусы: - потеря преимуществ full-duplex - добавляется еще одно место для возможных глюков - потеря пакетов при загрузке выше 50% 3. Сетевые ловушки - использование ловушек (например Shomiti/Finisar, Netoptics). Вы можете найти статьи Jeff Nathan об этом на http://www.snort.org/docs/#deploy . + Плюсы: - никаких заморочек с производительностью и конфигурациями коммутаторов - невидимость, так как данные в обратно коммутатор не идут - нет единой точки сбоя, если ловушка выйдет из строя, все остальное будет работать + Минусы - поток данных разделяется на TX и RX, таким образом, вам понадобятся два сетевых адаптера - два потока должны быть объединены, если вы не хотите потерять возможность для корректного анализа, информацию найдете по адресу http://sourceforge.net/projects/bonding . - цена 4. Потратьте деньги - прослушивайте все порты коммутатора (используя сетевые ловушки) но отлавливая только входящие пакеты (RX-линии портов коммутатора) , заведя эти порты на выделенный гигабитный коммутатор, который может отзеркалировать до десяти RX-линий на выделенный гигабитный порт, на котором живет ваша IDS с гигабитным интерфейсом (Прим.пер. - наш гигабитник подвис через 4 часа работы с зеркалированием) + Плюсы: - максимальное покрытие (мониторим все порты коммутатора) - нет потерь производительности, не нужно переконфигурировать коммутатор + Минусы - много килобаксов 1.9 Подвержен ли snort атакам с использованием генераторов шума, таких как "Stick" и "Snot"? Сейчас возможно победить этот тип генераторов шума с помощью препроцессора (см. FAQ 3.17). Даже без активированного препроцессора stream4, snort запишет шторм -алерт без зависания и потери множества алертов, т.к. является высокооптимизированным. Использование инструментов, генерирующих тучу алертов предупредит хорошего аналитика о попытке злоумышленника проникнуть под прикрытием этого шторма. 1.10 Можно ли обмануть snort используя полиморфизм шеллкода? Да, некоторые из правил обнаружения NOP-сигнатур вы можете данным средством обойти, но обычные правила не обмануть таким типом маскировки. Препроцессор fnord обеспечивает обнаружение и анализ NOP-эквивалентных длинных строк. 1.11 Записывает ли Snort целиком пакет, вызвавший алерт? Да, пакеты должны быть в директории, название которой представляет из себя IP-адрес отправителя пакета, вызвавшего алерт. Если вы используете бинарный лог, файл (.pcap) будет лежать в директории хранения логов. 2. Начинаем 2.1 Где я могу найти бинарники для BlueHat BSD-Linux-RT? Повторяем за мной: wget http://www.snort.org/downloads/snort-stable.tgz tar zxvf snort-stable.tgz cd snort-stable ./configure make su make install mkdir /var/log/snort cd etc vi snort.conf snort -D -c snort.conf exit ...и если вы хотите использовать наш деинсталлятор: cd snort-stable; make uninstall и, если вам нужно, вы можете найти некоторые бинарники на http://www.snort.org/dl/binaries/ . Также вы можете найти Snort в большинстве портов BSD. 2.2 Как мне запустить snort? Запустите snort в режиме sniffer и убедитесь, что он видит пакеты snort -dv Затем запустите его с корректно настроенной переменной HOME_NET в конфигурационный файле, для сети,которую вы защищаете. Начальный конфигурационный файл поставляется в дистрибутиве и называется "snort.conf". Вы можете запустить snort в конфигурации "по-умолчанию" командой: snort -A full -c snort.conf Если все настроено верно, убедитеть, что интерфейс находится в promisc- режиме, запустив в другом терминале: ifconfig -a Вывод ifconfig должен показать, что интерфейс находится в promisc-режиме. Если нет, нужно включить этот режим самостоятельно (ручками). Заметим, что режим вывода по-умолчанию (-А full) использовать не рекомендуется, за исключением работы в серьезно контролируемом окружении. Это самый медленный способ работы snort и влечет за собой сложности по решению возникших проблем с созданием индексных дескрипторов (inode) в файловой системе. Людям, реально занимающимся IDS, подходит использование (-A fast -b) для совмещения скорости генерации алертов с бинарными логами tcpdump. 2.3 Где расположены мои логи? Как они называются? По-умолчанию, файлы находятся в /var/log/snort/ . Если snort запущен с опцией "- I ", тогда логи будут писаться в указанную директорию . Раньше запуск snort в режиме демона (-D) создавал файл "snort.alert". Теперь и в стандартном режиме и в режиме демона создается файл "alert". Обратите внимание, что соглашение об именованиии лог-файлов изменилось при переходе с версии 1.8 на 1.9. Эти смешные цифробуковки в конце новых имен файлов являются временнЫми метками UNIX, что позволяет избегать конфликтов при создании файлов. 2.4 Почему snort ругается на /var/log/snort? Ему нужна эта директория для записи туда алертов, попробуйте эту команду: mkdir -p /var/log/snort Убедитесь, что эта директория принадлежит пользователю, под которым запускается и работает snort. 2.5 Где лучшее место для размещения сенсора snort? Это зависит от вашей организационной политики и того, что вы хотите защищать. Один из путей для решения этого вопроса - определить, хотите вы разместить snort до файрвола или за ним. Размещение вашей IDS снаружи файрвола позволит вам мониторить все атаки, направленные на ресурсы вашей сети, до того, как эти атаки остановит файрвол. Почти наверняка это означает, что IDS зафиксирует в логах гораздо больше событий, чем внутри ЛВС, после файрвола. Размещение IDS внутри ЛВС, за файрволом, позволит отследить трафик, который пропускает ваш файрвол. Если ресурсы позволяют, то лучшим решением может быть размещение двух IDS - один снаружи, другой внутри. Этот вариант позволит следить за всеми пакетами, направленными в вашу сеть, а также за всем оборудованием, позволяющим этим пакетам пройти внуть вашей сети. <<< От переводчика : ниже идут размышления всяких парней по вопросу - куда же ставить IDS, мне они интересными не показались, имхо в предыдущем абзаце сказано достаточно. Единственный интересный (сугубо имхо) и неочевидный момент, возможные грабли - это NAT на файрволе и IDS во внешнем сегменте, что приводит к некоторой путанице - адреса получателей в журналах snort будут совсем не те, что во внутреннем сегменте, по понятным причинам. Тем не менее размышления я оставляю,желающие могут почитать и перевести данный текст. >>> ADDENDA AD NAUSEUM Note: So this one still gets a lot of traffic even though it's in the FAQ. Erek Adams has noted this comprehensive and authoritative discussion of this perpetual discussion item - mildly edited, also see faq question about switches hubs and taps -dr If your router/switch can do port mirroring then just connecting a network IDS to it would be fine. Else a hub could be another option. Most of network IDS can have a NIC that acts as a passive sniffer anyway. As to where to place the sensor. I would go for both, one to monitor the external, one for the internal. I work in a distributor for security products, so over instrumentation is fun :) And in any case, if the traffic do not pass by the Sensor it will not get monitored. So some people deploy IDS on their internal segments too I believe. In ``front'' of the firewall(s): Pro: Higher state of alert you know what attacks you are facing. Con: Wall to Wall of data, boring? If your firewall has NAT turned on, tracking the sources originating from your internal network is difficult. ``Behind'' the firewall(s): Pro: Only what gets through the firewall gets monitored? Less load on the IDS analyst. You get to see what hosts are sending traffic to the internet. Con: Less idea of the state of the environment, false sense of safety. Where should IDS be placed relative to firewalls? Explore the pros and cons off placing IDS inside or outside firewall. What are the drawbacks of each? * MARCUS RANUM from NFR Security: "I'd put mine inside. Why should I care if someone is attacking the outside of my firewall? I care only if they succeed, which my IDS on the inside would ideally detect. Placing the IDS on the outside is going to quickly lull the administrator into complacency. I used to have a highly instrumented firewall that alerted me whenever someone attacked it. Two weeks later I was deleting its alert messages without reading them. Another important factor arguing for putting it inside is that not all intrusions come from the outside or the firewall. An IDS on the inside might detect new network links appearing, or attackers that got in via another avenue such as a dial-in bank.'' * CURRY from IBM: ``The IDS should be placed where it will be able to see as much of the network traffic you're concerned about as possible. For example, if you're concerned about attacks from the Internet, it makes the most sense to put the IDS outside the firewall. the most sense to put the IDS outside the firewall. This gives it an "unobstructed" view of everything that's coming in. If you put the IDS inside the firewall, then you're not seeing all the traffic the bad guys are sending at you, and this may impact your ability to detect intrusions.'' * SUTTERFIELD from Wheel Group: ``IDS ideally plays an important role both inside and outside a firewall. Outside a firewall, IDS watches legitimate traffic going to public machines such as e-mail and Web servers. More importantly IDS outside a firewall will see traffic that would typically be blocked by a firewall and would remain undetected by an internal system. This is especially important in detecting network sweeping which can be a first indication of attack. External systems will also give you the benefit of monitoring those services that firewalls determine are legitimate. Putting an IDS inside the firewall offers the added benefit of being able to watch traffic internal to the protected network. This adds an important element of protection against insider threats. The major drawback of IDS inside a firewall is that it cannot see a good deal of important traffic coming from untrusted networks and may fail to alert on obvious signals of an impending attack.'' * CHRIS KLAUS from ISS: ``Outside the firewall is almost always a good idea-it protects the DMZ devices from attack and dedicates an additional processor to protecting the internal network. Just inside the firewall is also useful-it detects attempts to exploit the tunnels that exist through the firewall and provides an excellent source of data for how well your firewall is working. Throughout your intranet may be the best place for IDS deployment, however. Everyone agrees that attacks aren't the only things we're worried about-there's internal mischief, fraud, espionage, theft, and general network misuse. Intrusion detection systems are just as effective inside the network as outside, especially if they're unobtrusive and easy to deploy.'' * GENE SPAFFORD: ``The IDS must be inside any firewalls to be able to detect insider abuse and certain kinds of attacks through the firewall. IDS outside the firewall may be useful if you want to monitor attacks on the firewall, and to sample traffic that the firewall doesn't let through. However, a true IDS system is likely to be wasted there unless you have some follow-through on what you see.'' * Bottom Line: DRAGOS RUIU: ``just pick a spot you're likely to look at the logs for :-)'' 2.6 Libpcap ругается - проблемы с полномочиями, в чем дело? Либо snort работает не под рутом, либо ядро Linux неправильно настроено. 2.7 У меня RedHat и ... Проверьте свою версию libpcap. Если версия < 0.5, обновите библиотеку. 2.8 Где я могу взять последнюю версию libpcap? Здесь: http://www.tcpdump.org/ Также вы можете посмотреть патчи от Phil Wood для libpcap for Linux. http://public.lanl.gov/cpw/ 2.9 Где я могу взять последнюю версию Winpcap? http://winpcap.polito.it/ 2.10 Какая версия Winpcap мне нужна? Если у ваш в компе один процессор, используйте текущую версию. Если у вас мультироцессорный комп, то либо старую (< 2.3) версию, либо новую, но с патчем, взятым с http://www.ntop.org/winpcap.html . 2.11 Почему во время компиляции snort-а идет ругань "missing references"? Вы должны сконфигурировать libpcap с опциями -install-incl. (В RedHat - у вас должен быть инсталлированный пакет libpcap-devel) 2.12 Почему компиляция snort прерывается с ошибками ".. yylex" и ".. lex_init"? Вам нужны установленные lex и yacc или их gnu-аналоги flex и bison. 2.13 Я хочу сделать snort-устройство. Сможет ли <вот такое> мое железо обрабатывать <вот такой> трафик? Есть варианты. Поменьше правил - побольше производительность. Убирайте ненужные правила или те, на которые вам плевать. Было много обсуждений способов увеличения производительности, инфа доступна в списках рассылки snort-users. <<< От переводчика: ниже идут рассуждения Marty на тему "чем круче тачка - тем лучше работает snort", странно, правда? ;) и "snort работает на всем". Как и в прошлый раз, оставляю для желающих почитать нативную версию. >>> Here is an oft quoted bit on the subject from Marty: "Hardware/OS recommendations" Ok, here are the guidelines and some parameters. Intrusion detection is turning into one of the most high performance production computing fields that is in wide deployment today. If you think about the requirements of a NIDS sensor and the constraints that they are required to operate within, you'll probably start to realize that it's not too hard to find the performance wall with a NIDS these days. The things a NIDS needs are: 1. MIPS (Fast CPU) 2. RAM (More is *always* better) 3. I/O (Wide, fast busses and high performance NIC) 4. AODS (Acres Of Disk Space) A NIDS also needs to be pretty quick internally at doing its job. Snort's seen better days in that regard (when 1.5 came out the architecture was a lot cleaner) but it's still considered to be one of the performance leaders available. As for OS selection, use what you like. When we implement Data Acquisition Plugin's in Snort 2.0 this may become more of a factor, but for now I'm hearing about a lot of people seeing alot of success using Snort on Solaris, Linux, *BSD and Windows 2000. Personally, I develop Snort on FreeBSD and Sourcefire uses OpenBSD for our sensor appliance OS, but I've been hearing some good things about the RedHat Turbo Packet interface (which would require mods for Snort to use, not to mention my general objection to RedHat's breaking stuff all the time). (ed note: take a drink, see FAQ 7.2 -dr) 2.14 Что такое маски сети CIDR? CIDR - новая схема адресации для Internet, более эффективно использующая адресное пространство, нежели старая схема классов A, B, C, D. <<< От переводчика: вырезал таблицу расчета количества хостов в зависимости от маски сети. >>> Для более детального ознакомления смотрите RFC: * RFC 1517: Applicability Statement for the Implementation of CIDR * RFC 1518: An Architecture for IP Address Allocation with CIDR * RFC 1519: CIDR: An Address Assignment and Aggregation Strategy * RFC 1520: Exchanging Routing Information Across Provider Boundaries in the CIDR Environment на сайте http://www.rfc-editor.org/rfcsearch.html 2.15 Каков смысл использования ключа "-r" ? Наряду с логами в формате tcpdump (записанные в соответствии с конфигурацией), snort может писать в декодированном текстовом формате, который, в отличие от бинарных логов, гораздо читабельнее. 3. Конфигурирование Snort 3.1 Как установить snort на "невидимый" интерфейс *BSD и Linux: ifconfig eth1 up Solaris: ifconfig eth1 plumb ifconfig eth1 up NT/W2K/XP: ВНИМАНИЕ: На ваш страх и риск вы можете применить следующие инструкции. Редактирование реестра Win очень ОПАСНО и должно производиться с особой осторожностью. Следуйте инструкции на СВОЙ страх и риск. 1. Получите шестнадцатеричное значение с вашей карты, используя 'snort -W' 2. Запустите Regedt32 3. Найдите ключ HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\ Parameters\Interfaces\{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} 4. Выберите сетевой адаптер, с которым будет работать snort, будет значение {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} 5. Правим IPAddress:REG_MULTI_SZ: в null (Двойной щелчок на значении, удаляем всю строку, нажимаем OK) 6. Set SubnetMask:REG_MULTI_SZ: в null (Двойной щелчок на значении, удаляем всю строку, нажимаем OK) 7. Set DefaultGateway:REG_MULTI_SZ: в null (Двойной щелчок на значении, удаляем всю строку, нажимаем OK) 8. Закрываем regedt32, именения запишутся автоматически 9. В командной строке запускаем "ipconfig" и проверяем, чтобы интерфейс не имел связанного с ним IP Если вы не получите IP адреса в выводе ipconfig для вашего интерфейса, сконфигурированного в regedt32, можем двигаться дальше. Для запуска snort на желаемом интерфейсе, используйте флаг "-i", например: 'snort -v -d -p -i1' 3.2 Как мне получить ethernet-кабель, работающий только на прием? Используйте сетевую ловушку или сделайте его самостоятельно. Вот пример распайки * []LAN Sniffer 1 ---\ /- 1 2 --\ | \- 2 3 --+-*--- 3 4 - | - 4 5 - | - 5 6 --*---- 6 7 - - 7 8 - - 8 На стороне сниффера: соединяем 1 и 2 провод, на стороне LAN: провода 1 и 2 соединяем, соответственно, с 3 и 6, 3 и 6 - оставляем целыми. Таким образом, получим псевдо-линк, пропускающий пакеты только в сторону сниффера. Весь входящий трафик отсылается обратно в LAN, поэтому такой кабель нормально работатет только в хабе. Можете попробовать на коммутаторе, но получите, хммм.. интересные результаты. Поскольку коммутатор получает пакеты обратно на тот же порт,с которого они пришли, очень скоро таблица MAC-адресов будет испорчена и устройства, подключенные к коммутатору, не смогут работать по сети. А на хабе работатет замечательно. Другие методы для 100 Мбит: http://www.geocities.com/samngms/sniffing_cable 3.3 Что такое HOME_NET и EXTERNAL_NET? HOME_NET и EXTERNAL_NET - стандартные имена переменных для конфигурации Snort. HOME_NET - сеть, которую вы хотите защищать,EXTERNAL_NET - сеть, из которой предположительно будут исходить атаки. 3.4 Моя сеть состоит из нескольких подсетей, как мне определить HOME_NET? Snort 1.7 поддеживает IP lists. Вы можете присвоить несколько адресов одной переменной, например: var HOME_NET [10.1.1.0/24,192.168.1.0/24] Замечание: Не все препроцессоры поддерживают IP lists. Если ничего не оговорено, следует полагать, что любой препроцессор при работе с IP lists будет использовать первую сеть в качестве значения HOME_NET. Препроцессор portscan один из таких. Для обнаружения всех возможных сканирований портов следует задавать сеть 0.0.0.0/0 в качестве первого параметра: preprocessor portscan: 0.0.0.0/0 5 3 portscan.log Для исключения из журналов snort сообщения о трафике от доверенных машин, генерирующих большое количество записей в журнал, следует использовать препроцессор portscan-ignorehosts. 3.5 Как мне задать значение для EXTERNAL_NET? Многие присваивают переменной EXTERNAL_NET значение ``any'': var EXTERNAL_NET any Snort будет реагировать на любой трафик, приходящий или покидающий вашу сеть. Для уменьшения нагрузки на snort, многие присваивают значение ``not HOME_NET'': var EXTERNAL_NET !$HOME_NET что определяет EXTERNAL_NET как "все, не являющееся HOME_NET". Для большинства случаев это наилучший вариант. 3.6 Как мне заставить работать snort на нескольких интерфейсах одновременно? LINUX: если у вас ядро не версии 2.1.x/2.2.x (с доступным LPF), единственный способ - запустить несколько процессов snort, по одному процессу на интерфейс (с опцией "-i", указывающей на интерфейс). Поскольку linux 2.1.x/2.2.x и выше может использовать библиотеку libpcap с патчем S. Krahmer's, который позволяет указать в качестве имени интерфейса 'any'. В этом случае snort будет обрабатывать трафик со всех интерфейсов. BSD: Используйте интерфейс ``bridge'' для объединения ваших nics в логический интерфейс (bridge0). 3.7 Мой интерфейс получает IP-адрес динамически, могу ли я использовать snort на этом интерфейсе? Да, начиная с версии 1.7 есть переменная _ADDRESS, значение этой переменной всегда устанавливается в IP адрес/сеть интерфейса, на котором был запущен snort. Если интерфейс был опущен и поднят заново (и IP адрес изменился) вам придется перестартовать snort. Для ранних версий snort доступны несколько скриптов для решения этой проблемы. 3.8 У меня есть один физический интерфейс и два алиаса, могу ли я заставить snort работать на обоих адресах? Начиная с версии 1.7 вы можете указать IP list: var HOME_NET [ 192.168.10.0/24, 10.1.1.1/16 ] 3.9 Как мне заставить snort игнорировать трафик от конкретных хостов? Есть два основных способа: * Правила (rules) * Фильтры BPF Детали: 1. Правила Преимущества: контроль за трафиком, основанный на правилах все изменения в одном месте - snort.conf Недостатки Измененный порядок правил приведет к головной боли при "разборе полетов" Одно бестолково написанное правило может скрыть целую сеть Чем подробнее правило, тем больше snort загружает процессор, что может быть важно в нагруженных сетях Пример: Чтобы игнорировать весь icmp-трафик от хоста используем правило: pass icmp any -> $HOME_NET any 2. фильтры BPF: + Преимущества Пакет сбрасывается на интерфейсе BPF, что облегчает нагрузку. Ускоряет snort, т.к. он "никогда не видит" этих пакетов + Недостатки: Бестолково настроенные фильтры могут "ослепить" snort. + Пример: Чтобы игнорировать весь трафик от 192.168.0.1: snort not host 192.168.0.1 Чтобы игнорировать весь трафик ICMP ECHO-REQUESTS и ICMP-ECHO REPLY's (запрос и ответ ping) от хоста : snort ``not ( (icmp[0] = 8 or icmp[0] = 0) and host )'' 3.10 Как мне заставить snort писать не только заголовки, но и содержимое пакета? Используйте опцию "-d" для записи содержимого пакетов или опцию "-b" для записи пакета целиком в бинарном виде. 3.11 Почему у меня нет поддиректорий в /var/log/snort для IP адресов? Это зависит от конфигурации журналов snort. Если запись ведется в бинарном формате, вам придется обрабатывать бинарный лог для получения читабельного вида. Вы также можете указать опцию "-А " в командной строке. Опции командной строки всегда более приоритетны чем snort.conf. 3.12 Почему препроцессор portscan записывает "stealth"- пакеты, хотя хост в записан в списке portscan-ignorehosts? Такие TCP-пакеты в любом случае подозрительны, неважно, откуда они пришли. portscan был построен с тем положением, что stealth-пакеты должны быть запротоколированы, даже от тех хостов, которые не отслеживаются на сканирование портов. Опция "игнорировать stealth-пакеты" возможно появится в будущем. 3.13 Что за хек это "Stealth-сканирование"? Есть несколько типов Stealth-сканирования. * Полуоткрытое соединение (SYN-сканирование) вместо завершенного трехкратного двустороннего рукопожатия, т.е. TCP-соединение не устанавливается. Пакет с флагом SYN посылается, и если обратно приходит пакет с флагами SYN/ACK, то порт на сканируемой машине открыт. Если обратно вернется пакет с флагами SYN/RST, порт закрыт * FIN-сканирование, по RFC 793 система должна ответить пакетом с флагом RST для всех закрытых портов, если получает пакет с флагом FIN на указанный порт. * XMAS tree - сканирование (Рождественская елка), по RFC 793 система должна ответить пакетом с флагом RST для всех закрытых TCP портов, если получает пакет на закрытый порт с флагом FIN/URG/PUSH. * NULL-сканирование по RFC 793 система должна ответить пакетом с флагом RST, на пакет, пришедший на закрытый порт, без установленных флагов. * Медленное сканирование, любой тип из вышеперечисленных может использоваться при медленном сканировании. Атакующий посылает очень редко. При таком способе сканирование может продолжаться часами, сутками и даже неделями. Идея такого сканирования такова: на редко приходящие подозрительные пакеты системы безопасности не обратят внимание. 3.14 Что за хек это SYNFIN-сканирование? SYNFIN-сканирование получило такое название, поскольку в посылаемом пакете установлены флаги SYN и FIN. 3.15 Какие параметры более приоритетны - в командной строке или в snort.conf? Командная строка всегда более приоритетна чем snort.conf. Если некто хочет быстро попробовать различные опции в работе, командная строка позволит это сделать без правки snort.conf. 3.16 Каков порядок работы правил? Для 2.0 =>: Пожалуста, посмотрите документацию:: http://www.snort.org/docs/#devel http://www.snort.org/docs/#devel Для <= 1.9.Х: Марти объяснял это много раз в списках рассылки. Вот выдержки из поста Thu, 22 Feb 2001 00:31:53 -0500, озаглавленного "Re: [Snort-users] order of evaluation of rules": На данный момент структуры данных с правилами для snort хранятся в Деревьях Правил (RuleTreeNodes - RTN) и Деревьях Опций (OptTreeNodes - OTN). Эти структуры хранятся в двух связанных списках, RTN формируют верхнюю строку "массива" и OTN формируют столбцы под RTN. Вот ASCII-иллюстрация из мерзкого "lisapaper": * []RTN RTN RTN ------- ------- --- | Chain Header | | Chain Header | | Chai (Заголовок) | | | | | | Src IP | | Src IP | | Src (Исх. IP) | Dst IP |--->| Dst IP |--->| Dst (IP-получат.) | Src Port | | Src Port | | Src (Исх. порт) | Dst Port | | Dst Port | | Dst (порт-получ.) | | | | | ------- ------- --- | | | | | | OTN \|/ OTN \|/ ----V--- ----V---- | Chain Option | | Chain Option | (опции цеп.) | | | : | | Content | : (содержимое) | TCP Flags | : (TCP флаги) | ICMP Data | (ICMP данные) | Payload Size | (размер данн.) | etc. | (и т.п.) | | -------- | | | OTN \|/ ----V--- | Chain Option | | | | Content | | TCP Flags | | ICMP data | | Payload Size | | etc. | | | ------- | | Правила с одинаковыми заголовками (например - для CGI, старые правила для отслеживапределения stealth-сканирования, большинство правил, сфокусированных на каком-либо одном сервисе и т.п.) группируются под одним RTN для повышения эффективности применения OTN, находящимся под этим RTN. Например, если у вас есть три вот таких правила: alert tcp any any -> $HOME 80 (content: "foo"; msg: "foo";) alert tcp any any -> $HOME 80 (content: "bar"; msg: "bar";) alert tcp any any -> $HOME 80 (content: "baz"; msg: "baz";) Они будут сгруппированы под одним RTN и OTN "висят" под ним: * [] RTN RTN ---------- ---------- | SIP: any | | SIP: any | | SP: any |---->| SP: any | | DIP: $HOME | | DIP: $HOME | | DP: 80 | | DP: 1-1024 | ---------- ---------- | | | | OTN \|/ \|/ -----v----- -----v----- | content: foo | | flags: S | | msg: foo | | msg: example | ---------- ---------- | | OTN \|/ -----v----- | flags: S | | msg: Port 80 SYN! | ---------- | | OTN \|/ -----v----- | content: baz | | msg: baz | ---------- Это эффективный путь хранения и обработки, поскольку в этом случае нам нужно только лишь раз проверить данные в RTN. В нашем массиве есть еще одно измерение: список функций. Кажлый элемент в "массиве" имеет связанный с ним список функций. Функции в этом списке - тесты, которые покажут, попадает ли текущий пакет под действие правила данного элемента "массива". Наличие такого списка функций дает отличную эффективность и гибкость: нам не нужно тестировать ничего лишнего, не содержащегося в правиле (например: порты/IP-адреса для "any", содержимое пакета в правилах без ключевого слова "content" и т.п.). Также это позволяет нам анализировать пакет любой функцией без изменения всей программы (что требовалось в версиях до 1.5). Приведем пару иллюстраций этой архитектуры. Для пользы дела и понимания процесса порядка работы правил, это специально подобранный пример: alert tcp any any -> $HOME 80 (content: "foo"; msg: "foo";) alert tcp any any -> $HOME 1:1024 (flags: S; msg: "example";) alert tcp any any -> $HOME 80 (flags: S; msg: "Port 80 SYN!";) alert tcp any any -> $HOME 80 (content: "baz"; msg: "baz";) получаем: * []\begin{verbatim} RTN RTN ---------- ---------- | SIP: any | | SIP: any | | SP: any |---->| SP: any | | DIP: \$HOME | | DIP: \$HOME | | DP: 80 | | DP: 1-1024 | ---------- ---------- | | | | OTN \|/ \|/ -----v----- -----v----- | content: foo | | flags: S | | msg: foo | | msg: example | ---------- ---------- | | OTN \|/ -----v----- | flags: S | | msg: Port 80 SYN! | ---------- | | OTN \|/ -----v----- | content: baz | | msg: baz | ---------- Заметим, что все правила для 80 порта будут отработаны до правила "1:1024" в соответствии с порядком создания RTN, поскольку анализатор создал первый заголовок цепи (в схемах выше - "chain header", - пр.пер.) для 80 порта и "приклеил" его к списку правил,затем, в следующем правиле он видит, что требуется новый chain header и создает его. В этом случае вы интуитивно ожидаете получений сообщения "example" и вам кажется, что сообщения "Port 80 SYN!" появляться никогда не должно, но это неверно. 3.17 Как мне настроить stream4? Stream4 - новый препроцессор, который выполняет две функции: * Отслеживание TCP-соединений * Анализ потока TCP Марти создавал stream4, желая иметь более сильное средство анализа и защиты от атак, направленных непосредственно на snort (с пом. stick и snot), а также с целью обеспечения анализа для пользователей класса "enterprise",которым необходим одновременный анализ более 256 потоков. Марти оптимизировал код, для улучшения мощности препроцессора, его надежности и скорости. Проведенное тестирование убедило меня, что stream4 может поддерживать полный анализ для нескольких тысяч соединений и контроль до 64,000 сессий одновременно. Stream4 - большой и сложный кусок кода (почти 2000 строк), в котором есть много опций, связанных с конфигурацией, поэтому я пройдусь по ним здесь preprocessor stream4: [noinspect], [keepstats], [timeout ], [memcap] stream4_reassemble defaults: Reassemble client: ACTIVE Reassemble server: INACTIVE Reassemble ports: 21 23 25 53 80 143 110 111 513 Reassembly alerts: ACTIVE Есть новый ключ командной строки для связи со stream4: "-z". Если указан ключ -z Snort будет писать алерты (для TCP трафика) для установленных трехсторонним рукопожатием сессий, или при обнаружении двустороннего обмена (т.е. когда какой-либо трафик прошел в одну сторону и в ответ отправителю вернулось нечто, отличающееся от RST или FIN). С ключем "-z" Snort полностью игнорирует TCP-атаки stick/snot. 3.18 Где получить новые/измененные правила? Как мне их подключить? Новые правила можно скачать с CVS или с http://www.snort.org. Есть список рассылки на Sourceforge, посвященный snort-правилам, называется "snort-sigs". Вот некоторые скрипты/программы для работы с правилами: * oinkmaster: Простой скрипт на Perl для обновления правил http://www.algonet.se/~nitzer/oinkmaster/ * IDS Policy Manager: Это win32 приложение, обновляющее и загружающее правила через scp. http://www.activeworx.com/idspm * snortpp: программа, объединяющая несколько файлов в один мастер-файл, отсортированный по SID. http://dragos.com/snortpp.tgz Скрипт, который также может быть полезным: * []#!/bin/sh ########################################################################### #### # # Das Skript zum Herunterladen und installieren neuer IDS-Signaturen. # ########################################################################### #### MAILTO="admin@mydomain.de" MACHINE="machine1" #set -x SIGS_URL1="http://www.snort.org/dl/signatures/snortrules-stable.tar.gz" MD5_URL1="http://www.snort.org/dl/signatures/snortrules-stable.tar.gz.md5" WGET="/usr/bin/wget" #WGET_PARAMS="-N" WGET_PARAMS="-t 3 -T 5 -N -a /etc/snort/snort.log -P /etc/snort" # Wget parameters: # # -t : Retries (here 3) # -N : Get the file only if newer # -a : Append the log messages to the specified file # -P : Save the file to the specified directory # -T : Timeout ECHO="/bin/echo" TAR="/bin/tar" KILL="/bin/kill" PIDOF="/sbin/pidof" SNORT="/usr/local/bin/snort" SNORTUSER="snort" SNORTGROUP="snort" KILLSIG="SIGUSR1" SERVICE="/sbin/service" # Where is the Snort configuration dir: RULESPATH="/etc/snort/snortrules" SNORTCFGPATH="/etc/snort" MD5SUM="/usr/bin/md5sum" MD5SUM_PARAMS="" # The list of sensor interfacec divided by blanks IFACES="eth0" ########################################################################### #### # F U N C T I O N S # ########################################################################### #### ########################################################################### #### # Die Funktion, die Snort fuer alle def. Interfaces auf dem System startet # # # # Um sie zu erweitern muss man zwei Dinge tun: # # 1. Die Parameterliste von Interfaces erweitern # # 2. Das Konfigurationsfile unter /etc/snort/ snort.conf_ethX anlegen # # # ########################################################################### #### restartsnort() { # Restarting Snort for all interfaces for i in $IFACES; do "$ECHO" "Setting up Snort for interface "$i"" $ECHO "Restarting Snort..." #/usr/bin/killall snort if [ -f /var/run/snort_"$i".pid ] then PID=$("$PIDOF" "$SNORT") if [ -z "$PID" ] then "$SERVICE" snort restart else #`cat /var/run/snort_"$i".pid` "$ECHO" "Restarting Snort running with PID "$PID" and reloading the rules..." "$KILL" -s "$KILLSIG" "$PID" fi else "$ECHO" "No PID file for interface "$i" found under /var/ run" fi "$ECHO" "Starting Snort" "$SNORT" -a -b -c "$SNORTCFGPATH""/snort.conf_""$i" -I -D -v -i $i -u "$SNORTUSER" -g "$SNORTGROUP" PID=`cat /var/run/snort_"$i".pid` "$ECHO" "Snort running now with PID "$PID"" done } ########################################################################### #### # Die Funktion zum ueberpruefen, ob und wie Snort auf dem System laeuft # ########################################################################### #### checksnort() { SNORTS=$("$PIDOF" "$SNORT" | wc -w | awk '{print $1}') SNORT_PIDS=$(/usr/bin/find /var/run -name snort\_eth[0-9]\.pid -ls | wc -l | awk '{print $1}') "$ECHO" "Snort instances counted: $SNORTS" "$ECHO" "Snort PID files found: $SNORT_PIDS" # 1. Fall: Snort laeuft nicht oder PID-File nicht da: if [ "$SNORTS" = "0" -o "$SNORT_PIDS" = "0" ] then "$ECHO" "Snort seems to be down or no PID file there..." "$ECHO" "Restarting Snort for all Interfaces..." "$SERVICE" snort restart fi # 2. Fall: Anzahl der Instanzen ungleich der Anzahl der PID-Files if [ "$SNORTS" -gt "$SNORT_PIDS" ] then "$ECHO" "More Snort instances than found PID files..." "$ECHO" "Something is wrong outthere..." "$ECHO" "Stopping all Snort processes..." # /usr/bin/killall -9 snort "$SERVICE" snort stop "$ECHO" "Hold on... Restarting Snort now..." "$SERVICE" snort restart fi # 3. Fall: Anzahl der Instanzen stimmt mit der Anzahl der PID-files ueberein } ########################################################################### #### ########################################################################### #### getrules() { # Get the rules, since we know that they are newer... $WGET $WGET_PARAMS $SIGS_URL1 $WGET $WGET_PARAMS $MD5_URL1 "$ECHO" "Readout the checksum..." # MD5-Summe auslesen if [ -f /etc/snort/snortrules-stable.tar.gz.md5 ] then MD5SUM1=`grep MD5 \ /etc/snort/snortrules-stable.tar.gz.md5|awk '{print $4}'` else "$ECHO" "Error! No MD5-file found" exit 1 fi "$ECHO" "Generating our own checksum..." # MD5-Summe bilden if [ -f /etc/snort/snortrules-stable.tar.gz ] then MD5SUM2=`md5sum /etc/snort/snortrules-stable.tar.gz|awk '{print $1}'` else "$ECHO" "Error! No rules file found" exit 1 fi if [ "$MD5SUM1" = "$MD5SUM2" ] then "$ECHO" "The MD5-Checksum fits!" "$ECHO" "$MD5SUM1" "$ECHO" "$MD5SUM2" "$ECHO" "$MD5SUM1" >> /etc/snort/snort.log "$ECHO" "$MD5SUM2" >> /etc/snort/snort.log "$ECHO" "Proceeding..." # /bin/sleep 1 else "$ECHO" "Error! Wrong checksum! Aborting!" "$ECHO" "Install rules manually!" "$ECHO" "$MD5SUM1" >> /etc/snort/snort.log "$ECHO" "$MD5SUM2" >> /etc/snort/snort.log exit 1 fi # Extract the new rules if [ -f "/etc/snort/snortrules-stable.tar.gz" ] then "$ECHO" "Extracting Snort rules..." "$TAR" -xzvf /etc/snort/snortrules-stable.tar.gz -C /etc/snort else "$ECHO" "Lost the file! Something is wrong!" "$ECHO" "Aborting!!" exit 1 fi # Deleting old rules # Existiert das Verzeichnis ueberhaupt? if [ -d "$RULESPATH" ] then # /bin/rm "$RULESPATH"/*.rules /bin/mv -f /etc/snort/rules/*.rules "$RULESPATH" /bin/cp -f /etc/snort/rules/classification.config "$SNORTCFGPATH" else "$ECHO" "Missing rules-directory!" "$ECHO" "Aborting!" exit 1 fi # Cleaning up... /bin/rm -rf /etc/snort/rules # Give everything to root /bin/chown root:root ${RULESPATH}/* } ########################################################################### #### # M A I N # ########################################################################### #### # Error handling first FCHK=$(/usr/bin/wget -spider -N -t 3 -T 5 "$SIGS_URL1" -P /etc/snort 2>&1) ERR_MSG=$("$ECHO" "$FCHK" | egrep -oi "failed error") # Log the error message explicitly "$ECHO" "$FCHK" >> /etc/snort/snort.log # If there is a word "failed" or "error" we break.. if [ "$("$ECHO" "$FCHK"| grep -i "failed")" ] || \ [ "$("$ECHO" "$FCHK"| grep -i "error")" ] then "$ECHO" "Error getting the files. The server seems to be not available." "$ECHO" "Error message:" "$ECHO" "$FCHK" "$ECHO" "Aborting!" exit 0 fi "$ECHO" "Checking/getting files..." # First extract the wget message FCHK=$(/usr/bin/wget -spider -N -t 3 -T 5 "$SIGS_URL1" \ -P /etc/snort 2>&1 | grep "not retrieving") /bin/date >> /etc/snort/snort.log "$ECHO" "Wget-output:" "$ECHO" $FCHK # Logging what we've done and when "$ECHO" "$FCHK" >> /etc/snort/snort.log if [ -z "$FCHK" ] then "$ECHO" "The files on the server seem to be newer." "$ECHO" "We will get them now..." getrules # Reload rules "$SERVICE" snort reload # restartsnort else # "$ECHO" "The signature files on the server are older or not newer." "$ECHO" "Doing nothing for now..." "$ECHO" "Checking if Snort is running...." checksnort exit 0 fi # Send Email "$ECHO" -e "`ls -lA "$RULESPATH"`\n\nSnort running with PID $("$PIDOF"\ "$SNORT")" | mail -s "Reloaded Snort signatures on $MACHINE"\ "$MAILTO" ########################################################################### #### ########################################################################### #### exit 0 #EOF 3.19 Как получить последнюю версию snort с cvs? Репозиторий CVS проекта на SourceForge можно проверить, следуя инструкциям: Модуль, который вас интересует, должен быть указан в поле "modulename". После приглашения ввести пароль для анонимного пользователя, просто нажмите "Enter" cvs -d:pserver:anonymous@cvs.snort.sourceforge.net:/cvsroot/snort login cvs -z3 -d:pserver:anonymous@cvs.snort.sourceforge.net:/cvsroot/snort co snort При обновлении из конкретной директории не требуется параметр -d. 3.29 Как я могу использовать удаленный syslog? Добавляйте ключ -s, и вставьте в syslog.conf строку: auth.alert @managmentserverIP Подробнее о Facility and Priority смотрите файл snort.conf. Убедиитесь, что syslog-сервер сконфигурирован корректно для получения логов по UDP. В RedHat, вы можете поправить файл /etc/sysconfig/syslog, добавив следующую строку: SYSLOGD_OPTIONS="-r -m 0" С этими опциями syslogd не будет писать временные метки (опция -m 0) и будет принимать сетевые подключения. Затем перепустите syslogd, для дополнительной информации - "man syslogd". Дополнительно может посмотреть syslog-ng^[*]. Пример запуска snort: /usr/local/bin/snort -c /etc/snort/snort.conf -I -A full -s 192.168.0.2:514 -i rl0 Замечание для пользователей Win32: Frank Knobbe написал патч для Snort, позволяющий использовать '-s ' в командной строке Windows, т.е. snort будет использовать настройки из snort.conf, и дополнительно посылать алерты на syslog-сервер, указанный в поле . Патч можно найти на http://www.snort.org/dl/contrib/patches/win32syslog/ 3.21 Как мне заставить заботать этот стеганый ACID? Внимательно читайте всю документацию для каждого пакета (хм.. успехов, ребята!) Заставить работать ACID - серьезная задача, т.к. используется много пакетов (packages). Вам нужны работающие Apache, PHP, GD (и к нему кучу библиотек), ADODB, Phplot. Это изрядное количество настроек. Типичная последовательность для Solaris 8: Некоторые пакеты берите с сайта sunfreeware.com, основные проблемы будут с библиотеками PHP и GD. GD сам по себе требует целый букет установленных пакетов (packages) и библиотек, а точнее: libpng, libjpeg (если нужен jpeg), и т.д , и т.д... Читайте readme для GD. Таким образом, вам нужно все это установить, скомпилировать или брать уже скомпилированные продукты. Сложнее всего - правильно скомпилировать PHP. PHP нужно компилировать с кучей флагов "-with" для корректной работы GD, в противном случае получим кучу "ссылочных" (unresolved reference) ошибок во время работы. Просто ипользование флага "with" для GD недостаточно, также необходимы "with" для каждой из используемых пакетом GD библиотек, иначе PHP не сможет найти нужную ему функцию. Ниже приведена строка "configure",которую вы можете использовать перед компиляцией PHP: ./configure --with-mysql --with-apxs=/usr/apache/bin/apxs --with-gd --enable-sockets --with-jpeg-dir=/usr/local/lib --with-png-dir=/usr/local/ lib --with-zlib-dir=/usr/local/lib --with-xpm-dir=/usr/local/lib Эти ключи 'with' имеют следующий эффект: включаются опции -L и -R для каждой библиотеки, таким образом, линковщики смогут найти все функции в окружении модуля Apache. Похоже, Apache не интересуется переменной LD_LIBRARY_PATH во время работы модуля (или PHP не интересуется, или есть какой-то пункт меню в конфигурационных файлах Apache, НО: вы просто можете использовать эти "with"). Вообще говоря, вы должны проработать все "снизу вверх", т.е. получить или скомпилировать все библиотеки, необходимые для GD и установить их, а также установить все библиотеки/пакеты им нужные. После корректно установленной GD, компилируйте PHP. Затем создайте php-скрипт, который вызывает phpinfo() (требуется для инсталляции ACID ) и осторожно протестировать создание страницы. Если PHP заработал, вы создали "фундамент" для остального софта. Инсталлируйте PHplot и прогоните несколько тестов. Если они прошли успешно, инсталлируйте ADODB and ACID, поправьте конфиги и все должно заработать (хе-хе :) Также убедитесь, что вы прочитали ACID FAQ на веб-сайте, где есть некоторые моменты, отсутствующие в ACID install guide. Например - включение опции PHP "register_globals" в файле php.ini file (по-умолчанию - отключенной). ACID FAQ: http://www.andrew.cmu.edu/~rdanyliw/snort/acid_faq.html 4 Правила и алерты 4.1 Ошибки загрузки файлов с правилами (rules files) Некоторые наиболее частые: * ERROR telnet.rules:YYY => Port value missing in rule! * ERROR telnet.rules:YYY => Bad port number: "(msg:"blah" * ERROR telnet.rules:YYY => Couldn't resolve hostname blah Что происходит? ``telnet.rules'' - файл, в котором есть синтаксическая ошибка и ``YYY'' - номер строки с ошибкой. Пара возможных ошибок: 1. В правиле отсутствует значение порта, неверно указан номер порта, или неправильное имя хоста, в этом случае необходимо уведомить автора/ мантейнера данного правила. 2. Гораздо чаще в правиле все ОК, но переменная в нем не объявлена. Откройте файл с правилом на нужной строке и убедитесь, что переменные были объявлены. Дополнительно о переменных вы можете прочитать на: http://www.snort.org/docs/writing_rules/chap2.html#tth_sEc2.1.2 4.2 snort говорит "Rule IP addr ("1.1.1.1") didn't x-late", что за хрень? IP-адрес заключен в кавычки, избавьтесь от них и попробуйте снова. 4.3 Snort стоит за файрволом и отвратительно молчит... Ваш файрвол также блокирует трафик, идущий на snort. Заметьте: Все будет не так, если вы установите snort _НА_ файрвольную машину. 4.4 Видит ли snort пакеты, фильтруемые IPTables/IPChains/IPF/PF? Snort работает используя libpcap. Вообще говоря, он видит все, что видит драйвер сетевой карты до получения данных сетевым стеком. Linux IPTables, Linux IPChains , BSD PF и IPF и другие фильтры пакетов не мешают snort-у видеть пакеты, идущие по сетевому кабелю. Даже если входящий пакет запрещен на фильтре, snort все равно его увидит и проанализирует, если snort слушает этот интерфейс. Snort/pcap видит все, что приходит или уходит через сетевой адаптер. Заметьте, что snort подвержен тому же ограничению, что и поток данных в сетевом кабеле. Таким образом, snort не увидит исходящие пакеты, заблокированные фильтрами в процессе передачи, т.к. они никогда не достигают сетевого адаптера. Под OpenBSD вы можете обрабатывать PF rejects используя /dev/pflogN. 4.5 Я получаю тонны <некоторых алертов>. Что мне делать? Где мне об этом узнать побольше? Некоторые правила более склонны к генерации ложных алертов чем остальные. В разных сетях по-разному. Сначала вы должны определить, действительно ли это ложные срабатывания. Некоторые правила связаны с определенными ID-номерами. Ниже приведены несколько систем, где вы можете найти дополнительную информацию о конкретном алерте. +------------------------------------------------------------------------------- --------+| System | Example | URL ||---------+---------------+---------------------------------------------------- ---------|| IDS | IDS182 | http://www.whitehats.com/IDS/182 ||---------+---------------+---------------------------------------------------- ---------|| CVE | CVE-2000-0138 | http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2000-0138 ||---------+---------------+---------------------------------------------------- ---------|| Bugtraq | BugtraqID 1 | http://www.securityfocus.com/vdb/bottom.html?vid=1 ||---------+---------------+---------------------------------------------------- ---------|| McAfee | Mcafee 10225 | http://vil.nai.com/vil/dispVirus.asp?virus_k=10225 ||---------+---------------+---------------------------------------------------- ---------|| Nessus | Nessus 11073 | http://cgi.nessus.org/plugins/dump.php3?id=11073 |+------------------------------------------------------------------------------ ---------+Может быть необходимым проверить содержимое пакета, если был ложный алерт.Содержимое пакетов пишется при использовании ключа -d. Если вы определили, чтоимел место ложный алерт, вы можете написать правило игнорирования пакетов сопределенных машин, которые генерируют тучу ложных алертов. Если правилогенерирует громадное количество ложных алертов от нескольких разных машин, вы можете исключить это правило. Это решение - в крайнем случае.4.6 Так что насчет всех этих ложных алертов?Большинство думает, что масса ложных срабатываний всегда предпочтительна. Затемони отключают нежелательные правила. Обратная ситуация - малое количество правилможет заставить людей удовлетворенно думать, что snort "делает свое дело" и нео чем беспокоиться.4.7 Что это за ICMP-файлы в поддиректориях /var/log/snort? Большинство из них - "destination unreachable" и "port unreachable", зафиксированные snort-ом при сбоях устновления сессий. 4.8 Почему программа генерирует алерты на те пакеты, для которых есть пропускающие правила? По-умолчанию, порядок работы правил таков: алерты, затем пропускающие, затем записывающие. Такой порядок работы обеспечивает отсутствие ситуации, когда 50 великолепных алерт-правил неожиданно игнорируются неудачным пропускающим правилом. Если вы действительно хотите изменить этот порядок и обрабатывать пропускающие правила в начале, используйте ключ "- о" в командной строке или директиву ``order'' в snort.conf . Еще одна полезная вещь, которую стоит помнить: алерты могут генерироваться препроцессором. В данном случае никакое пропускающее правило не поможет вам минимизировать количество ложных алертов, вам придется использовать фильтр BPF. 4.9 Что за алерт "ICMP destination unreachable" ? ICMP - акроним Internet Control Message Protocol. Это сообщения о неудачных соединениях. Пакет ICMP "unreachable" содержит 64 бита (8 байт) или более датаграммы исходного пакета и заголовок исходного IP пакета. ICMP "Destination Unreachable" (3 тип сообщения) отсылается обратно отправителю,в том случае, если IP пакет не может быть доставлен получателю. ICMP код указывает, почему пакет не был доставлен: * 0 - net unreachable (сеть недоступна) * 1 - host unreachable (хост недоступен) * 2 - protocol unreachable (протокол недоступен) * 3 - port unreachable (порт недоступен) * 4 - fragmentation needed and DF bit set (необходима фрагментация, но установлен флаг запрета фрагментации) * 5 - source route failed (установлен флаг, указывающий, что пакеты должны возвращаться по тому же маршруту, по которому они идут до получателя, но по каким-либо причинам это сделать нельзя) As far as why... "it all depends..." Ошибки "ICMP Unreachable" делятся на две группы: 1. Ошибки "ICMP Unreachable" от маршрутизаторов (все 16) 2. Ошибки "ICMP Unreachable" от хостов (только 2) Почему от хостов только две? * ICMP Port Unreachable - порт получателя недоступен (не в открытом режиме) * ICMP Protocol Unreachable - протокол, который мы пытаемся использовать, не используется на хосте-получателе. И поле типа и поле кода ICMP указывают на причину недоставки пакета. Некоторые из snort-овских ICMP алертов информационные, например в icmp-info.rules . В настоящее время они не имеют своих ID и даже неклассифицированы. Другие правила могут быть ассоциированы с внешней активностью. Например, в файле icmp.rules вы найдете: alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:"ICMP ISS Pinger"; content:"|495353504e475251|";itype:8;depth:32; reference:arachnids,158; classtype:attempted-recon; sid:465; rev:1;) Ключ "reference" говорит о том, что есть дополнительная информация, найти ее можно по ключевому слову "arachnids". Классификация (ключ "classtype") может указывать на важность события. Когда на получателе UDP порт закрыт, получатель генерирует ответное ICMP сообщение "Port unreachable" и отсылает его отправителю. Некоторые пограммы используют эти сообщения, например, traceroute на *nix-машинах. Windows-машины (tracert) по-умолчанию отвечают на ICMP запросы "Echo". Для более подробной информации: * IP - ftp://ftp.isi.edu/in-notes/rfc791.txt * ICMP - ftp://ftp.isi.edu/in-notes/rfc792.txt * TCP - ftp://ftp.isi.edu/in-notes/rfc793.txt * UDP - ftp://ftp.isi.edu/in-notes/rfc768.txt и http://www.iana.org/assignments/icmp-parameters Вообще говоря, данный URL неплохо держать под рукой: http://www.iana.org/ Еще оин неплохой документ по ICMP: http://www.sys-security.com/ 4.10 Почему многие из правил snort содержат установленные флаги P (TCP PuSH) и A (TCP ACK)? Одна из причин наличия флагов PA - минимизирование ложных срабатываний. Вы получите алерты только для установленных соединений. Если вы хотите видеть все запросы, вам придется либо переписывать сигнатуры, добавлять свои собственные, или смотреть логи файрвола. 4.11 Snort говорит BACKDOOR SIGNATURE... На моей машине троян? Если у вас есть все содержимое пакета, простмотрите его. Эти правила отличаются высоким процентом ложного срабатывания, поскольку большинство основывается просто на номерах портов. 4.12 Что такое "CGI Null Byte attacks"? Это часть препроцессора http. Процедура анализа http находит "%00" в http- запросе, получаем алерт. Иногда ложные срабатывания вы можете увидеть при работе с сайтами, использующими cookies, в которых хранятся закодированные URL, или вы сканируете 443 порт и поднимаете зашифрованный SSL трафик. Если вы пишете содержимое пакетов, вызвавших алерт, вы можете проверить строчку, являвшуюся причиной алерта. Та же ситуация с unicode+cookie+SSL. Единственный способ проверить была ли атака - просматривать полный дамп пакета, и это верно для любого алерта, основанного на анализе контента. 4.13 Почему в отдельных алертах в ACID присутствуют IP "unknown" Плагин для работы с БД записывает информацию в базу только после срабатывания правила и генерации алерта. Таким образом, т.к. алерты генерируются и препроцессорами (portscan, mini-fragment), не привязанными к конкретным правилам , пишется только сообщение об имевшем место событии без информации об IP адресах. Как следствие, ACID не может отобразить информации пакетного уровня (IP адреса) для данных алертов. Для таких особенных алертов нельзя отобразить какой-либо один IP адрес, поэтому пишется "unknown" и никакой информации о содержимом пакетов. 4.14 Можно ли присваивать приоритеты для алертов используя ACID? Коротко - нет. ACID зависит от БД и т.к. snort не назначает приоритетов, ACID не влладеет приоритетами. Тем не менее, есть некоторые возможности: * Писать алерты разных приоритетов в разные базы, например критичные алерты (переполнения буфера и т.п.) - в одну базу, алерты сканирования - в другую. затем запустить две версии ACID, каждую настроив на определенную базу. * Самостоятельно изменять Alert Groups (AG) c присвоением приоритетов. Данная стратегия влечет создание AG для каждого уровня критичности и ручного перетаскивания алертов в соответствующую группу. 4.15 Что это за алерты 'SMB Name Wildcard'? IDS177 http://dev.whitehats.com/cgi/test/new.pl/Show?_id=netbios-name-query Описывает трафик, идущий снаружи в вашу ЛВС. Разрешать работу netbios через публичные сети очень небезопасно. Если используемое вами правило настроено только на входящий трафик, тогда это объясняет, почему вы не видите много сообщений о ложный срабатываниях. Для любого читающего данный текст и получающего много ложных срабатываний : если вы измените правило и вместо исходящих адресов (переменная $HOME или какая-либо иная, обозначающая ваш LAN) поставите !$HOME тогда вы увидите, что большая часть ложных срабатываний испарилась. Значение этой проверки в том, что был запрошен доступ к административным ресурсам C$ ADMIN$ и т.п. Это не есть нормальный режим работы, т.к. если люди хотят расшарить ресурсы, они должны сознательно определить имя ресурса и назначить права доступа к нему. 4.16 Что такое SYNFIN сканирование? SYNFIN сканирование названо из-за установленных в пакете флагов SYN и FIN. 4.17 У меня слишком много ложных сообщений "IIS Unicode attack detected" и/или "CGI Null Byte attack detected". Как мне выключить эти сигнатуры? Такие сообщения продуцирует препроцессор http_decode. Если вы хотите исключить данные сообщения, добавьте в опции запуска препроцессора http_decode ключи "-unicode" или "-cginull": preprocessor http_decode: 80 8080 -unicode -cginull Ваши внутренние пользователи при обычной работе также могут вызывать подобные сообщения. Работа браузера Netscape иногда является причиной данных алертов. Вместо отключения соответствующих проверок лучше попробовать использовать фильтр BPF для игнорирования исходящего HTTP-трафика: snort -d -A fast -c snort.conf not (src net xxx.xxx and dst port 80) У нас это отлично работало в течение 5-6 месяцев и snort продолжал определять весьма опасные атаки на веб-сервера типа "cgi null" и "unicode". 4.18 Как мне протестировать работу алертов и журналов snort. Попробуйте данное правило, оно заставит snort постоянно визжать, как потерпевший: alert tcp any any -> any any (msg:"TCP traffic";) Также гляньте на проект sneeze: http://snort.sourceforge.net/sneeze-1.0.tar Sneeze - генератор пакетов, который читает сигнатуры snort и создает на их основе псевдоатаки, заставляющие snort писать алерты. 4.19 В чем разница между ``Alerting'' and ``Logging''? У snort есть два основных способа вывода: logging и alerting. Способ "alerting" существует для уведомления вас о том, что произошло нечто интересное. Способ "logging" существует для записи содержимого пакета в требуемом формате (pcap, ascii, database, etc). Функциональность "alert" делает две вещи: когда событие зафиксировано, оно записывается с использованием способа вывода "alert" и одновременно записывается столько данных, сколько возможно/желаемо способом "logging". Функциональность "log" записывает текущий пакет способом "logging" без генерации алерта.Так сделано для того, чтобы была возможность записывать, к примеру, telnet-сессии без генерации алерта на каждый пакет. Плагин "database" - есть нечто аномальное, поскольку он не делает большой разницы между двумя функциональностями (способами вывода snort). Опция "log" влечет использование способа "logging", опция "alert" - способа "alerting". На практике это означает следующее: если db плагин запущен в режиме "alert", плагин получает сообщения только от alert-правил, а когда в он режиме "log", то получает сообщения и от alert- и от log-правил. 4.20 Как используются ключевые слова в правилах (с помощью логических операций OR или AND)? Из секции 2.1 Snort Manual: Чтобы правило сработало, все элементы правила должны быть истинными. Объединенные элементы должны составлять логическое выражение "AND". В то же время, различные правила из библиотеки правил snort могут составлять большое логическое выражение "OR". 4.21 Может ли snort работать с правилами, основанными на MAC-адресах? Не совсем. Snort записывает MAC-адреса и другую информацию 2го уровня. Препроцессор arpwatch может отслеживать манипуляции с изменениями MAC-адресов. Но средств для реагирования на правила, основанные на информации из 2го уровня пока нет. Анализ содержимого пакета начинается с данных третьего уровня. 4.22 Как мне деактивировать правило? Правила могут загружаться из файла, указанного в snort.conf, который указывает snort-у путь к нужному файлу, и snort загружает этот файл во время инициализации Правила также можно включать прямо в snort.conf . Если вы хотите отключить одно конкретное правило, вы может использовать один из следующих способов: 1. Удалить правило и перестартовать Snort. 2. В начале строки поставьте "#" /закомментируйте правило/ и перестартуйте snort 3. Напишите пропускающее правило с теми же характеристиками в local.rules (или еще где-либо) и перестартуйте snort с опцией -o 4.23 Как мне определить переменную, исключив некоторые адреса? Используйте оператор "!". var EXTERNAL_NET !$HOME_NET Заметьте, что оператор отрицания не работает внутри списка, таким образом оператор "!" в приведенном ниже примере не заработает: var EXTERNAL_NET [!192.168.40.0/24,!10.14.0.0/16] а вот это заработает: var EXTERNAL_NET ![192.168.40.0/24,10.14.0.0/16] 4.24 После добавления/удаления новых правил как мне перепустить snort? Обычно прекрасно работает kill -HUP. НО: если ваш snort работает в chroot-режиме, это сработает не так, как ожидаешь (см. FAQ 6.19). В случае использования chroot необходимо убить процесс и запустить заново. 4.25 Как работают ключевые слова "distance" и "within"? Ключевое слово "distance" означает относительное смещение от конца предыдущего совпадения. Вы также можете использовать новое ключевое слово "within" для ограничения расстояния, на котором snort будет продолжать анализ. 4.26 Как мне задать список портов в правиле? Пока никак. Вы можете задать промежуток портов между портом X и Y, указав X:Y Для более подробной информации смотрите users manual^[*]. 4.27 Как мне защитить веб-сервера, работающие на портах, отличных от 80? Это возможно... С помощью костылей, но работать будет. Новые правила ипользуют переменную $HTTP_PORTS, которую вы можете изменить и перестартовать snort. Например: var HTTP_PORTS 80 include web.rules var HTTP_PORTS 8080 include web.rules 4.28 Как мне избавиться от алертов "spp:possible EVASIVE RST detection"? За отключение отвечает аргумент ``disable_evasion_alerts'' в конфигурации stream4 в файле snort.conf. 4.29 Есть ли номера SID для частного использования, чтобы мои правила не конфликтовали с существующими? Да, начиная с SID = 1000000. 4.30 Насколько длинными могут быть переменные, правила и списки адресов? Ограничение - 8K _ПОСЛЕ_ анализа. На практике это не самое главное ограничение. 5 Украшаем и вешаем рюшечки. 5.1 Я слышал о ``Barnyard''. Что это? Barnyard - система вывода для snort. snort пишет в специальном двоичном формате ``unified''. Barnyard читает этот файл и пересылает данные в БД. В отличие от плагина database, Barnyard отслеживает сбои при посылке алертов в БД и перестает посылать их в случае сбоя. Также Barnyard следит за моментом, когда БД опять сможет принимать соединения и начинает их посылать снова. 5.2 Как мне обработать логи snort и сделать из них отчеты? 1. Можно использовать Barnyard 5.1 для обработки файлов в формате unified и экспорта в некоторые форматы, включая вывод в базу данных (БД) для последующего анализа. 2. SnortSnarf - инструмент для создания HTML из логов http://www.silicondefense.com/snortsnarf/ 3. Если вы хотите настроить вывод в БД, вы можете почитать документацию по возможностям ACID http://www.cert.org/kb/acid/ 4. Вы можете работать с файлами в unified-формате без использования баз данных с помощью Cerebus: http://dragos.com/cerebus/ 5. Гуевые фронт-енды для простого просмотра логов: + HenWen (OSX) http://homepage.mac.com/nickzman http://home.attbi.com/~rickzman/software/HenWen1.0.sit.bin + IDS Center (Win32) http://www.packx.net/ + Puresecure (UNIX and Win32)-Прежде известном как demarc. http://www.demarc.com/downloads/puresecure/ + SnortCenter (UNIX and Win32) http://users.pandora.be/larc/ + IDS Policy Manager (Win32) http://www.activeworx.com/IDSPM/ 5.3 Как мне заставить snort писать в несколько БД или в несколько разных плагинов? Дважды прогоняйте unified-файлы через barnyard в разные БД или... Вы можете сделать это, используя несколько плагинов, например: output log_database: mysql, dbname=snort host=localhost user=xyz output log_database: mysql, dbname=snort host=remote.loghost.com user=xyz Удаленная БД и локальный tcpdump: output log_database: mysql, dbname=snort host=remote.loghost.com user=xyz output log_tcpdump: /var/log/snort.tcpdump Затем вы сможете прогнать файл tcpdump повторно через snort для заполнения БД ГРАБЛИ: просто прогон файла может не повлечь срабатывания некоторых алертов, зависящих от текущего состояния препроцессоров. 5.4 Как мне протестировать snort, если у меня нет сетевой карты или подключения к ЛВС? Я использую роутинг между двумя dummy-девайсами: modprobe -a dummy # (dummy-девайс нужно создавать ядром) ifconfig dummy0 192.168.0.1 ifconfig dummy0:0 192.168.0.2 telnet 192.168.0.3 12345 (Прим. переводчика: ессно, ваше ядро должно быть сомпилировано с поддержкой dummy) Важно, чтобы IP, на который вы пытаетесь зайти telnet-ом не был бы одним из адресов ваших интерфейсов. Используйте возможность snort слушать в promisc- режиме целые сети (HOME_NET=192.168.0.0/16). 5.5 Как стартануть snort под win32 в режиме сервиса? 1. Необходимо прописывать _ПОЛНЫЕ_ПУТИ_ для _ВСЕГО_. Пример: НЕПРАВИЛЬНО: include scan-lib ПРАВИЛЬНО: include C:\snort\scan-lib Все параметры в командной строке также должны содержать полный путь: НЕПРАВИЛЬНО: snort.exe -l ./log ПРАВИЛЬНО: snort.exe -l C:\snort\log 2. ВЫ ДОЛЖНЫ УСТАНАВЛИВАТЬ ДИРЕКТОРИЮ ДЛЯ ЛОГОВ ЧЕРЕЗ КОМАНЖДНУЮ СТРОКУ (ключ -l). Если вы не установите значение директории для вывода логов, сервис не запустится, а также под NT/Win2k загрузка вашего компа будет тормозить минуты на 4. 3. Убедитесь, что все параметры командной строки запуска snort установлены корректно и snort работает так, как вы хотели (например - корректность генерации логов и алертов). Если вы не сможете заставить работать данную часть, не видать вам работающего snort в режиме сервиса, как своих ушей. 4. При удачной проверке пункта 3, измените параметры командной строки, добавив в нее дополнительно "/SERVICE /INSTALL". Например, если ваша строка запуска была: snort -i1 -lC:\snort\log -cC:\snort\snort.conf тогда она должна стать такой: snort /SERVICE /INSTALL -i1 -lC:\snort\ log -cC:\snort\snort.conf Проверьте правильность переданных параметров командой: snort /SERVICE /SHOW . 5. Запустите сервис snort командой net start snortsvc Заметьте, что версии 1.9 (build 228), 2.0 (build 50), или любые более свежие, в случае проблем запуска сервиса записывают сообщение об этом в event Log. Остановите сервис командой net stop snortsvc 6. Деинсталляция сервиса производится командой snort /SERVICE /UNINSTALL 5.6 Возможно ли с помощью snort изменять/добавлять правила используемого файрвола (ipfilter/ipfw)? Да, с помощью дополнительного софта в директории contrib. Но это опасно и не рекомендуется никому, кроме тех, кто понимает ЧТО он делает. * SnortSam http://www.snortsam.net * inline-snort : http://www.snort.org/dl/contrib/patches/snort-inline * Guardian - перловый скрипт, который использует snort для отлова атак и затем защищается от их продолжения с помощью IPchains: http://www.chaotic.org/~astevens/Guardian/index.html, или на зеркале: http://www.cyberwizards.com/~midnite/Guardian/index.html Но - грабельки... исполнение внешних программ может стать причиной падения производительности и вам стоит прочитать предостережение ниже: CHRISTOPHER CRAMER писал: Я уверен, этот вопрос уже обсуждался в различных дисукуссиях, но данная идея мне кажется _очень_ плохой. Допустим, плохие парни поймут, как все работает и начнут использовать твой метод блокировки трафика в качестве основы для своей DOS-атаки. Для чего необходима всего лишь посылка серий определенных пакетов, на которые среагирует snort, с подмененными адресами отправителя. Так как мне более не интересно ломать твой сайт, скорее хочется превратить твою жизнь в ад, поэтому мне по барабану, куда пойдет обратный трафик. Все, что мне нужно сделать - посылать пакеты с исходящими IP из списка адресов, и с этими адресами ты не сможешь работать в дальнейшем. Придя на следующее утро, ты обнаружишь, что доступ в мир тебе закрыт. Мой вклад в размере $0.02. Will Robinson: Здравый смысл говорит, что автоблокирование опасно. Как бы ни было, для тех, кто любит жить на острие новых технологий (раздельные процессы сканирования логов и манипулирование командами файрвола - необычный выбор): Обязательно запомните, что необходимо создать список исключения для важных серверов (для вас и ваших пользователей), чтобы босс не вызывал вас из отпуска, проводимого на Карибах после того, как он не смог попасть на любимый сайт... 5.7 Каков лучший способ для блокировки трафика с помощью snort? snort-inline > hogwash >> SnortSAM|Guardian >> flexresp 5.8 Snort ругается о ключевом слове "react"... Перекомпилируйте snort с ключом -enable-flexresp и переустановите (см. 3.21). 5.9 Как мне заставить snort посылать мне e-mail с алертами? Никак. Такой процесс слишком замедлит работу snort. Вы можете писать в syslog и использовать swatch или logcheck для анализа логов. Почитайте доки по logsurfer, возможно, они помогут вам определиться: http://www.obfuscation.org/emf/logsurfer/snort.txt JASON HAAR представил пример конфига Swatch (3.1beta), позволяющего получать e-mail c алертами: http://www.theadamsfamily.net/~erek/snort/snort-swatch.conf.txt Доки swatch: * http://www.oit.ucsb.edu/~eta/swatch/ * http://www.stanford.edu/~atkins/swatch * http://rr.sans.org/sysadmin/swatch.php * http://www.enteract.com/~lspitz/swatch.html * http://www.cert.org/security-improvement/implementations/i042.01.html IDS Center (FAQ 5) на Win32 также шлет алерты по e-mail. 5.10 Как мне записать определенный тип трафика и одновременно послать алерт в syslog? Пример (в snort.conf): ruletype redalert { type alert output alert_syslog: LOG_LOCAL2 output database: alert, postgresql, user=user dbname=snort password=pwd } Проверьте local.rules на предмет наличия чего-либо похожего на: redalert tcp any any -> any any (msg:"REDRUM REDRUM"; content:"redalerttest") Затем просто зайдите telnet-ом и наберите 'redalerttest'. Presto - алерты и в базе и в syslog. 5.11 Может ли snort вызывать внешние программы при генерации алерта? Вызывать внешние программы из IDS, вообще говоря, плохая идея. Блокировка работы на время ожидания ответа от сомнительного приложения влечет за собой потерю проходящих пакетов. Вызов процесса в Windows очень накладен. Вам необходимо сохранить производительность IDS без потерь на вызов внешних приложений, причем в Windows вызов приложения более тяжеловесная задача, чем в *nix. Даже в случае использования независимого процесса вы обнаружите, что постоянно работающее приложение является гораздо предпочтительнее чего-либо "вызываемого время от времени в зависимости от сработавших алертов". Лучшая альтернатива - посмотреть swatch или logwatch. Особенно для новичков в UNIX : запись в syslog с использованием "tail -f /var/log/messages" может быть именно тем, что вы хотели. 5.12 Как мне затавить snort записывать http url или smtp-трафик? Это можно делать с помощью snort, но, возможно, более быстродействующим средством может быть mailsnarf и urlsnarf из пакета dsniff Dug Song'а . Dsniff доступен по адресу: http://www.monkey.org/~dsong/dsniff/ Для win32: http://www.datanerds.net/~mike/dsniff.html 5.13 Как мне переместить данные из snort db в snort_archive db, также, как это делает ACID? Используйте перловый скрипт snort_archdb.pl из директории contrib дистрибутива snort (snort_archdb-90a.tar.gz). 5.15 Что мне почитать для лучшего понимания логов, адресов и откуда пришли пакеты? * http://www.arin.org/ * http://www.caida.org/tools/utilities/netgeo/ * http://netgeo.caida.org/perl/netgeo.cgi * http://standards.ieee.org/regauth/oui/oui.txt * http://www.codito.de/manufactor_hash * http://coffer.com/mac_find/ * http://www.idefense.com/Intell/CI022702.html * http://www.idefense.com/excelfiles/All.zip И еще неплохо было бы покопаться в недрах инета самостоятельно. 5.15 Как мне понять этот трафик и анализировать алерты IDS? 1. Для начала вам необходимо понимать основы IP, TCP, и UDP, значение слов: адрес-пролучатель, адреса-отправитель, порт, что означают TCP SYN, FIN и RST. Некоторые основные знания об Интернете вам необходимы для успешной настройки мультиинтерфейсного маршрутизатора, хотя тонкости его синтаксиса вам не понадобятся. Некоторые полезные ссылки: + Действительно основы "intro to TCP/IP" http://pclt.cis.yale.edu/pclt/COMM/TCPIP.HTM + TCP/IP FAQ: http://www.itprc.com/tcpipfaq/default.htm + Основы файволов, DMZ's, и т.п. http://www.ibiblio.org/pub/Linux/ docs/HOWTO/other-formats/html_single/Firewall-HOWTO.html 2. Вы должны понимать основы работы сетевых атак. Рекомендую почитать "Smashing the Stack for fun and profit" от Aleph. Глубокое понимание необязательно, но ненапряжное прочтение поможет понять основы событий, происходящих при атаке и даст вам направление для дальнейшей работы. http://www.insecure.org/stf/smashstack.txt 3. Также неплохо глянуть какое-нибудь руководство по защите систем, например: http://www.openna.com/products/books/sol/solus.php http://www.seifried.org/lasg/ 4. Вам понадобится понимание основ интренет-сервисов, таких, как: DNS, HTTP, FTP, SMTP, и т.п. Информации о большинстве из них вы найдете по ссылкам, приведенным здесь. 5. Отличное описание шаблонов "странного" трафика, обычно наблюдаемого на шлюзах: http://www.robertgraham.com/pubs/firewall-seen.html 6. Также посмтрите секцию "Рекомендуется к прочтению" (FAQ 1.4) 5.16 Как мне более детально проверить записанные пакеты? Если вы записываете в формате "unified", можете использовать Barnyard (FAQ 5.1) или конвертер и формата unified в формат pcap, написанный Dragos: http://dragos.com/logtopcap.c Вы можете провести дополнительный анализ содержимого пакета, используя для обработки pcap-файлов следующие программы: * Tcpdump - http://www.tcpdump.org * Ethereal - http://www.ethereal.com 6 Проблемы 6.1 Мне кажется, я нашел баг в snort, че делать? Получите дополнительную диагностическую информацию и отправьте ее в "snort-users" на http://lists.sourceforge.net/lists/listinfo/snort-users Для получения диагностической информации скомпилируйте snort таким образом: * []make clean; make CFLAGS=-ggdb или * []make clean; make "CFLAGS=-ggdb -DDEBUG" отследите создание coredump: * []gdb /path/to/snort /path/to/snort/core gdb> where gdb> bt gdb> print \$varname, varname, \$\$varname etc.. Если corefile не сгенерировался, запустите snort таким образом: * []gdb snort gdb> run snort\_args\_go\_here Затем, когда он рухнет: * []gdb> where gdb> bt gdb> print \$varname, varname, \$\$varname etc.. 6.2 SMB-алерты не работают, что не так? Убедитесь, что при компиляции вы использовали опцию "-enable-smbalerts" при запуске "./configure". 6.3 Snort говорит "Garbage Packet with Null Pointer discarded!". Че за нах? Это старое внутреннее диагностическое сообщение, возникающее из-за старого бага в ранних версиях препроцессора дефрагментации. Обновите на свежую версию snort. 6.4 Snort говорит "Ran Out Of Space". Это внутреннее диагностическое сообщение, возникает, когда препроцессор дефрагментации вылезает за пределы 32 МБ. Сообщите об этом Dragos . 6.5 Во время длительных операций в ACID (например - удаление массы алертов из базы) соединение с БД отваливается по тайм-ауту. В PHP имеется внутренняя переменная для ограничения времени работы скрипта. Используется она для предотвращения работы бестолково написанного кода с бесконечным циклом. Чтобы изменить значение для таймаута, поправьте переменную 'max_execution_time' в конфигурационном файле 'php.ini'. 6.6 Почему ACID изменяет номер моего сенсора и как мне этот номер зафиксировать? В коде op_acid_db.c: * []/* if sensor id == 0, then we attempt attempt to determine it dynamically */ if(data-> sensor_id == 0) { data->sensor_id = AcidDbGetSensorId(data); } И AcidDbGetSensorId делает следующее: * []"SELECT sid FROM sensor WHERE hostname='%s' AND interface='%s' " "AND filter='%s' AND detail='%u' AND encoding='0'", pv.hostname, pv.interface, pv.filter, op_data->detail) Если получаем sensor, используем sensor_id, если нет, вставляем новый сенсор. Таким образом, чтобы значения не изменялись, не меняйте hostname / interface / filter и детали. 6.7 Почему snort говорит "Packet loss statistics are unavailable under Linux" (Статистика по потерянным пакетам недоступна в Linux)? Стек IP в Linux не сообщет статистики по потерянным пакетам. C версии ядра 2.4 и выше это исправлено с новой версией libpcap. Обновите ядро и libpcap и все заработает. 6.8 Директория /var/log/snort directory стала очень большой... Попробуйте данный скрипт для архивации файлов: * []#!/bin/sh # # Logfile rotation script for snort writen by jameso@elwood.net. # # This script is pretty basic. We start out by setting some vars. # Its job is tho rotate the days logfiles, e-mail you with what # it logged, keep one weeks worth of uncompressed logs, and also # keep compressed tgz files of all the logs. It is made to be run # at midnight everynight. This script expects you to have a base # dir that you keep all of your logs, rule sets etc in. You can # see what sub dirs it expects from looking at the var settings # below. # # Things to note in this script is that we run this script at 12 # every night, so we want to set the dirdate var the day the script # runs minus a day so we label the files with the correct day. We # Then create a dir for the days logs, move the log files into # todays dir. As soon as that is done restart snort so we don't miss # anything. Then delete any logs that are uncompressed and over a # week old. Then compress out todays logs and archive them away, and # end up by mailling out the logs to you. # # Define where you have the base of your snort install snortbase=/usr/snort # Define other vars # logdir - Where the logs are kept # oldlogs - Where you want the archived .tgz logs kept # weeklogs - This is where you want to keep a weeks worth of log files uncompres sed # dirdate - Todays Date in Month - Day - Year format # olddirdate - Todays date in the same format as dirdate, minus a week logdir=$snortbase/log oldlogs=$snortbase/oldlogs weeklogs=$snortbase/weeklogs # When I first wrote this script, I only ran it on BSD systems. That was a # mistake, as BSD systems have a date command that apperently lets you walk the # date back pretty easily. Well, some systems don't have this feature, so I had # to change the way that dates are done in here. I left in the old way, because # it is cleaner, and I added in a new way that should be portable. If anyone # has any problems, just let me know and I will try to fix it. # # You have to change the system var to either bsd or other. Set it to bsd if # your system supports the "-v" flag. If you are not sure, set it to other. system=bsd if [ $system = bsd ] then dirdate=`date -v -1d "+%m-%d-%y"` olddirdate=`date -v -8d "+%m-%d-%y"` elif [ $system = other ] month=`date "+%m"` yesterday=`expr \`date "+%d"\` - 1` eightday=`expr \`date "+%d"\` - 8` year=`date "+%y"` dirdate=$month-$yesterday-$year olddirdate=$month-$eightday-$year fi # Create the Dir for todays logs. if [ ! -d $weeklogs/$dirdate ] then mkdir $weeklogs/$dirdate fi # Move the log files into todays log dir. This is done with # a for loop right now, because I am afriad that if alot is # logged there may be to many items to move with a "mv *" # type command. There may a better way to do this, but I don't # know it yet. for logitem in `ls $logdir` ; do mv $logdir/$logitem $weeklogs/$dirdate done # Kill and restart snort now that the log files are moved. kill `cat /var/run/snort_fxp0.pid` # Restart snort in the correct way for you /usr/local/bin/snort -i fxp0 -d -D -h homeiprange/28 -l /usr/snort/log \ -c /usr/snort/etc/08292k.rules > /dev/null 2>&1 # Delete any uncompressed log files that over a week old. if [ -d $weeklogs/$olddirdate ] then rm -r $weeklogs/$olddirdate fi # Compress and save the log files to save for as long as you want. # This is done in a sub-shell because we change dirs, and I don't want # to do that within the shell that the script runs in. (cd $weeklogs; tar zcvf $oldlogs/$dirdate.tgz $dirdate > /dev/null 2>&1) # Mail out the log files for today. cat $weeklogs/$dirdate/snort.alert | mail -s "Snort logs" you@domain.com cat $weeklogs/$dirdate/snort_portscan.log | mail -s "Snort portscan logs" you@do main.com 6.9 Почему при удалении алерта в ACID возникает сообщение 'error deleting alert' ? Обычно пользователь БД, под которым ACID работает в базе, имеет права INSERT и SELECT, таким образом, для удаления алертов из базы средствами ACID необходимо этому пользователю дать права DELETE. Проверить права очень просто - ручками под этим пользователем добавить строку в БД и затем попробовать ее удалить: 1. логин в MySQL соответствующим пользователем и паролем, под которым работает ACID mysql -u -p 2. вставляем строку mysql> INSERT INTO event (sid, cid, signature, timestamp) VALUES (1,1000000, "test", "0"); (подразумевается, что пока еще не было строки с event ID=1000000, в противном случае вам придется взять другое число) 3. теперь удаляем эту введенную строку: mysql> DELETE FROM event WHERE sid=1 AND cid=10000000; Если удалить не получится, то у вас проблемы с правами для этого пользователя. Релогинимся в mysql под рутом и даем команду GRANT (предоставляющую право DELETE) пользователю, под которым ACID работает в БД. GRANT DELETE on snort.* to acid@localhost (т.е. имя базы с алертами - 'snort', имя пользователя 'acid', и логи поступают с 'localhost') 6.10 с Lynx ACID не работает Это известная фишка. Lynx херит некоторые из аргументов в URL. Решение ищется, а пока пользуйтесь Netscape, Opera, или IE. 6.11 У меня предупреждения 'snort [pid] uses obsolete (PF_INET, SOCK_PACKET)', в чем дело? Вы используете новое ядро и старую библиотеку libpcap. Все OK до тех пор, пока ядро поддерживает сокеты типа SOCK_PACKET. Чтобы избавиться от данных предупреждений, обновите libpcap (рекомендуется обновиться с сайта www.tcpdump.org). 6.12 На HP-UX получаю: device lan0 open: recv_ack: promisc_phys: Invalid argument Это происходит из-за того, что некий процесс также использует DLPI. HP-UX не позволяет работать более одной версии libpcap, в отличие от Linux. (из snort.c) 6.13 Snort отваливается с ошибкой 'can not create file', а у меня полно свободного места, что не так? Возможно, закончились свободные индексные дескрипторы (inodes), и это означает, что на данном разделе диска создать файл вы не сможете. Очевидное решение - поработать с rm ;-) . 6.14 Использую Snort на Windows и получаю ошибку ``OpenPcap() error upon startup: ERROR: OpenPcap() device open: Error opening adapter'', что не так? Либо winpcap не установлен, или вы используете несовместимую версию. Попробуйте обновиться: http://netgroup-serv.polito.it/winpcap/ Также могут быть проблемы с однопроцессорными машинами, см. FAQ Q:### 6.15 Snort не пишет в БД! Есть несколько проблем, из-за которых snort не может писать лог в БД. Проверьте следующее: 1. Вы не поставили плагин database в конфиге. 2. Вы исполльзуете старую схему БД и необходимо ее обновить, запустив скрипты создания из директории /contrib в дистрибутиве исходников snort. 3. Опции запуска в командной строке перекрывают параметры конфигурационного файла. Чаще всегоэто опции -A или -s. Внимание: если хотите писать в syslog, укажите это в конфиге, а не в командной строке запуска. 4. Есть проблемы с конфигурацией БД. Убедитесь в корректности прав двух пользователей: под которым пишутся логи в базу и под которым работает сервер БД. 6.16 Портсканы не фиксируются у меня в базе Измените output facility с 'alert' на 'log'. Препроцессор portscan вызывает плагин с именем 'alert' вместо плагина 'log'. output database: alert, mysql, user=snort dbname=snort host=localhost 6.17 Snort не пишет в syslog Есть несколько проблем, которые могут привести к такой ситуации. Проверьте: * Если вы используете опции командной строки, которые перекрывают опции в конфигурационном файле. Чаще всего это -A. * Логгинг может быть настроен не туда. Убедитесь, что syslog сконфигурирован правильно. 6.18 Меня бомбардируют сообщениями spp_portscan, даже если IP-адрес, генерирующий эти сообщения, находится в переменной $DNS_SERVERS. Попробуйте добавить 32-битную маску для этих адресов: var DNS_SERVERS [xxx.xx.0.3/32,xxx.xxx.0.2/32] И убедитесь, что переменная $DNS_SERVERS есть в списке portscan-ignorehosts: preprocessor portscan-ignorehosts: $DNS_SERVERS 6.19 Почему SNORT, работающий в chrooted-режиме, умирает, если я ему посылаю SIGHUP? Это известная проблема с правами. Решение - рестарт snort. А вот развернутый ответ: механизм работы вызова execv(2) таков, что он перестартует snort внутри chrooted-окружения. Что влечет рекурсивность процесса запирания snort в chroot. Например, первый chroot - в /snort и теперь реальная директория "/snort" видится процессом как "/". Теперь посылаем в snort -HUP. Получаем новый фиктивный "/" для snort - это реальная директория "/snort/snort". Другими словами, вам необходимо пересоздавать каталоги для замкнутого окружения внутри уже существующего замкнутого окружения. Посланные подряд четыре -HUP и для snort рутовая директория превратится в "/snort/snort/snort/snort" 6.20 Мой snort сваливается, как мне его перезапустить? Попробуйте эти два скрипта (или поищите daemontools в инете) * []#!/bin/sh #snorthup: Snort Restarter and Crash Logger #(dr@kyx..net with help from kmaxwell@superpages.com) $conf = "snort.conf" for $IFACE in fxp0 fxp1 do if [ -f /var/run/snort_$IFACE.pid ]; then if ! ps -p `cat /var/run/snort_$IFACE.pid` > /dev/null ; then /usr/bin/logger -p user.notice snorthup: removing bogus pidfile /usr/bin/ logger -p user.notice snorthup: restarting absentee snort o n $IFACE with conf file $i rm -f /var/run/snort_$IFACE.pid /usr/local/bin/snort -D -c $conf -i $IFACE fi; else /usr/bin/ logger -p user.notice snorthup: restarting snort on $IFACE with conf file $conf /usr/local/bin/snort -D -c $conf -i $IFACE fi done Другая версия: * []#!/bin/ksh # snortstartd: Snort (Re)Starter # Dom De Vitto (dom@devitto..com) # (original idea by dr@kyx..net & kmaxwell@superpages.com) # # Note: You'd better get CONF and INTERFACES right or # this script will just keep trying to start snort. # Path to echo, sed, test, ps, grep, logger, rm, and sleep. PATH=$PATH:/usr/bin:/usr/local/bin ; export PATH # Point this to your conf file: CONF="/usr/local/share/examples/snort/snort.conf" # Which interfaces should Snort run on, e.g.: INTERFACES="hme0 hme1" # Wait this many seconds between checks: CHECKEVERY=5 # Full path to Snort: SNORTBINARY=/usr/local/bin/snort while :; do for INT in $INTERFACES do GREPSTRING="`echo $SNORTBINARY -N -D -c $CONF -i $INT|sed 's?\/?\\\/?g'`" PSCMDLINES=`(ps augxww 2>/dev/null||ps -ef 2>/dev/null) | grep "$GREPSTRING"|wc -l` if [ $PSCMDLINES = 0 ]; then logger -p user.notice -t "$0" "Starting Snort on $INT." $SNORTBINARY -N -D -c $CONF -i $INT 2>&1 > /dev/null fi done sleep $CHECKEVERY done 6.21 Почему snort не видит один из трафиков - 10Mbps или 100Mbps на моем autoswitch-хабе ? Вообще это из-за особенностей дизайна и все autoswitch-хабы работают таким образом. Просто невозможно протолкнуть весь 100Mbps трафик через 10Mbps. Решение, которое я использую - эти новые дешевые четырехпортовые коммутаторы... все устройства с 10mbps сажаем на один хаб/коммутатор/что-либо и затем пробрасываем на 100Mbps хаб, используемый для мониторинга через свой дешевый коммутатор, который будет работать адаптером из 10Mbps в 100Mbps и наоборот. Нехорошее качество хабов, не имеющих данной "фичи" заключается в том, что они для поддержки 10mbps-устройств понижают скорость всех своих портов до 10Mbps в случае, если есть хотя бы одно такое устройство. Я это проверял на старых хабах 3com office connect 10/100. Короче говоря, так как старые хабы не обладают возможностями коммутатора, они не знают, в какой порт направлять трафик (т.к. нет таблицы MAC-адресов), им приходится понижать скорость на всех портах. Поскольку у хабов и коммутаторов нет сколько-нибудь серьезного объема памяти в своем чипсете, то любая железка, работающая на уровнях 1-2, умеющая одновременно обслуживать и 10Mbps- и 100Mbps-клиентов, может нормально работать только с небольшим трафиком, а под нагрузкой пакеты начнут дропиться. На устройствах посерьезнее, с некоторыми управляемыми возможностями, есть дополнительные буферы, позволяющие нормально работать хотя бы при кратковременных всплесках трафика без сбрасывания пакетов. Вообще говоря, если устройство поддерживает 100 "full-duplex", тогда это коммутатор (вне зависимости от того, как это устройство называет производитель). Если устройство поддерживает 100 ->10, тогда 50 на 50 есть контроль MAC-адресов. Если устройство поддерживает только 10 -> 10 или 100 -> 100, тогда скорее всего это хаб без поддержки информации о MAC-адресах. По определению: хаб (10 или 100 - неважно) - есть единый сегмент коллизий/бродкастов (широковещательных пакетов). Вы не увидите НИКАКОЙ трафик между сегментами без моста между ними или маршрутизации на 3-ем уровне. В среде коммутаторов обычно каждый порт - отдельный сегмент коллизий, но все порты представляют из себя единый сегмент для бродкастов. Для разделения бродкаст-сегментов на коммутаторе можно создавать VLAN-ы, соединенные через маршрутизатор (внутренний или внешний). Коммутатор (по определению) - многопортовый мост . Некоторые коммутаторы поддерживают зеркальные (спан) порты. Для того, чтобы сниффер мог слышать все пакеты, проходящие через коммутатор, а не только бродкасты, нужно отзеркалировать трафик на тот порт коммутатора, в который подключен сниффер. Без зеркалирования пакеты-юникасты будут проброшены только на единственный порт коммутатора, идущий к получателю. Бродкасты и мультикасты будут разосланы большинством коммутаторов по всем портам, хотя некоторые из коммутаторов могут контролировать и такие рассылки, отправляя пакеты только в порты получателей. Отличная книга по таким вопросам - Radia Perlman "Bridges and Routers". Дополнительное предостережение : если используется режим "full duplex" на порту коммутатора, вам поможет только ловушка (tap) - некоторые успешно пользуются решением Shomiti на портах 100MB FD, и запускают два процесса snort, по одному на каждое из направлений, зеркалирование в этом случае не поможет. 6.22 При инсталляции snort говорит "bad interpreter: No such file or directory" Обычно эта ошибка появляется после редактирования файлов на win*-машинах. Часто она возникает на этапе запуска ./configure. Этот скрипт ищет /bin/sh в качестве интерпретатора. Если /bin/sh не существует, вы получаете это сообщение об ошибке. Проверьте все, идущее после символов "#!" в первой строке. Если файл был отредактирован в Windows, иногда добавляется символ "возврат каретки"- CR/LF (VM) вконец каждой строки, таким образом вместо "#!/bin/sh" получаем "#!/bin/shVM", оканчивается на ctrl-v/ctrl-m, причем эти символы большинством редакторов не показываются, поэтому отследить эту проблему нелегко. Для удаления CR-символов, которые юниксовые машины не любят, просто используйте команду dos2unix: * []dos2unix Если dos2unix нет в системе попробуйте это: * []cat | tr -d ``\r'' > 6.23 Я не вижу ни одного интерфейса в списке Win32. Причина - проблемы с WinPcap. Старые версии имели буфер, размером 1К, который переполнялся в случае использования более 10 интерфейсов. В свежих версиях WinPcap буфер увеличили до 8К, что позволило решить данную проблему. Попробуйте обновиться. 6.24 Snort не работает в Win32, как мне понять, snort это или WinPcap? Проверьте, работает ли WinDump с WinPcap. Это поможет локализовать проблему. 6.25 Я скачал новые правила и теперь snort на них ругается. Во-первых, убедитесь, что скачали правила для своей версии snort. На сайте www.snort.org лежат правила для текущей версии snort, так же как и для девелопмента, и иногда копии для старых версий. Чаще всего возникают ошибки "unknown keyword in rule". Если у вас правила точно для вашей версии snort, обратите внимание, что в тарболле правил находится и файл snort.conf file. Время от времени этот файл изменяется из-за новых правил, добавляются файлы .rules, новые переменные для поддержки новых правил. При скачивании новых правил проверьте изменения в поставляемом с правилами файле snort.conf на наличие новых переменных и т.п. Чаще всего именно это является причиной сообщений типа "something is undefined in a rule". 6.26 Как мне ускорить работу ACID и MySQL ? (ACID FAQ B-10) Из FAQ по ACID для MySQL есть пара оптимизаций: (http://www.andrew.cmu.edu/~rdanyliw/snort/acid_faq.html) * Сжатие таблиц После некоторого количества операций "delete", в файлах получаются "дыры", которые замедляют выполнение запросов по данным таблицам. Следующий шелл-скрипт проверит таблицы MySQL и сожмет их, в случае необходимости: for table in `echo show tables|mysql snort|tail +2` do echo optimize table $table|mysql snort done * Создание индексов Некоторые из необходимых индексов не создаются при выполнении скрипта начальной установки MySQL. Для значительного увеличения производительности добавьте следующие индексы: tcphdr.tcp_sport tcphdr.tcp_dport acid_ag_alert.ag_sid + acid_ag_alert.ag_cid MySQL может быть быстрым - для этого необходимо корректное задание индексов. Если вам нужна хорошая книга по MySQL, попробуйте книгу Paul DuBois' book - на сегодняшний день этьо библия по MySQL, а также есть книга издательства O'Reilly, авторы - Monty и the MySQL AB team. Для проверки имеющихся индексов используйте команду SHOW INDEX. Например, проверьте таблицу tcphdr: + []mysql>show index from tcphdr; +----+------+------+-------+-------+------+-------+-----+----+-----+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Comment | +----+------+------+-------+-------+------+-------+-----+----+-----+ | tcphdr | 0 | PRIMARY | 1 | sid | A | NULL | NULL | NULL | | | tcphdr | 0 | PRIMARY | 2 | cid | A | 2543146 | NULL | NULL | | | tcphdr | 1 | tcp_sport | 1 | tcp_sport | A | NULL | NULL | NULL | | | tcphdr | 1 | tcp_dport | 1 | tcp_dport | A | NULL | NULL | NULL | | | tcphdr | 1 | tcp_flags | 1 | tcp_flags | A | NULL | NULL | NULL | | +----+------+------+-------+-------+------+-------+-----+----+-----+ 5 rows in set (0.00 sec) В этом случае вы видите, что индекс tcphdr.tcp_sport index находится в третьей строке и tcphdr.tcp_dport в четвертой. Команда для создания индекса: + []CREATE INDEX idx_tcp_sport ON tcphdr(tcp_sport); Для создания составного (compaund) индекса: + []CREATE INDEX idx_cpd_sid_cid ON acid_ag_alert(ag_sid,ag_cid); Для более подробного анализа структуры таблицы используйте команду DESCRIBE: + [] mysql> DESCRIBE tcphdr; +------+-----------+---+---+-----+----+ | Field | Type | Null | Key | Default | Extra | +------+-----------+---+---+-----+----+ | sid | int(10) unsigned | | PRI | 0 | | | cid | int(10) unsigned | | PRI | 0 | | | tcp_sport | smallint(5) unsigned | | MUL | 0 | | | tcp_dport | smallint(5) unsigned | | MUL | 0 | | | tcp_seq | int(10) unsigned | YES | | NULL | | | tcp_ack | int(10) unsigned | YES | | NULL | | | tcp_off | tinyint(3) unsigned | YES | | NULL | | | tcp_res | tinyint(3) unsigned | YES | | NULL | | | tcp_flags | tinyint(3) unsigned | | MUL | 0 | | | tcp_win | smallint(5) unsigned | YES | | NULL | | | tcp_csum | smallint(5) unsigned | YES | | NULL | | | tcp_urp | smallint(5) unsigned | YES | | NULL | | +------+-----------+---+---+-----+----+ 12 rows in set (0.02 sec) 6.27 Почему я получаю так много алертов "SMTP RCPT TO overflow" ? Это правило анализирует фрейм TCP, идущий на ваш SMTP-сервер, содержащий более 800 байт данных. Любое письмо может содержать такой объем в случае использования механизма "pipelining". Данный механизм позволяет послать несколько команд одним пакетом без ожидания ответа на каждую из команд. Каждая из комманд не слишком длинна, но вместе эти команды легко превышают длину 800 байт. Любой качественный мэйлсервер будет пытаться обработать такие пакеты команд, например, если в нем содержится большой список адресатов. Подробнее о механизме "pipelining": http://www.faqs.org/rfcs/rfc1854.html Если ваш почтовый сервер неуязвим к атакам, использующим переполнение буфера пакетами такого типа , вы можете для успокоения души отключить данное правило. 6.28 Я получаю много сообщений "ICMP Ping Speedera", это плохо? Обычное дело. Механизм "Windows update" используют DNS, основанный на Speedera. Конечно, если speedera-трафик идет из dialup-аккаунта, то это похоже на хакерскую прогу. 6.29 Почему мои алерты в unified-формате сдвинуты на +/- N часов? Unified-логи пишутся в UTC. 6.30 Я пытаюсь стартовать snort и он выдает ошибку "ERROR: Unable to open rules file: /root/.snortrc or /root//root/.snortrc". Что мне сделать, чтобы поправить ситуацию? Когда Snort запускается, он смотрит параметры командной строки и ищет нечто вроде "-c /some/path/snort.conf". Если в командной строке ключа "-с" нет, то смотрятся такие файлы: * /etc/snort.conf * ./snort.conf * $HOMEDIR/snort.conf * $HOMEDIR/.snortrc * ./.snortrc Убедитесь, что файл .conf есть в одной из этих директорий и доступен для snort, либо используйте ключ "-с" с полным путем к snort.conf в командной строке: snort -c /usr/local/etc/snort.conf 7 Разработка 7.1 Как включить режим отладки? В версии 1.9 или более свежей: 1. ./configure -enable-debug 2. Смотрите секции snort которые вы хотите отладить (в файле src/debug.h) и добавляйте требуемые константы. Например, для отладки Portscan2: #define DEBUG_PORTSCAN2 0x00080000 /* 524288 / (+ conv2 ) 589824 */ Для отладки только portscan2: export SNORT_DEBUG=524288 Для отладки и portscan2 и обмена данными: export SNORT_DEBUG=589824 3. Запустите snort как обычно, перенаправив вывод в файл для анализа большого количества отладочных сообщений. 8 Разное 8.1 Что такое "snort drinking game"? :-) Смотрите сами: http://www.theadamsfamily.net/~erek/snort/drinking_game.txt Об этом документе... Snort FAQ This document was generated using the LaTeX2HTML translator Version 97.1 (release) (July 13th, 1997) Copyright © 1993, 1994, 1995, 1996, 1997, Nikos Drakos, Computer Based Learning Unit, University of Leeds. The command line arguments were: latex2html -no_subdir -split 0 -show_section_numbers /tmp/lyx_tmpdir5901fp5901/ lyx_tmpbuf5901EF5901/faq.tex. The translation was initiated by Erek Adams on 4/9/2003 ------------------------------------------------------------------------------- Ссылки ...Shomiti/Finisar http://www.shomiti.com ...Netoptics http://www.netoptics.com/ ...syslog-ng http://www.balabit.hu/en/downloads/syslog-ng/ ...manual http://www.snort.org/docs/writing_rules/chap2.html#tth_sEc2.2.4 ------------------------------------------------------------------------------- Erek Adams 4/9/2003