Содержание
- 1 Прописываем дополнительные источники пакетов
- 2 Обновляемся и ставим сопутствующий софт
- 3 Ставим библиотеки из исходников
- 4 Обновляем кэш библиотек
- 5 Качаем и ставим сам Snort
- 6 Первоначальная настройка Snort
- 7 Установка Barnyard2
- 8 Создаем базу данных
- 9 Проверка связки Snort & Barnyard
- 10 Ставим WEB-интерфейс
- 11 Регистрируемся на сайте
Здравствуйте друзья! Сегодня, наконец, дошли руки до написания статьи на тему защиты своей внутренней сети от вторжений извне. Точнее даже не самой защиты, а своевременной и наглядной идентификации.
Итак, перейду ближе к делу.
У нас имеется сервер с Debian 8 (скачал новую версию специально для этого дела), два сетевых интерфейса eth0 и eth1. Как водится, это граничный шлюз, будет раздавать инет, приходящий на внешний интерфейс eth0 во внутреннюю сеть eth1. Это мы уже делали, на этом зацикливаться не буду.
Первым делом нам потребуется ssh, чтобы “рулить” уже с рабочего места (не очень удобно торчать в морозной серверной с консолью, стоя и в неприятном шуме).
# apt-get -y install openssh-server
Далее открываем конфиг:
# vi /etc/ssh/sshd_config
И раскомментируем строчки:
Protocol 2
Port 22
Запустим сервис:
# /etc/init.d/ssh start
Всё, теперь можно коннектиться уже с рабочего места. Перехожу из серверной к себе в уютную коморку (фотки уже проскакивали ;).
….
Вот жеж! Балбес. Пришлось снова идти в серверную. На только что установленной системе не был прописан IP адрес интерфейса, не смог приконнектиться…. Исправлюсь
Открываем файл конфигурации интерфейсов и прописываем наши данные (DHCP у меня нет):
# vi /etc/network/interfaces
А теперь перезагружаем сеть
# /etc/init.d/networking restart
Всё, теперь все действия будем выполнять уже удалённо. Да, не забываем прописать валидный DNS в файл /etc/resolv.conf
nameserver 8.8.8.8
Один из вариантов, публичный гугловский.
Прописываем дополнительные источники пакетов
Для этого открываем файл /etc/apt/sources.list и дописываем следующие источники:
deb http://packages.dotdeb.org jessie all
deb-src http://packages.dotdeb.org jessie all
Соответственно, добавляем ключ для доступа к этим источникам:
# cd /tmp && wget http://www.dotdeb.org/dotdeb.gpg
# cat dotdeb.gpg | apt-key add -
Обновляемся и ставим сопутствующий софт
# apt-get update && apt-get -y install apache2 apache2-doc autoconf automake bison ca-certificates ethtool flex g++ gcc libapache2-mod-php5 libcrypt-ssleay-perl libmysqlclient-dev libnet1 libpcre3 libpcre3-dev libphp-adodb libssl-dev libtool libwww-perl make mysql-client mysql-common mysql-server ntp php5-cli php5-gd php5-mysql php-pear sysstat
Ставится куча компонентов и зависимостей, они нам понадобятся в будущем. Идём пить кофе, у меня процесс установки занялся минут на 5.
Придётся ввести пароль root для mysql-сервера. Попутно выдается предупреждение о том, что adodb установлен в /usr/share/php/adodb, запомним этот путь, он нам пригодится потом.
Разгружаем ядро (если планируется большой трафик)
# vi /etc/rc.local
Дописываем строки перед exit 0
ethtool --offload eth0 rx off tx off
ethtool -K eth0 gso off
ethtool -K eth0 gro off
Ставим библиотеки из исходников
Дальше нам понадобится libpcap для захвата пакетов в режиме promisc
# cd /usr/src
# wget http://www.tcpdump.org/release/libpcap-1.6.1.tar.gz
# tar xzf libpcap-1.6.1.tar.gz
# cd libpcap-1.6.1
# ./configure --prefix=/usr && make && make install
Аналогично скачаем и поставим libdnet для низкоуровневой работы с пакетами
# cd /usr/src
# wget http://libdnet.googlecode.com/files/libdnet-1.12.tgz
# tar xzf libdnet-1.12.tgz
# cd libdnet-1.12
# ./configure --prefix=/usr --enable-shared && make && make install
А так же daq (последнюю версию можно посмотреть на https://www.snort.org/downloads в разделе Sources)
# cd /usr/src
# wget https://www.snort.org/downloads/snort/daq-2.0.5.tar.gz
# tar xzf daq-2.0.5.tar.gz
# cd daq-2.0.5
# ./configure && make && make install
Обновляем кэш библиотек
После установки софта из исходников желательно бы обновить кэш подключенных библиотек:
# echo /usr/lib >> /etc/ld.so.conf
# echo /usr/local/lib >> /etc/ld.so.conf
# ldconfig
Качаем и ставим сам Snort
С офсайта выясняем, что последняя версия Снорта – snort-2.9.7.3.tar.gz (на момент 14.07.2015).
# cd /usr/src
# wget https://www.snort.org/downloads/snort/snort-2.9.7.3.tar.gz
# tar xzf snort-2.9.7.3.tar.gz
# cd snort-2.9.7.3/
# ./configure --enable-sourcefire && make && make install
# mkdir /usr/local/etc/snort
# mkdir /usr/local/etc/rules
# mkdir /usr/local/lib/snort_dynamicrules
# mkdir /var/log/snort
# touch /usr/local/etc/snort/rules/white_list.rules
# touch /usr/local/etc/snort/rules/black_list.rules
# touch /usr/local/etc/snort/sid-msg.map
# groupadd snort
# useradd -g snort snort
# chown snort:snort /var/log/snort
# cp etc/*.conf* /usr/local/etc/snort/
# cp etc/*.map /usr/local/etc/snort/
Первоначальная настройка Snort
# vi /usr/local/etc/snort/snort.conf
Ищем строку ipvar HOME_NET any и меняем её на ipvar HOME_NET 192.168.1.0/24
Здесь указываем домашнюю сеть. У меня это 192.168.1.0/24, у вас может быть другая, указываете соответственно её.
Ищем строку ipvar EXTERNAL_NET any и меняем её на ipvar EXTERNAL_NET !$HOME_NET
То есть внешняя сеть – любая, не равная домашней.
Ищем строку var RULE_PATH ../rules и меняем параметр на var RULE_PATH ./rules (одна точка в пути, т.е. текущий директорий).
Аналогично и с var WHITE_LIST_PATH и с var BLACK_LIST_PATH.
Ищем строку “output unified2:” и меняем (укорачиваем) её до “output unified2: filename snort.log, limit 128”
Далее, закомментируем все строки правил (include $RULE_PATH…), кроме первой (local.rules), это для теста. Мы создадим всего одно правило, которое проверим. А позднее будем добавлять только нужные нам, дабы не генерировать кучу не совсем нужных эвентов.
Snort работает как перехватчик пакетов, анализируя содержимое каждого на ряд критериев. Критериев этих великое множество (различные аномалии трафика), поэтому лог-файлы могут разрастаться очень быстро, если включена проверка по всем правилам.
Ну и теперь откроем на редактирование этот файл локальных правил:
# vi /usr/local/etc/snort/rules/local.rules
alert icmp any any -> $HOME_NET any (msg:"PINGUSHKI"; sid:10000001; rev:1;)
Сохраним файл и запустим Snort для теста с выводом предупреждений в консоль:
# /usr/local/bin/snort -A console -q -u snort -g snort -c /usr/local/etc/snort/snort.conf -i eth0
Теперь пинганём наш хост с любого другого узла:
Готово! Наш сенсор атак уже обнаруживает попытки пропинговать кого-то в нашей сети. Ну пока ещё это не очень удобная конфигурация. Мы можем установить классификатор для перегона логов в mysql базу.
Установка Barnyard2
# cd /usr/src
# wget https://github.com/firnsy/barnyard2/archive/master.tar.gz
# tar xzf master.tar.gz
# cd barnyard2-master
# autoreconf -fvi -I ./m4
# ./configure --with-mysql --with-mysql-libraries=/usr/lib/i386-linux-gnu && make && make install
# mv /usr/local/etc/barnyard2.conf /usr/local/etc/snort
# cp schemas/create_mysql /usr/src
# mkdir /var/log/barnyard2
# chown snort:snort /var/log/barnyard2
Дальше конфигурим
# vi /usr/local/etc/snort/barnyard2.conf
Меняем пути к конфигурационным файлам согласно тем, которые мы перенесли в каталог snort-а:
А так же ищем строку output alert_fast: stdout меняем просто на output alert_fast.
В конце файла добавим строку:
output database: log, mysql, user=snort password=snortpass dbname=snort host=localhost
Разумеется, пароль вы можете указать произвольный. Дальше надо будет эту базу данных создать.
Создаем базу данных
# mysql -uroot -p<пароль>
mysql> create database snort;
Query OK, 1 row affected (0.00 sec)
mysql> grant CREATE, INSERT, SELECT, DELETE, UPDATE on snort.* to 'snort'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> SET PASSWORD FOR 'snort'@'localhost'=PASSWORD('snortpass');
Query OK, 0 rows affected (0.00 sec)
mysql> use snort;
Database changed
mysql> source /usr/src/create_mysql
Query OK, 0 rows affected (0.05 sec)
Query OK, 1 row affected (0.02 sec)
Query OK, 0 rows affected (0.04 sec)
Query OK, 0 rows affected (0.03 sec)
Query OK, 0 rows affected (0.02 sec)
Query OK, 0 rows affected (0.05 sec)
Query OK, 0 rows affected (0.02 sec)
Query OK, 0 rows affected (0.02 sec)
Query OK, 0 rows affected (0.02 sec)
Query OK, 0 rows affected (0.02 sec)
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.02 sec)
Query OK, 0 rows affected (0.01 sec)
Query OK, 1 row affected (0.02 sec)
Query OK, 1 row affected (0.01 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 0 rows affected (0.02 sec)
Query OK, 1 row affected (0.01 sec)
Query OK, 1 row affected (0.01 sec)
Готово!
mysql> quit;
Проверка связки Snort & Barnyard
# /usr/local/bin/snort -q -u snort -g snort -c /usr/local/etc/snort/snort.conf -i eth0 &
# /usr/local/bin/barnyard2 -c /usr/local/etc/snort/barnyard2.conf -d /var/log/snort -f snort.log -w /usr/local/etc/snort/bylog.waldo -C /usr/local/etc/snort/classification.config &
Пинганём аналогично предыдущему тесту. А потом завершим бэкграундную задачу:
# fg
# <Ctrl+C>
Видим ненулевую статистику по ICMP. Значит связка работает. Осталось прикрутить веб-интерфейс.
Ставим WEB-интерфейс
# cd /usr/src
# wget http://sourceforge.net/projects/secureideas/files/BASE/base-1.4.5/base-1.4.5.tar.gz
# tar xzf base-1.4.5.tar.gz
# cp -r base-1.4.5 /var/www/base
# chown -R www-data:www-data /var/www/base
Создаём конфиг:
# vi /etc/apache2/conf-enabled/base.conf
следующего содержания (временно)
Alias /base /var/www/base/
<Directory "/var/www/base/">
AllowOverride None
</Directory>
Настраиваем Apache2 на SSL
# a2enmod ssl
# cp /etc/apache2/sites-available/default-ssl /etc/apache2/sites-enabled
Далее, надо бы отключить показ замечаний:
# vi /etc/php5/apache2/php.ini
ищем строку error_reporting и устанавливаем значение в E_ALL & ~E_NOTICE для удобства отладки и сокрытия лишних сообщений.
Добавляем расширения к PHP:
# pear config-set preferred_state alpha && pear channel-update pear.php.net
# pear install --alldeps Image_Color2 Image_Canvas Image_Graph
# /etc/init.d/apache2 restart
Открываем в браузере URL: https://<IP сервера>/base
Начинаем конфигурировать.
На шаге 1 нужно будет указать путь до adodb, мы его запоминали вначале.
На шаге 2 нужно указать параметры соединения с сервером баз данных.
Далее, закроем паролем доступ к статистике:
На предложение создать базу отвечаем утвердительно и переходим на окно авторизации. Вводим данные из 3-го шага и …
Перед нами вполне удобный веб-интерфейс.
В перспективе ещё наладить автоматическое получение базы с правилами для поддержания актуальности нашего сенсора атак. Ну а пока хватит!
Регистрируемся на сайте
Процедура регистрации весьма тривиальна. Переходим в личный кабинет и видим Oinkcode
# cd /usr/src
# wget https://pulledpork.googlecode.com/files/pulledpork-0.7.0.tar.gz
# tar xzf pulledpork-0.7.0.tar.gz
# cd pulledpork-0.7.0
# cp pulledpork.pl /usr/local/bin
# cp etc/*.conf /usr/local/etc/snort
Пропишем наш oinkcode в конфигурационный файл
# vi /usr/local/etc/snort/pulledpork.conf
В строки 19, и 26 (я завуалировал фрагмент)
Меняем значение distro= в соответствии с нашей системой (строка 131), в данном случае Debian-6-0.
В 139 строке закомментируем использование Blacklist, а так же раскомментируем строки с 194 по 197.
enablesid=/usr/local/etc/snort/enablesid.conf
dropsid=/usr/local/etc/snort/dropsid.conf
disablesid=/usr/local/etc/snort/disablesid.conf
modifysid=/usr/local/etc/snort/modifysid.conf
Далее, открываем файл /usr/local/etc/snort/disablesid.conf и дописываем в конец
pcre:fwsam
Делаем скрипт pulledpork.pl исполняемым
# chmod +x /usr/local/bin/pulledpork.pl
И запускаем его на выполнение:
# /usr/local/bin/pulledpork.pl -c /usr/local/etc/snort/pulledpork.conf -T –l
… после обновления
Появился файл snort.rules!
Ну вот и всё. Теперь остаётся только убрать наше тестовое правило, почистить логи, создать скрипты запуска сервисов snort и barnyard2 в автозапуске и перезапустить сервисы.
Кстати, удалить символ комментария в редакторе vi достаточно просто.
:547,650s/#/
Строки с 547 по 650 символ # удаляется. Одной командой.
Скрипт запуска snort и barnyard2 в автозапуск:
Скрипт я позаимствовал с официального руководства:
Создаем файл
# vi /etc/init.d/snort
следующего содержания:
#! /bin/sh
#
### BEGIN INIT INFO
# Provides: snortbarn
# Required-Start: $remote_fs $syslog mysql
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# X-Interactive: true
# Short-Description: Start Snort and Barnyard
### END INIT INFO
. /lib/init/vars.sh
. /lib/lsb/init-functions
mysqld_get_param() {
/usr/sbin/mysqld --print-defaults | tr " " "\n" | grep -- "--$1" | tail -n 1 | cut -d= -f2
}
do_start()
{
log_daemon_msg "Starting Snort and Barnyard" ""
# Make sure mysql has finished starting
ps_alive=0
while [ $ps_alive -lt 1 ];
do
pidfile=`mysqld_get_param pid-file`
if [ -f "$pidfile" ] && ps `cat $pidfile` >/dev/null 2>&1; then ps_alive=1; fi
sleep 1
done
/sbin/ifconfig eth0 up
/usr/local/bin/snort -q -u snort -g snort -c /usr/local/etc/snort/snort.conf -i eth0 &
/usr/local/bin/barnyard2 -q -c /usr/local/etc/snort/barnyard2.conf -d /var/log/snort -f snort.log -w /usr/local/etc/snort/bylog.waldo -C /usr/local/etc/snort/classification.config 2> /dev/null &
log_end_msg 0
return 0
}
do_stop()
{
log_daemon_msg "Stopping Snort and Barnyard" ""
kill $(pidof snort) 2> /dev/null
kill $(pidof barnyard2) 2> /dev/null
log_end_msg 0
return 0
}
case "$1" in
start)
do_start
;;
stop)
do_stop
;;
restart)
do_stop
do_start
;;
*)
echo "Usage: snort-barn {start|stop|restart}" >&2
exit 3
;;
esac
exit 0
Всё просто, скрипт зависит от mysql службы, перед запуском проверяет, запущен ли сервис баз данных, если да, то поднимает интерфейс и запускает наши службы аналогично, как мы их проверяли до этого из командной строки.
Сохраняем, делаем его исполняемым:
# chmod +x /etc/init.d/snort
и устанавливаем как сервис:
# insserv -f -v snort
Готово!
Update. А оказывается, базовые правила в комплекте отсутствуют! Их нужно скачать с офсайта и распаковать в соответствующие каталоги.
Структура каталогов проста (rules, so_rules .. и т.д. Это мы уже видели в конфиг-файле и в каталоге /usr/local/etc/snort/ )
Проведём атаку как мы уже рассматривали в этой статье: https://litl-admin.ru/xaking/zachem-lomat-svoyu-sistemu-armitagemetasploit.html
А затем глянем логи. Кстати, текстовые логи сейчас в файле:
/var/log/barnyard2/alert
А в веб-интерфейсе:
Итак, я заметил одну неприятную вещь. Если, используя эксплоит, указывать LHOST (локальный хост), принадлежащий целевой подсети (даже сопадающий с атакуемой машиной) то Snort молчит. Вызвано это видимо тем, что он не фиксирует в логах атаки с HOME_NET. По крайней мере у меня дважды ничего не было.
Здесь у хакера простор для творчества, можно производить попытки обойти IDS. А у админа – головная боль. Надо попробовать настроить Snort так, чтобы он фиксировал соединения даже из домашней сети в домашнюю.