Bsdadmin.ru

Записки администратора FreeBSD

Путь на сайте

Домашняя Программы под FreeBSD Система обнаружения вторжений во FreeBSD на основе Snort Inline

Система обнаружения вторжений во FreeBSD на основе Snort Inline

Обычно к Snort Inline относятся как к инструменту, разработанному сугубо для Linux и для интеграции с пакетом iptables. Однако, используя divert-socket можно заворачивать трафик и от ipfw, перенаправляя его для анализа на процесс, который слушает на заворачиваемом порту. 

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

В нашем примере рассматриваются две машины с FreeBSD 8.2, работающие в одной локальной сети.
Обе работают внутри VirtualBox, одна как IPS, а другая как атакующая система .Обе виртуальные машины должны содержать минимальный набор пакетов для i386, включая дерево портов (см. FREEBSD-INSTALL для инструкций по такой установке). Стандартное ядро FreeBSD 8.2 имеет поддержку divert-sockets, однако этот модуль должен быть явно разрешен.

Листинг 1
Необходимая настройка в файле /boot/loader. conf для включения divert sockets

echo 'ipdivert load="YES"' >> /boot/loader.conf

Листинг 2
Установите нужные порты и загрузите Snort с поддержкой DAQ. Это позволит вам собрать программу с функцией заворачивания пакетов от ipfw. В описываемых шагах используется ключ компиляции -DBATCH и подразумеваются стандартные настройки для каждого порта.

