вторник, 19 октября 2010 г.

Сборка Snort 2.9.0

Сегодня я расскажу про сборку SNORT 2.9.0. Рассказ будет именно о том, как его собирать, то есть довести до работоспособного состояния из исходников. Про настройку правил тут не будет ни слова.
Последняя версия SNORT 2.9.0 пока не доступна в репозитариях, к тому же она имеет принципиальное отличие от предыдущих. Этим релизом SNORT взял курс на развитие себя, как IPS. Сборки снорта для активной работы с траффиком были доступны и ранее, типа snort_inline, но теперь разработчики снорт анонсировали официальный драйвер, который и наделяет snort способностями IPS.
Моей целью было сделать что-то вроде инсталятора , который будет разворачивать snort на Ubuntu версий с 6 по 10 для x86_64 и amd64, без необходимости выкачивать что-то из репозитариев. То есть, следуя этой инструкции, вы получите набор пакетов, который можно будет накатывать на "голую" систему.

Немного теории
Как работает снорт в режиме IPS ?
Для этого используется способность iptables выводить сетевой пакет на "рассмотрение" в userland из ядра. То есть полученный пакет передаётся на анализ пользовательскому процессу, который уже сигнализирует: пропускать пакет дальше, откинуть его или изменить. В iptables существует понятие очереди, в которую ставится пакет для анализа пользовательской программой, например:
iptables -A PREROUTING -t raw -i eth0 -j QUEUE
PREROUTING - цепочка для обработки всех входящих пакетов.
raw - таблица просматриваемая до передачи пакета системе определения состояний.
eth0 - сетевой интерфейс.
QUEUE - постановка пакета в очередь для анализа пользовательской программой.

QUEUE - устаревшая директива, которая формирует только одну очередь, которая имеет постоянный идентификатор 0. Для формирования нескольких очередей используется директива NFQUEUE, в которой опционально можно указать id очереди ( по-умолчанию 0).
Snort можно применить к конкретной очереди:
iptables -A PREROUTING -t mangle -i eth0 -j NFQUEUE --queue-num 0
--queue-num 0 определяет очередь.

Итак , слегка коснувшись теории, приступим =)

Установка

Для начала необходимо скачать и установить следующие пакеты:
apt-get install pkg-config
apt-get install flex
apt-get install bison
apt-get install checkinstall
apt-get install make
apt-get install build-essential
apt-get postgresql-client
apt-get libpq-dev

checkinstall - уютная тулза для быстрого и безболезненного формирования(и установки) .deb пакета из скомпилированного софта. Моя сборка snort должна была работать с СУБД Postgresql, так что первым в моём списке шла компиляция библиотек , которые понадобятся при компиляции снорта с поддержкой Postgresql. Для этого с официального сайта качаем postgresql-9.0.1. распаковываем и компилируем. Здесь цель не получить рабочую сборку субд, а собрать только библиотеки, которые понадобятся при сборки снорта. Так что некоторые вещи можно безболезненно отключить =)

./configure --without-readline --without-zlib
make
checkinstall

Далее мы скачиваем
pcre-8.10
libnfnetlink-1.0.0
libnetfilter_queue-1.0.0
libpcap-1.1.1
libpcap-1.0.0
iptables-1.4.4
snort-2.9.0
daq-0.2

Всё это компилируется через банальный ./configure; make ; make install, но есть некоторые нюансы, которые необходимо изучить, перед тем , как приступать. С libpcap есть одна тонкость, которую я не до конца понял. Для сборки snort под x86_64 нужно использовать libpcap-1.0.0, другие версии конфигуратор отчаянно не замечает, в то время, как под amd64 такой проблемы не возникает и можно использовать libpcap-1.1.1.
При сборке iptables есть тонкость для архитектуры amd64. При распаковке дистрибутива вы увидите папочку с именем libipq, это библиотека, которая необходима для правильной сборки daq драйвера. После того, как выполнится ./configure нам нужно пойти в libipq , открыть Makefile и заменить строку

