Содержание статьи
Почему Snort?
Snort — это опенсорсная система обнаружения вторжений, IDS. Она может работать как сниффер или логгер, но нас интересует именно NIDS (Network Intrusion Detection System). В таком режиме Snort проверяет все входящие пакеты на признаки известных видов сетевых атак (DDoS, сканирование портов, попытки авторизации брутфорсом и так далее).
Аналогия здесь следующая: владельцы магазинов ставят камеры, чтобы обезопасить себя от кражи. Они не помешают вскрыть замки, но зафиксируют действия воришек и помогут их поймать. Примерно так же обстоит дело с системами обнаружения вторжений, которые существуют в виде отдельных решений или компонентов систем класса Internet Security. Они не могут отразить нападение, но оповещают об атаке и помогают в расследовании инцидентов.
Долго останавливаться на описании этого продукта я не буду, так как на страницах журнала можно найти много информации о ней. Например, в статье Даниила Светлова Snort рассматривается как часть опенсорсной SIEM. Скажу лишь, почему я выбрал Snort. Этому способствовали три фактора:
- простота в написании своих правил;
- хорошая поддержка с информативной почтовой рассылкой;
- частые обновления.
Плюс к этому компания уже давно поглощена гигантом с авторитетным названием Cisco, а там ребята как минимум неплохо разбираются в сетях.
Установка Snort
Просто установить Snort не так уж хлопотно. Можно воспользоваться документацией на сайте. Мы же, как люди, которых не пугают сложности, будем устанавливать с дополнительными плюшками, которые помогут расширить возможности основного продукта.
Помимо собственно Snort, нам понадобится:
- Barnyard2;
- PulledPork;
- Basic Analysis and Security Engine (BASE).
За работу!
Устанавливать я буду октябрьский релиз Snort 2.9.12, так как Snort 3 представлен лишь бета-версией. В качестве ОС выбрана Ubuntu 16.04.1, установка на Ubuntu 16 и 18 ничем не отличаются. Есть разница в установке на Ubuntu 14, но об этом в статье говорить не будем.
Сначала настраиваем сетевой интерфейс.
INFO
Важное замечание для пользователей Ubuntu. С версии 15.10 сетевые интерфейсы уже не следуют стандарту ethХ. Поэтому корректно указывай имя своего интерфейса. Именно тут и возникает большинство проблем с конфигами.
Выбираем тот сетевой интерфейс, который будет мониторить Snort, и в конце настроек interfaces прописываем две строки для отключения Large Receive Offload и Generic Receive Offload. Это желательно сделать для уменьшения нагрузки на процессор:
post-up ethtool -K eth0 gro off
post-up ethtool -K eth0 lro off
Перезагружаем настроенный сетевой интерфейс:
sudo ifconfig enp0s3 down && sudo ifconfig enp0s3 up
Затем по стандарту — update && upgrade и ставим необходимые компоненты:
sudo apt-get install -y build-essential libpcap-dev libpcre3-dev libdumbnet-dev bison flex zlib1g-dev liblzma-dev openssl libssl-dev libnghttp2-dev.
Далее создаем папку, в которой будем намешивать исходники, солить и перчить их по вкусу. Скачиваем туда систему сбора данных (DAQ — Data AcQuisition). Это библиотека, которая заменяет прямые вызовы на функции libpcap, что облегчает работу на различных аппаратных и программных интерфейсах без необходимости вносить изменения в сам Snort.
mkdir snort
cd snort
wget https://snort.org/downloads/snort/daq-2.0.6.tar.gz
tar -xvzf daq-2.0.6.tar.gz
cd daq-2.0.6
./configure
make
sudo make install
Теперь можно поставить сам Snort.
cd ~/snort_src
wget https://www.snort.org/downloads/snort/snort-2.9.12.tar.gz
tar -xvzf snort-2.9.12.tar.gz
cd snort-2.9.12
./configure --enable-sourcefire --disable-open-appid
make
sudo make install
sudo ldconfig
sudo ln -s /usr/local/bin/snort /usr/sbin/snort
Пробуем вывести версию Snort для того, чтобы убедиться, что все взлетело и работает.
/usr/sbin/snort –V
Вывод должен иметь вид, как на скриншоте.
Установка закончена, погнали дальше!
Настройка в режим IDS
О безопасности необходимо помнить всегда, но мы-то не постоянно за компьютером. Поэтому создадим пользователя для Snort.
sudo groupadd snort
sudo useradd snort -r -s /sbin/nologin -c SNORT_IDS -g snort
Теперь создаем необходимые папки и раздаем права:
sudo mkdir /etc/snort
sudo mkdir /etc/snort/rules
sudo mkdir /etc/snort/rules/iplists
sudo mkdir /etc/snort/preproc_rules
sudo mkdir /usr/local/lib/snort_dynamicrules
sudo mkdir /etc/snort/so_rules
sudo touch /etc/snort/rules/iplists/black_list.rules
sudo touch /etc/snort/rules/iplists/white_list.rules
sudo touch /etc/snort/rules/local.rules
sudo touch /etc/snort/sid-msg.map
sudo mkdir /var/log/snort
sudo mkdir /var/log/snort/archived_logs
sudo chmod -R 5775 /etc/snort
sudo chmod -R 5775 /var/log/snort
sudo chmod -R 5775 /var/log/snort/archived_logs
sudo chmod -R 5775 /etc/snort/so_rules
sudo chmod -R 5775 /usr/local/lib/snort_dynamicrules
sudo chown -R snort:snort /etc/snort
sudo chown -R snort:snort /var/log/snort
sudo chown -R snort:snort /usr/local/lib/snort_dynamicrules
Распихаем конфигурационные файлы и файлы настроек по нужным папкам:
cd ~/snort/snort-2.9.12/etc/
sudo cp *.conf* /etc/snort
sudo cp *.map /etc/snort
sudo cp *.dtd /etc/snort
cd ~/snort/snort-2.9.12/src/dynamic-preprocessors/build/usr/local/lib/snort_dynamicpreprocessor/
sudo cp * /usr/local/lib/snort_dynamicpreprocessor/
В итоге должна получиться вот такая структура папок и файлов.
Комментируем все строки с 457-й по 651-ю в файле /etc/snort/snort.conf
. Делается это для того, чтобы Snort при запуске не скачивал правила, поскольку для обработки правил у нас будет настройка PulledPork.
sudo sed -i 's/include \$RULE\_PATH/#include \$RULE\_PATH/' /etc/snort/snort.conf
Вносим несколько правок в этот же конфигурационный файл вручную:
- Строка 45: указываем нашу сеть.
- Строка 104: меняем на
var RULE_PATH /etc/snort/rules
. - Строка 105: меняем на
var SO_RULE_PATH /etc/snort/so_rules
. - Строка 106: меняем на
var PREPROC_RULE_PATH /etc/snort/preproc_rules
. - Строка 113: меняем на
var WHITE_LIST_PATH /etc/snort/rules/iplists
. - Строка 114: меняем на
var BLACK_LIST_PATH /etc/snort/rules/iplists
. - Строка 546: необходимо раскомментировать
include $RULE_PATH/local.rules
для возможности использовать свои правила. - Строка 521: ниже нее необходимо добавить строку
output unified2: filename snort.u2, limit 128
. - Строка 548: необходимо добавить строку
include $RULE_PATH/snort.rules
.
Правок много, и в них легко ошибиться. К счастью, Snort умеет проверять файл конфигурации. Рекомендую это делать после каждого ковыряния в конфиге.
sudo snort -T -c /etc/snort/snort.conf -i enp0s3
Если видишь заветные слова Snort successfully validated the configuration! Snort exiting
, значит, все в порядке и ничего пока не сломано.
Установка Barnyard2
Barnyard2 — это спулер, который поможет снизить нагрузку на сервер. Для его установки сперва ставим необходимые компоненты:
sudo apt-get install -y mysql-server libmysqlclient-dev mysql-client autoconf libtool
Обрати внимание, что во время установки MySQL попросит ввести пароль для root
. Поэтому не отходи от компа надолго.
Затем ставим сам Barnyard2:
cd ~/snort_src
wget https://github.com/firnsy/barnyard2/archive/master.tar.gz -O barnyard2-Master.tar.gz
tar zxvf barnyard2-Master.tar.gz
cd barnyard2-master
autoreconf -fvi -I ./m4
sudo ln -s /usr/include/dumbnet.h /usr/include/dnet.h
sudo ldconfig
./configure --with-mysql --with-mysql-libraries=/usr/lib/i386-linux-gnu
make
sudo make install
Проверяем, не отвернулась ли от нас фортуна:
/usr/local/bin/barnyard2 -V
Снова копируем файлы из исходного пакета, создаем файлы и раздаем права:
sudo cp ~/snort/barnyard2-master/etc/barnyard2.conf /etc/snort/
sudo mkdir /var/log/barnyard2
sudo chown snort.snort /var/log/barnyard2
sudo touch /var/log/snort/barnyard2.waldo
sudo chown snort.snort /var/log/snort/barnyard2.waldo
Теперь придется поработать с MySQL:
mysql -u root -p
mysql> create database snort;
mysql> use snort;
mysql> source ~/snort/barnyard2-master/schemas/create_mysql
mysql> CREATE USER 'snort'@'localhost' IDENTIFIED BY 'snortpass';
mysql> grant create, insert, select, delete, update on snort.* to 'snort'@'localhost';
mysql> exit
Добавляем в конец файла /etc/snort/barnyard2.conf
строку output database: log, mysql, user=snort password=snortpass dbname=snort host=localhost sensor name=sensor01
. И снова манипуляция с правами:
sudo chmod o-r /etc/snort/barnyard2.conf
Теперь проверим все, что сделали раньше. В файл /etc/snort/rules/local.rules
добавляем строчку
alert icmp any any -> $HOME_NET any (msg:"ICMP test detected"; GID:1; sid:10000001; rev:001; classtype:icmp-event;)
Это будет наше правило на проверку пинга (ICMP-пакеты). Дописываем две строки в файл /etc/snort/sid-msg.map
:
`#v2`
1 || 10000001 || 001 || icmp-event || 0 || ICMP Test detected || url,tools.ietf.org/html/rfc792
В описании релиза Barnyard можно прочесть подробнее, что и как.
Запустим Snort в режиме демона (он так и будет работать всегда).
sudo /usr/local/bin/snort -q -u snort -g snort -c /etc/snort/snort.conf -i enp0s3 –D
Потом запустим Barnyard2:
sudo barnyard2 -c /etc/snort/barnyard2.conf -d /var/log/snort -f snort.u2 -w /var/log/snort/barnyard2.waldo -g snort -u snort
Пингуем наш Snort-server и (если все в порядке) получаем предупреждения.
Установка PulledPork
Пришло время загрузить правила для Snort. Этим займется скрипт под названием PulledPork. Давай его поставим.
sudo apt-get install -y libcrypt-ssleay-perl liblwp-useragent-determined-perl
cd ~/snort
wget https://github.com/shirkdog/pulledpork/archive/master.tar.gz -O pulledpork-master.tar.gz
tar xzvf pulledpork-master.tar.gz
cd pulledpork-master/
sudo cp pulledpork.pl /usr/local/bin
sudo chmod +x /usr/local/bin/pulledpork.pl
sudo cp etc/*.conf /etc/snort
Теперь нам необходимо зайти на сайт Snort. Регистрируемся и в своем аккаунте отыскиваем идентификатор oinkcode
.
Переходим к настройкам PulledPork. В файл /etc/snort/pulledpork.conf
вносим следующие изменения:
- Строка 19: вводим свой oinkcode (
rule_url=https://www.snort.org/reg-rules/|snortrules-snapshot.tar.gz
). - Строка 29: необходимо раскомментировать
rule_url=https://rules.emergingthreats.net/|emerging.rules.tar.gz|open-nogpl
. - Строка 74: меняем путь к правилам на
rule_path=/etc/snort/rules/snort.rules
. - Строка 89: меняем путь к нашим правилам на
local_rules=/etc/snort/rules/local.rules
. - Строка 92: приводим к виду
sid_msg=/etc/snort/sid-msg.ma
. - Строка 96: выставляем вторую версию (
sid_msg_version=2
). - Строка 119: указываем путь к конфигу Snort (
config_path=/etc/snort/snort.conf
). - Строка 133: указываем дистрибутив (
distro=Ubuntu-16-04
). - Строка 141: меняем путь к
black_list
на/etc/snort/rules/iplists/black_list.rules
. - Строка 150: приводим к виду
IPRVersion=/etc/snort/rules/iplists
.
Запускаем PulledPork:
sudo /usr/local/bin/pulledpork.pl -c /etc/snort/pulledpork.conf –l
Наблюдаем, как скачиваются правила. Проверяем, как отработает наш Snort после изменения конфига.
sudo snort -T -c /etc/snort/snort.conf -i enp0s3
Наш PulledPork сам будет проверять наличие обновлений и скачивать правила. Необходимо только добавить команду на его запуск в планировщик:
sudo crontab -e
03 02 * * * /usr/local/bin/pulledpork.pl -c /etc/snort/pulledpork.conf -l
Обращу внимание, что команда разработчиков Snort просит рандомно указывать время обращения загрузчика, чтобы распределить нагрузку на канал.
Установка Basic Analysis and Security Engine
Остался всего один небольшой шаг — установить графический визуализатор, дабы лицезреть обстановку сети в человеческом виде. Приступаем.
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get install -y apache2 libapache2-mod-php5.6 php5.6-mysql php5.6-cli php5.6 php5.6-common php5.6-gd php5.6-cli php-pear php5.6-xml
sudo pear install -f --alldeps Image_Graph
Загружаем библиотеку ADODB:
cd ~/snort
wget https://sourceforge.net/projects/adodb/files/adodb-php5-only/adodb-520-for-php5/adodb-5.20.8.tar.gz
tar -xvzf adodb-5.20.8.tar.gz
sudo mv adodb5 /var/adodb
sudo chmod -R 755 /var/adodb
Загружаем BASE:
cd ~/snort
wget http://sourceforge.net/projects/secureideas/files/BASE/base-1.4.5/base-1.4.5.tar.gz
tar xzvf base-1.4.5.tar.gz
sudo mv base-1.4.5 /var/www/html/base/
Копируем конфигурационный файл:
cd /var/www/html/base
sudo cp base_conf.php.dist base_conf.php
И приводим некоторые строки в файле /var/www/html/base/base_conf.php
к образцам:
$BASE_urlpath = '/base';
$DBlib_path = '/var/adodb/';
$alert_dbname = 'snort';
$alert_host = 'localhost';
$alert_port = '';
$alert_user = 'snort';
$alert_password = 'snortpass';
Естественно, необходимо изменить права, чтобы никто не увидел пароль в файле:
sudo chown -R www-data:www-data /var/www/html/base
sudo chown -R www-data:www-data /var/www/html/base
Перезапускаем Apache. Открываем браузер и идем по адресу (айпишник указывай свой) http://192.168.1.20/base/index.php
. Нажимаем кнопку Create BASE AG в правом верхнем углу. В случае успеха будут созданы базовые таблицы, роли и все, что необходимо для дальнейшей работы.
Создаем службы
Вишенкой на нашем торте будет создание служб из Snort и Barnyard2 с добавлением их в автозапуск. Для Snort необходимо создать файл /lib/systemd/system/snort.service
с таким содержимым:
[Unit]
Description=Snort NIDS Daemon
After=syslog.target network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/snort -q -u snort -g snort -c /etc/snort/snort.conf -i enp0s3
[Install]
WantedBy=multi-user.target
Скажем системе, что службу надо запускать при загрузке:
sudo systemctl enable snort
И запустим службу:
sudo systemctl start snort
Введем команду для проверки статуса службы:
systemctl status snort
Для второй будущей службы необходимо создать файл /lib/systemd/system/barnyard2.service
и прописать в нем следующие строки:
[Unit]
Description=Barnyard2 Daemon
After=syslog.target network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/barnyard2 -c /etc/snort/barnyard2.conf -d /var/log/snort -f snort.u2 -q -w /var/log/snort/barnyard2.waldo -g snort -u snort -D -a /var/log/snort/archived_logs
[Install]
WantedBy=multi-user.target
Затем повторим команды:
sudo systemctl enable barnyard2
sudo systemctl start barnyard2
systemctl status barnyard2
Перезагружаем нашу систему и убеждаемся, что все запущено.
Отслеживаем действия в сети
Для проверки работоспособности я взял немного неординарное задание, чтобы показать чуть больше возможностей Snort. К примеру, нам необходимо отследить посещение сайта www.xakep.ru
каким-то пользователем (любым из локальной сети). Для этого нам нужно создать правило, которое отслеживало бы это действие. Оно будет выглядеть следующим образом:
alert tcp any any -> any any (content: "www.xakep.ru"; msg: "Someone is visiting site now"; sid:1000008; rev:1)
Запишем его в /etc/snort/rules/local.rules
и перезапустим мониторинг. Так как Snort у меня отслеживает только мой сервер, я вышел на сайт при помощи Links с сервера.
В результате мы увидели несколько оповещений — столько, сколько раз я подключался к данному домену. Если неверно написать правило, Snort не запустится, выдав ошибку и описание, почему он не сможет запуститься.
Тестируем Snort и пишем свои правила
Установить и проверить на работоспособность — этого мало. Необходимо его еще и просматривать. Вот давай и проверим, на что способна эта IDS с заводскими правилами. У нас есть SSH, Apache и FTP. Значит, минимальный набор правил, которые надо иметь, — это обнаруживать сканирование портов, атаку на учетные записи (brute force), DoS и SQL-инъекции.
Представим, что на этом этапе появился хакер. Он сделал свое дело и пропал, но сразу в логах отобразилась подозрительная активность с одного IP-адреса. У меня отображается 3964 события с пятью разными действиями. Посмотрев внимательнее, можно увидеть нерадужную картину.
Невооруженным глазом видно сканирование портов, или, как разработчики это назвали, «разведывательную деятельность». Смотрим дальше.
Виден брутфорс SSH-сервиса на 22-м порте. Так же дела обстояли и с FTP-портом (21-м).
Далее ведется расследование, просматриваем логи самой ОС, выявляем слабое звено защиты, откуда он пришел и так далее. Главное, что оповещения сработали и причастность данного IP к противоправным действиям установлена.
Давай пойдем чуть дальше. Поднимаем Kali Linux и пробуем провести DoS-атаку на наш Apache. Так как BASE работает по HTTP, самый легкий способ его «положить», как по мне, — это атака Slowloris. Поэтому скачиваем на нашу Kali соответствующий скрипт и запускаем атаку.
Через 15–30 секунд наш BASE перестает отвечать. И даже после остановки атаки пришлось перезапустить веб-сервер. Сам он за короткий промежуток времени не смог подняться. Упал только BASE. Snort, естественно, продолжал работать и записывать оповещения в базу.
Вот так выглядит наш лог после атаки. Следом я попробовал зафлудить SYN-пакетами свой Snort-сервер. Проделано это было при помощи программы hping3.
К сожалению, с текущими настройками Snort не в состоянии был определить такого рода атаку и в логах ничего не показал. Пришлось смотреть через tcpdump, идут ли пакеты на сервер вообще.
Следующим этапом я натравил sqlmap на BASE по запросу http://192.168.1.20/base/base_stat_alerts.php?sensor=1. К сожалению, это тоже не дало результатов: подходящих правил определения атак на базу данных в дефолтной подборке Snort нет. Значит, нужно написать правило самому. В нашем примере оно выглядит следующим образом:
alert tcp any any -> any any (msg: "SQL Injection"; content: "GET"; http_method; uricontent: "and 1=1"; nocase; sid:3000001; rev:1;)
Теперь зайдем на web-интерфейс с компьютера атакующего и попробуем проэксплуатировать данный метод, добавив в конце запроса and 1=1
. В логе отобразилось оповещение с номером правила.
Заключение
С моей точки зрения, NIDS необходима на предприятии. Мне встречались крупные компании, которые не утруждали себя установкой подобного звена защиты. На вопрос: «Как вы хакера обнаружите?» — я получал невнятные ответы вроде «Мне DLP скажет…».
Snort всего лишь система обнаружения сетевых атак. В связке с нерадивым администратором она просто бесполезна. Сразу после установки Snort запускается ненастроенной, с большим количеством включенных правил, что вызывает море ложных срабатываний. Да и установка (если по уму делать) не из самых простых. Дорабатывать ее надо конкретно под свои задачи.
Зато после всех донастроек и написания своих правил она становится довольно мощным инструментом.