Безопасность — это не только про секьюрную настройку всего и вся. Атакующие ломают даже самые защищенные системы, а администраторы месяцами не замечают злоумышленника, который прочно закрепился в системе и сливает данные. Чтобы предотвратить такой сценарий и детектировать атаку, существуют системы обнаружения вторжений. С одной из них — опенсорсной 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
Версия 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
Дерево папок и файлов /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
Работа 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
 

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

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

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

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

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

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

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

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

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

DoS Slowloris на Kali Linux
DoS Slowloris на Kali Linux

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

Лог Snort после DoS
Лог Snort после DoS

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

Флуд сервера SYN-пакетами
Флуд сервера 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
Оповещение Snort об SQL injection
 

Заключение

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

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

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

11 комментарий

  1. Андрей Васильков

    Андрей Васильков

    15.11.2018 в 00:41

  2. Аватар

    rutkit

    15.11.2018 в 05:52

  3. Аватар

    admsevgb

    16.11.2018 в 07:33

  4. Аватар

    Artem

    22.11.2018 в 23:31

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

  5. Аватар

    mpowerfull

    16.01.2019 в 11:21

    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..

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

  6. Аватар

    Lieta

    29.01.2019 в 16:22

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

  7. Аватар

    freddy mishkin

    30.08.2019 в 22:32

    на установке Basic Analysis всё и заканчивается 🙁 . Веб страница не запускается «Не удается найти веб-страницу»

  8. Аватар

    wnbemad

    25.10.2019 в 13:33

    добрый день
    Строка 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.

Оставить мнение