cd /usr/ports/ftp/wget make -DBATCH install clean rehash
cd /usr/ports/textproc/flex make -DBATCH install clean cd /usr/ports/devel/pcre
make -DBATCH install clean
cd /usr/ports/net/libdnet/
make -DBATCH install clean
mkdir /usr/src/snort && cd /usr/src/snort
wget snort-current/daq-0.6-2.tar.gz -O daq-0.6.2.tar.gz tar xzf
daq-0.6.2.tar.gz cd daq-0.6.2
./configure
make
make install
wget snort.org/dl/snort-current/snort-2.9.2.tar.gz -O snort-2.9.2.tar.gz cd
snort-2.9.2
./configure --enable-ipv6 --enable-gre --enable-mpls --enable-targetbased
--enable-decoder-prepocessor-rules \ --enable-ppm --enable-perfprofiling --enable-zlib
--enable-active-response --enable-normalizer --enable-reload \ --enable-react
--enable-flexresp3
make
make install
mkdir -p /usr/local/etc/snort
cp /usr/src/snort/snort-2.9.2/etc/*.conf* /usr/local/etc/snort/
cp /usr/src/snort/snort-2.9.2/etc/*.map /usr/local/etc/snort/
mkdir -p /usr/local/lib/snort dynamicrules/
mkdir -p /usr/local/etc/snort
mkdir -p /usr/local/etc/snort/rules
mkdir -p /usr/local/etc/snort/so rules
mkdir -p /usr/local/etc/snort/preproc rules
mkdir -p /var/log/snort
mkdir -p /var/log/barnyard2
touch /usr/local/etc/snort/rules/local.rules

sed -i "s/ipvar HOME NET any/ipvar HOME NET \[192.168.1.21\/32\]/"
/usr/local/etc/snort/snort.conf
sed -i 's/ipvar EXTERNAL NET any/ipvar EXTERNAL NET \[!\$HOME NET\]/'
/usr/local/etc/snort/snort.conf
sed -i 's/var RULE PATH \.\.\/rules/var RULE PATH rules/'
/usr/local/etc/snort/snort.conf
sed -i 's/var SO RULE PATH \.\.\/so rules/var SO RULE PATH so rules/'
/usr/local/etc/snort/snort.conf
sed -i 's/var PREPROC RULE PATH \.\.\/preproc rules/var PREPROC RULE PATH
preproc rules/' /usr/local/etc/snort/
snort.conf
sed -i '/Ainclude \$RULE PATH\/.*.rules$/d'
/usr/local/etc/snort/snort.conf
echo "output alert_syslog: LOG_DAEMON LOG_ALERT" >> /usr/local/etc/snort/snort.conf echo
'include $RULE PATH/local.rules' >> /usr/local/etc/snort/snort.conf

Листинг 3 - Устанавливаем apache22 из дерева портов.

cd /usr/ports/www/apache22/ make -DBATCH install clean
Чтобы показать, как Snort блокирует атаки, нам потребуется установить Apache для эмуляции
сетевого сервиса, который будут атаковать. 

Листинг 4 - Создаем файл /etc/rc.firewall-ips (Обратите внимание, что для пропускания
трафика вставлены правила для ICMP, TCP/80 и UDP/53, если же сам трафик, конечно, не
заблокирован Snort)
В Листинге 5 создается нужный исполняемый скрипт для Snort, который помещается в /usr/local/etc/rc.d. Таким образом, используя настройки из /etc/rc.conf.local, Snort и apache22 будут автоматически запускаться при каждом старте.

cat << EOF > /etc/rc.firewall-ips; ipfw -q flush
ipfw -q add 01100 divert 8000 ip4 from any to any ipfw -q add 01200 allow tcp from any to me
22 in via em0
ipfw -q add 01300 allow tcp from any to me 80 in via em0
ipfw -q add 01400 allow udp from any to me 53 in via em0
ipfw -q add 01500 allow icmp from any to any ipfw -q add 01600 allow ip4 from any to any EOF

В Листинге 6 приводятся необходимые строки, которые нужно добавить в файл /etc/rc.conf - именно этим механизмом будут загружаться правила для файрвола во время загрузки виртуальной машины с FreeBSD-IPS.
Нужно иметь ввиду одну важную деталь при использовании divert sockets совместно с ip-fW файрволом. Если Snort не будет запущен и, соответственно, некому будет обрабатывать входящие пакеты, то весь трафик будет пропущен, т.к. на divert-порт информация приходит, но ничего не перенаправляется на следующее правило в очереди ipfw как включить нужную строчку в конфигурационный файл /boot/loader.conf для организации заворачивания пакетов на машине FreeBSD-IPS.

В Листинге 2 приводятся необходимые шаги для построения Snort, включая небольшие изменения в
стандартную конфигурацию. Плагин вывода alert_sys-log используется для демонстрации
способностей IPS. В реальной системе вместо него должен использоваться плагин barnyard2 для
обработки вывода unified2, что генерируется самим Snort.
В нормальных условиях, в Snort-сигнатуре присутствует параметр "alert", с помощью которого генерируется сигнал, но действия по предотвращению не производятся. Чтобы заблокировать пакет, нужно использовать параметр "block" или "drop". В Листинге 7 приводится пример создания сигнатуры HTTP, при нахождении которой в сетевом трафике, он будет заблокирован.

Перезагрузив виртуальный контейнер с Free-BSD-IPS, мы получим автостарт Apache, Snort и
работающий совместно со Snort файрвол ipfw.

Листинг 5 - Создаем исполняемый скрипт snort и добавляем необходимую информацию об apache22
и Snort в файл /etc/rc.conf.local.

cat << EOF > /usr/local/etc/rc.d/snort; #!/bin/sh
# \$FreeBSD\$ #
# PROVIDE: snort
# REQUIRE: LOGIN
# KEYWORD: shutdown
#
# Add the following lines to /etc/rc.conf.local or /etc/
rc.conf
# to enable this service:
#
# snort_enable (bool): Set to NO by default.
# Set it to YES to enable snort.
# snort config (path): Set to /usr/local/etc/snort/
snort.conf
# by default.
#

. /etc/rc.subr

name="snort" rcvar=\${name} enable
command=/usr/local/bin/\${name}
load rc config \$name
: \${snort_enable="NO"}
: \${snort config="/usr/local/etc/snort/snort.conf"}

command args="--pid-path /var/run --create-pidfile
--daq=ipfw -Q -D -k none -c \$snort config"
run rc command EOF
chmod 555 /usr/local/etc/rc.d/snort;
echo 'accf http load="YES"' >> /boot/loader.conf echo 'apache22 enable="YES"' >>
/etc/rc.conf.local echo 'snort enable="YES"' >> /etc/rc.conf.local


Листинг 6 - Добавляем нужные настройки в файл /etc/rc.conf, и обеспечиваем таким образом
автоматический старт ipfw.

echo 'firewall enable="YES"' >> /etc/rc.conf echo 'firewall
script="/etc/rc.firewall-ips"' >> /etc/ rc.conf

L isting 7 - Создаем сигнатуру для блокировки запроса на получение файла /etc/passwd
cat << EOF >> /usr/local/etc/snort/rules/local.rules;
# This signature looks for an attempt to retrieve the
# /etc/passwd file with a web request.
# По этой сигнатуре проверяется весь веб-трафик на
наличие запроса
# доступа к /etc/passwd

block tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_
PORTS (msg:"HTTP FreeBSD-ATTACKER /etc/passwd attempt";
flow:established,to server; content:"/etc/passwd"; http uri; nocase;
classtype:attempted-admin;
sid:2200001; rev:1;)
EOF

Листинг 8 - В командной строке приводится поведение атакующей системы FreeBSD-Attacker

FreeBSD-Attacker# printf "GET / HTTP/1.1\r\nHost:
192.168.1.21\r\nUser-Agent: Netcat\r\ nContent-type: text/html\r\n\r\n" |
nc -vvnn 192.168.1.21 80
Connection to 192.168.1.21 80 port [tcp/*] succeeded!
HTTP/1.1 200 OK
Date: Sat, 17 Dec 2011 06:20:26 GMT
Server: Apache/2.2.17 (FreeBSD) mod_ssl/2.2.17
OpenSSL/0.9.8q DAV/2
Last-Modified: Sat, 20 Nov 2004 20:16:24 GMT ETag: "ba199-2c-3e9564c23b600"
Accept-Ranges: bytes
Content-Length: 44
Content-Type: text/html
<html><body><h1>It works!</h1></body></html>FreeBSD-Attacker#
FreeBSD-Attacker# printf "GET /etc/passwd HTTP/1.1\r\
nHost: 192.168.1.21\r\nUser-Agent:
Netcat\r\nContent-type: text/html\r\
n\r\n" | nc -vvnn 192.168.1.21 80
Connection to 192.168.1.21 80 port [tcp/*] succeeded!

Листинг 9 - Сообщение о блокированной атаке от системы Snort и сохраненной в
/var/log/messages

Dec 17 01:20:49 FreeBSD-IPS snort[838]: [1:2200001:1] HTTP FreeBSD-ATTACKER /etc/passwd
attempt [Classification: Attempted Admi-nistrator Privilege Gain] [Priority: 1] {TCP}
192.168.1.22:17123 -> 192.168.1.21:80

Теперь атакующая система FreeBSD-Attacker может попробовать запустить ping-пакеты на
IPS-сенсор. Чтобы продемонстрировать работу IPS, на атакующей машине мы будем выводить
сообщения с помощью команд printf и netcat, которые и сформируют HTTP-запрос для посылки на
сервер Apache. В Листинге 8 приведен правильный HTTP-запрос, за которым следует попытка
получить нужный файл.

Первый запрос был отправлен веб-серверу Apache и от него был получен ответ HTTP 200 OK. Во
втором запросе в адресное поле включена строка /etc/passwd. Этот запрос Snort заблокировал,
но пропустил на обработку серверу Apache. В Листинге 9 приводится сообщение из
/var/log/messages, т.к. Snort был настроен на использование syslog для сохранения
лог-данных.

Сложные конфигурации могут учитывать частные сети, располагающиеся за экраном FreeBSD-IPS, защищающим таким образом эти сетевые сегменты от атак. В сегодняшнем примере мы использовали только одну сигнатуру, чтобы продемонстрировать функционал по блокировке атаки. Можно найти свободно-распространяемые в сети образцы правил, такие как Emerging Threats, а также зарегистрированные правила с сайт Source-fire, которые вы можете задействовать для защиты собственной системы или сети от вредоносных атак.

Домашняя Программы под FreeBSD Система обнаружения вторжений во FreeBSD на основе Snort Inline