Информационная безопасность — это не только про секьюрную настройку всего и вся. Хакеры взламывают даже самые надежные системы, а админы годами не замечают атакующего, который крепко закрепился в системе и сливает информацию. Чтобы предотвратить такой сценарий и детектировать атаку, существуют системы обнаружения вторжений IDS. В статье я расскажу, как работать с одной из таких. Наглядно покажу как установить, настроить и использовать Snort.
Почему именно Snort?
Snort — это опенсорсная система обнаружения вторжений, IDS. Она может работать как сниффер или логгер, но нас интересует именно NIDS (Network Intrusion Detection System). В таком режиме Snort проверяет все входящие пакеты на признаки известных видов сетевых атак (DDoS, сканирование портов, попытки авторизации брутфорсом и так далее).
Аналогия здесь следующая: владельцы магазинов ставят камеры, чтобы обезопасить себя от кражи. Они не помешают вскрыть замки, но зафиксируют действия воришек и помогут их поймать. Примерно так же обстоит дело с системами обнаружения вторжений IDS, которые существуют в виде отдельных решений или компонентов систем класса Internet Security. Они не могут отразить нападение, но оповещают об атаке и помогают в расследовании инцидентов.
Долго останавливаться на описании этого продукта я не буду. Скажу лишь, почему я выбрал 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, но об этом в статье говорить не будем.
Сначала настраиваем сетевой интерфейс.
Важное замечание для пользователей Ubuntu. С версии 15.10 сетевые интерфейсы уже не следуют стандарту ethХ. Поэтому корректно указывай имя своего интерфейса. Именно тут и возникает большинство проблем с конфигами.
Выбираем тот сетевой интерфейс, который будет мониторить Snort, и в конце настроек interfaces прописываем две строки для отключения Large Receive Offload и Generic Receive Offload. Это желательно сделать для уменьшения нагрузки на процессор:
1 2 |
post-up ethtool -K eth0 gro off post-up ethtool -K eth0 lro off |
Перезагружаем настроенный сетевой интерфейс:
1 |
sudo ifconfig enp0s3 down && sudo ifconfig enp0s3 up |
Затем по стандарту — update && upgrade и ставим необходимые компоненты:
1 |
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.
1 2 3 4 5 6 7 8 |
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.
1 2 3 4 5 6 7 8 9 |
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 для того, чтобы убедиться, что все взлетело и работает.
1 |
/usr/sbin/snort –V |
Вывод должен иметь вид, как на скриншоте.
Установка закончена, погнали дальше!
Настройка в режим IDS
О безопасности необходимо помнить всегда, но мы-то не постоянно за компьютером. Поэтому создадим пользователя для Snort.
1 2 |
sudo groupadd snort sudo useradd snort -r -s /sbin/nologin -c SNORT_IDS -g snort |
Теперь создаем необходимые папки и раздаем права:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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 |
Распихаем конфигурационные файлы и файлы настроек по нужным папкам:
1 2 3 4 5 6 |
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.
1 |
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 умеет проверять файл конфигурации. Рекомендую это делать после каждого ковыряния в конфиге.
1 |
sudo snort -T -c /etc/snort/snort.conf -i enp0s3 |
Если видишь заветные слова Snort successfully validated the configuration! Snort exiting, значит, все в порядке и ничего пока не сломано.
Установка Barnyard2
Barnyard2 — это спулер, который поможет снизить нагрузку на сервер. Для его установки сперва ставим необходимые компоненты:
1 |
sudo apt-get install -y mysql-server libmysqlclient-dev mysql-client autoconf libtool |
Обрати внимание, что во время установки MySQL попросит ввести пароль для root. Поэтому не отходи от компа надолго.
Затем ставим сам Barnyard2:
1 2 3 4 5 6 7 8 9 10 |
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 |
Проверяем, не отвернулась ли от нас фортуна:
1 |
/usr/local/bin/barnyard2 -V |
Снова копируем файлы из исходного пакета, создаем файлы и раздаем права:
1 2 3 4 5 |
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:
1 2 3 4 5 6 7 |
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. И снова манипуляция с правами:
1 |
sudo chmod o-r /etc/snort/barnyard2.conf |
Теперь проверим все, что сделали раньше. В файл /etc/snort/rules/local.rules добавляем строчку
1 |
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:
1 2 |
`#v2` 1 || 10000001 || 001 || icmp-event || 0 || ICMP Test detected || url,tools.ietf.org/html/rfc792 |
В описании релиза Barnyard можно прочесть подробнее, что и как.
Запустим Snort в режиме демона (он так и будет работать всегда).
1 |
sudo /usr/local/bin/snort -q -u snort -g snort -c /etc/snort/snort.conf -i enp0s3 –D |
Потом запустим Barnyard2:
1 |
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. Давай его поставим.
1 2 3 4 5 6 7 8 9 |
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:
1 |
sudo /usr/local/bin/pulledpork.pl -c /etc/snort/pulledpork.conf –l |
Наблюдаем, как скачиваются правила. Проверяем, как отработает наш Snort после изменения конфига.
1 |
sudo snort -T -c /etc/snort/snort.conf -i enp0s3 |
Наш PulledPork сам будет проверять наличие обновлений и скачивать правила. Необходимо только добавить команду на его запуск в планировщик:
1 2 |
sudo crontab -e 03 02 * * * /usr/local/bin/pulledpork.pl -c /etc/snort/pulledpork.conf -l |
Обращу внимание, что команда разработчиков Snort просит рандомно указывать время обращения загрузчика, чтобы распределить нагрузку на канал.
Установка Basic Analysis and Security Engine
Остался всего один небольшой шаг — установить графический визуализатор, дабы лицезреть обстановку сети в человеческом виде. Приступаем.
1 2 3 4 |
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:
1 2 3 4 5 |
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:
1 2 3 4 |
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/ |
Копируем конфигурационный файл:
1 2 |
cd /var/www/html/base sudo cp base_conf.php.dist base_conf.php |
И приводим некоторые строки в файле /var/www/html/base/base_conf.php к образцам:
1 2 3 4 5 6 7 |
$BASE_urlpath = '/base'; $DBlib_path = '/var/adodb/'; $alert_dbname = 'snort'; $alert_host = 'localhost'; $alert_port = ''; $alert_user = 'snort'; $alert_password = 'snortpass'; |
Естественно, необходимо изменить права, чтобы никто не увидел пароль в файле:
1 2 |
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 с содержимым:
1 2 3 4 5 6 7 8 9 10 |
[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 |
Скажем системе, что службу надо запускать при загрузке:
1 |
sudo systemctl enable snort |
И запустим службу:
1 |
sudo systemctl start snort |
Введем команду для проверки статуса службы:
1 |
systemctl status snort |
Для второй будущей службы необходимо создать файл /lib/systemd/system/barnyard2.service и прописать в нем следующие строки:
1 2 3 4 5 6 7 8 9 10 |
[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 |
Затем повторим команды:
1 2 3 |
sudo systemctl enable barnyard2 sudo systemctl start barnyard2 systemctl status barnyard2 |
Перезагружаем нашу систему и убеждаемся, что все запущено.
Отслеживаем действия в сети
Для проверки работоспособности я взял немного неординарное задание, чтобы показать чуть больше возможностей Snort. К примеру, нам необходимо отследить посещение сайта www.tech-geek.ru каким-то пользователем (любым из локальной сети). Для этого нам нужно создать правило, которое отслеживало бы это действие. Оно будет выглядеть следующим образом:
1 |
alert tcp any any -> any any (content: "www.tech-geek.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 нет. Значит, нужно написать правило самому. В нашем примере оно выглядит следующим образом:
1 |
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 запускается ненастроенной, с большим количеством включенных правил, что вызывает море ложных срабатываний. Да и установка (если по уму делать) не из самых простых. Дорабатывать ее надо конкретно под свои задачи.
Зато после всех донастроек и написания своих правил она становится довольно мощным инструментом.
Подскажите пожалуйста, что не так я сделал
ERROR: /etc/snort/snort.conf(547) => Bad character included in the User defined method: /etc/snort/rules/local.rules.Make sure space before and after ‘}’.
Fatal Error, Quitting..