Сети для акулы. Разворачиваем Snort и пишем правила

texture background template knotted nylon net fishing

Безопасность — это не только про секьюрную настройку всего и вся. Атакующие ломают даже самые защищенные системы, а администраторы месяцами не замечают злоумышленника, который прочно закрепился в системе и сливает данные. Чтобы предотвратить такой сценарий и детектировать атаку, существуют системы обнаружения вторжений. С одной из них — опенсорсной Snort — мы научимся работать в этой статье.

Почему 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

Вывод должен иметь вид, как на скриншоте.

Версия Snort

Установка закончена, погнали дальше!

Настройка в режим 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/

В итоге должна получиться вот такая структура папок и файлов.

Дерево папок и файлов /etc/snort

Комментируем все строки с 457-й по 651-ю в файле /etc/snort/snort.conf. Делается это для того, чтобы Snort при запуске не скачивал правила, поскольку для обработки правил у нас будет настройка PulledPork.

sudo sed -i 's/include \$RULE\_PATH/#include \$RULE\_PATH/' /etc/snort/snort.conf

Вносим несколько правок в этот же конфигурационный файл вручную:

  1. Строка 45: указываем нашу сеть.
  2. Строка 104: меняем на var RULE_PATH /etc/snort/rules.
  3. Строка 105: меняем на var SO_RULE_PATH /etc/snort/so_rules.
  4. Строка 106: меняем на var PREPROC_RULE_PATH /etc/snort/preproc_rules.
  5. Строка 113: меняем на var WHITE_LIST_PATH /etc/snort/rules/iplists.
  6. Строка 114: меняем на var BLACK_LIST_PATH /etc/snort/rules/iplists.
  7. Строка 546: необходимо раскомментировать include $RULE_PATH/local.rules для возможности использовать свои правила.
  8. Строка 521: ниже нее необходимо добавить строку output unified2: filename snort.u2, limit 128.
  9. Строка 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 и (если все в порядке) получаем предупреждения.

Работа Snort + Barnyard2

Установка 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 вносим следующие изменения:

  1. Строка 19: вводим свой oinkcode (rule_url=https://www.snort.org/reg-rules/|snortrules-snapshot.tar.gz).
  2. Строка 29: необходимо раскомментировать rule_url=https://rules.emergingthreats.net/|emerging.rules.tar.gz|open-nogpl.
  3. Строка 74: меняем путь к правилам на rule_path=/etc/snort/rules/snort.rules.
  4. Строка 89: меняем путь к нашим правилам на local_rules=/etc/snort/rules/local.rules.
  5. Строка 92: приводим к виду sid_msg=/etc/snort/sid-msg.ma.
  6. Строка 96: выставляем вторую версию (sid_msg_version=2).
  7. Строка 119: указываем путь к конфигу Snort (config_path=/etc/snort/snort.conf).
  8. Строка 133: указываем дистрибутив (distro=Ubuntu-16-04).
  9. Строка 141: меняем путь к black_list на /etc/snort/rules/iplists/black_list.rules.
  10. Строка 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

Тестируем Snort и пишем свои правила

Установить и проверить на работоспособность — этого мало. Необходимо его еще и просматривать. Вот давай и проверим, на что способна эта IDS с заводскими правилами. У нас есть SSH, Apache и FTP. Значит, минимальный набор правил, которые надо иметь, — это обнаруживать сканирование портов, атаку на учетные записи (brute force), DoS и SQL-инъекции.

Представим, что на этом этапе появился хакер. Он сделал свое дело и пропал, но сразу в логах отобразилась подозрительная активность с одного IP-адреса. У меня отображается 3964 события с пятью разными действиями. Посмотрев внимательнее, можно увидеть нерадужную картину.

Действия подозрительного IP

Невооруженным глазом видно сканирование портов, или, как разработчики это назвали, «разведывательную деятельность». Смотрим дальше.

Атака на 22-й порт

Виден брутфорс SSH-сервиса на 22-м порте. Так же дела обстояли и с FTP-портом (21-м).

Далее ведется расследование, просматриваем логи самой ОС, выявляем слабое звено защиты, откуда он пришел и так далее. Главное, что оповещения сработали и причастность данного IP к противоправным действиям установлена.

Давай пойдем чуть дальше. Поднимаем Kali Linux и пробуем провести DoS-атаку на наш Apache. Так как BASE работает по HTTP, самый легкий способ его «положить», как по мне, — это атака Slowloris. Поэтому скачиваем на нашу Kali соответствующий скрипт и запускаем атаку.

DoS Slowloris на Kali Linux

Через 15–30 секунд наш BASE перестает отвечать. И даже после остановки атаки пришлось перезапустить веб-сервер. Сам он за короткий промежуток времени не смог подняться. Упал только BASE. Snort, естественно, продолжал работать и записывать оповещения в базу.

Лог Snort после DoS

Вот так выглядит наш лог после атаки. Следом я попробовал зафлудить SYN-пакетами свой Snort-сервер. Проделано это было при помощи программы hping3.

Флуд сервера SYN-пакетами

К сожалению, с текущими настройками 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. В логе отобразилось оповещение с номером правила.

Оповещение Snort об SQL injection

Заключение

С моей точки зрения, NIDS необходима на предприятии. Мне встречались крупные компании, которые не утруждали себя установкой подобного звена защиты. На вопрос: «Как вы хакера обнаружите?» — я получал невнятные ответы вроде «Мне DLP скажет…».

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

Зато после всех донастроек и написания своих правил она становится довольно мощным инструментом.

8bit:

Комментарии (11)

  • + однозначно, наверное лучшее рук-во которое я читал с такой лёгкостью.

  • sudo /usr/local/bin/snort -q -u snort -g snort -c /etc/snort/snort.conf -i ens33 –D
    ERROR: Can't set DAQ BPF filter to '–D' (pcap_daq_set_filter: pcap_compile: illegal token: –)!
    Fatal Error, Quitting..

    у меня такая ошибка, помогите пожалуйста

    • У вас некорректный символ в строчке "–D". Поправьте на обычный дефис.

  • Статья хорошая, но snort за день выдал несколько тысяч предупреждений. Очевидно, что это ложные срабатывания. Большая их часть сгенерировано посылками с моего же хоста. Как все это убрать чтобы оно ловило настоящие попытки взлома?

    • Надо посмотреть какие срабатывания, и подкорректировать сами правила

  • на установке Basic Analysis всё и заканчивается :( . Веб страница не запускается "Не удается найти веб-страницу"

  • добрый день
    Строка 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, значит, все в порядке и ничего пока не сломано.

    на этот блок выдает ошибки подобно этой - ERROR: /etc/snort/snort.conf(546) Undefined variable name: RULE_PATH.

Похожие материалы