AM_CFLAGS = ${regular_CFLAGS} -I${top_builddir}/include -I${top_srcdir}/include
на
AM_CFLAGS = ${regular_CFLAGS} -I${top_builddir}/include -I${top_srcdir}/include -fPIC
и проделать уже обычный ( возвратом на директорию выше)
make
make install

Суть этих махинаций заключается в том, чтоб собрать библиотеку libipq.a для amd64 так, чтоб ею могли пользоваться другие приложения. То же самое можно сказать про скаченную библиотеку libdnet-1.11 , но с тем отличием, что с ней это делается проще:

./configure "CFLAGS=-fPIC -g -O2"
make
checkinstall

Теперь сборка daq драйвера:

./configure
Если всё прошло успешно, то скрипт должен вывести :
Build AFPacket DAQ module.. : yes
Build Dump DAQ module...... : yes
Build IPFW DAQ module...... : yes
Build IPQ DAQ module....... : yes
Build NFQ DAQ module....... : yes
Build PCAP DAQ module...... : yes

make
checkinstall
Если libipq и libdnet были собраны по инструкции, то компиляция должна пройти без ошибок.

Теперь , наконец, можно начать компилировать наш снорт. Я Собирал его с ключами

./configure –with-postgresql –enable-build-dynamic-examples --enable-gre –enable-reload
--enable-linux-smp-stats –enable-zlib –enable-active-response
make
checkinstall

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

ln -s /usr/local/pgsql/lib/libpq.so.5 /usr/lib/libpq.so.5
ln -s /usr/local/lib/libsfbpf.so.0 /usr/lib/libsfbpf.so.0
ln -s /usr/local/lib/libnfnetlink.so.0 /usr/lib/libnfnetlink.so.0
ln -s /usr/local/lib/libnetfilter_queue.so.1 /usr/lib/libnetfilter_queue.so.1
ln -s /usr/local/lib/libdnet.1 /usr/lib/libdnet.1
ln -s /usr/local/lib/libpcre.so.0 /usr/lib/libpcre.so.0
ln -s /usr/local/lib/libxtables.so.2 /usr/lib/libxtables.so.2
ln -s /usr/local/lib/libiptc.so.0 /usr/lib/libiptc.so.0

Если все пункты были выполнены без ошибок, то на этом этапе снорт должен запуститься без осложнений. Если вы хотите, чтоб он работал в активном режиме ( а вы ведь хотите!), то нужно проделать следующее:
Запустить снорт для работы в активном режиме, с обработкой очереди 1:

/snort –Q --daq nfq –daq-var queue=1 -l /var/log/snort –c /etc/snort/snort.conf –v

Здесь опять же есть нюанс. Активный режим может быть двух типов : nfq и ipq . Для работы в режиме ipq необходимо загрузить модуль ip_queue, а для работы в режиме nfq этот модуль должен быть выгружен. Если это условие не выполнено, то снорт умрёт, сообщив об ошибке.

Установить правила на iptables , которые направят трффик через снорт.

iptables -A PREROUTING -t raw -i [interface] -j NFQUEUE --queue-num 0

ВНИМАНИЕ.
Делая это, необходимо чётко понимать, что происходит, особенно при удалённой работе. Вы рискуете отрезать свою машину от сети! Это может произойти в случае, если снорт будет некорректно настроен для работы с очередью. Если ни одно пользовательское приложение не работает с очередью, то пакеты из очереди просто дропаются и связь с машиной становится невозможной.
То есть, правила нужна устанавливать ПОСЛЕ запуска снорта.

Если всё было сделано без ошибок, то можно начинать титаническую работу по настройке правил и решать, как анализировать получаемые данные. Рекомендую так же написать вспомогательный скрипт, который будет перезапускать снорт в случае падения, так как в этом случае машина оказывается запертой. Я рекомендую это, потому что при настройке он у меня пару раз падал.

В заключении ссылки на получившийся инсталлятор. Можете воспользоваться им, если считаете, что у меня нашлась причина из-за которой я решил не снабжать его руткитом =)

http://rapidshare.com/files/426134430/packages_32.rar