Ключевые слова:snort, security, ids, sniffer, (найти похожие документы)
From: Роман Лепешков <rlepeshkov at yandex.ru>
Date: Mon, 28 Oct 2004 14:31:37 +0000 (UTC)
Subject: Перевод на русский язык Snort FAQ
Оригинал: http://rlepeshkov.narod.ru/faq_ru.txt
The Snort FAQ
The Snort Core Team
Перевод на русский язык: Роман Лепешков <rlepeshkov at yandex.ru>
Предложения по развитию данного документа всегда приветствуются.
Отправляйте их на адрес [email protected]. Если в данном документе есть
разработанная вами часть и вы не видите свое имя в списке, напишите нам.
Список авторов этого 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 У меня много сообщений <some alerts type>. Что делать? Где
поподробнее об этом почитать?
+ 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?
Неа. [email protected] - автор 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 <dir>", тогда логи будут писаться в указанную директорию <dir>.
Раньше запуск 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 есть переменная <interface>_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-трафик от хоста <foo> используем правило:
pass icmp <foo> any -> $HOME_NET any
2. фильтры BPF:
+ Преимущества
Пакет сбрасывается на интерфейсе BPF, что облегчает нагрузку.
Ускоряет snort, т.к. он "никогда не видит" этих пакетов
+ Недостатки:
Бестолково настроенные фильтры могут "ослепить" snort.
+ Пример:
Чтобы игнорировать весь трафик от 192.168.0.1:
snort <commandline options> not host 192.168.0.1
Чтобы игнорировать весь трафик ICMP ECHO-REQUESTS и ICMP-ECHO REPLY's
(запрос и ответ ping) от хоста <foo>:
snort <options> ``not ( (icmp[0] = 8 or icmp[0] = 0) and host <foo>)''
> 3.10 Как мне заставить snort писать не только заголовки, но и содержимое пакета?
Используйте опцию "-d" для записи содержимого пакетов или опцию "-b" для записи
пакета целиком в бинарном виде.
> 3.11 Почему у меня нет поддиректорий в /var/log/snort для IP адресов?
Это зависит от конфигурации журналов snort. Если запись ведется в бинарном
формате, вам придется обрабатывать бинарный лог для получения читабельного вида.
Вы также можете указать опцию "-А <foo>" в командной строке. Опции командной
строки всегда более приоритетны чем 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 <seconds>],
[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="[email protected]"
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:[email protected]:/cvsroot/snort login
cvs -z3 -d:pserver:[email protected]:/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 <host>' в
командной строке Windows, т.е. snort будет использовать настройки из snort.conf,
и дополнительно посылать алерты на syslog-сервер, указанный в поле <host>.
Патч можно найти на
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.html4 Правила и алерты
> 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/nickzmanhttp://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.phphttp://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.com6 Проблемы
> 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 <dr@kyx.net.>.
> 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 [email protected].
#
# 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 uncompressed
# 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 walkthe
# 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" [email protected]
cat $weeklogs/$dirdate/snort_portscan.log | mail -s "Snort portscan logs" [email protected]
> 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
#([email protected] with help from [email protected])
$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 on $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 ([email protected])
# (original idea by [email protected] & [email protected])
#
# 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 <infile> <outfile>
Если dos2unix нет в системе попробуйте это:
* cat <infile> | tr -d ``\r'' > <outfile>
> 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|
|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 |
-----------------------------------------------------------
| 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
как настроить snort чтоб в базу он сохранял только распознанные атаки а не весь траффик проходящий через интерфейс, а то у меня за день в базу кидает 2 гб траффика