Практически любое руководство по Suricata заканчивается установкой Elasticsearch, Logstash и Kibana. Для одного VPS это плохой совет: связка попросит четыре гигабайта памяти и постоянного присмотра, а вы всего лишь хотели видеть, что IDS поймала за сутки. Suricata прекрасно работает и без них — но у неё есть особенность, из-за которой её ставят и через неделю сносят.
Мина в настройках по умолчанию
Из коробки Suricata пишет в eve.json три с лишним десятка типов событий: не только оповещения, но и каждый DNS-запрос, каждое TLS-рукопожатие, каждую HTTP-транзакцию, ARP, DHCP, поток за потоком. Плюс отдельный stats.log раз в восемь секунд. Ротацию логов Suricata при этом не настраивает вообще — это задача администратора, о которой нигде не написано крупно.
Цифра с реального сервера: 15 гигабайт за двое суток — девять в eve.json и почти шесть в stats.log. До полного диска оставалось около пяти дней. Трафика на сервере при этом было немного; на нагруженном узле счёт пошёл бы на часы.
Проверьте у себя прямо сейчас:
sudo du -sh /var/log/suricata/*
Оставить только то, что читаете
Если вы смотрите оповещения, а не занимаетесь сетевой форензикой, из eve-log нужен ровно один тип событий. В /etc/suricata/suricata.yaml найдите блок outputs и в types у eve-log оставьте alert, остальное закомментируйте. Там же отключите вывод статистики:
- stats:
enabled: no
После правки — обязательная проверка конфига, до перезапуска службы:
sudo suricata -T -c /etc/suricata/suricata.yaml -v
Важен порядок: тест не пройдёт, если правила ещё не загружены. Сначала suricata-update, потом проверка конфига, потом запуск.
Ротация, которая на самом деле работает
Файл /etc/logrotate.d/suricata:
/var/log/suricata/*.log /var/log/suricata/*.json {
daily
rotate 7
maxsize 200M
missingok
compress
delaycompress
create 0664 suricata suricata
su suricata suricata
postrotate
systemctl kill -s HUP suricata
endscript
}
Две строки здесь неочевидны и обе критичны.
su suricata suricata — без неё logrotate молча пропустит все файлы. Каталог /var/log/suricata принадлежит группе suricata, а не root, и logrotate считает такую конфигурацию небезопасной. Ошибки в почте не будет, в логе — тоже; вы просто будете уверены, что ротация есть, пока не кончится диск. Единственный способ поймать это заранее — прогнать вхолостую:
sudo logrotate -d /etc/logrotate.d/suricata
create 0664 suricata suricata — права на новый файл. С правами по умолчанию (0640) любая панель или скрипт, читающий логи не от root, после первой же ротации увидит пустоту.
Что настроить, кроме логов
HOME_NET. Это описание того, что Suricata считает «своим». Значение по умолчанию перечисляет все приватные диапазоны, а у VPS адрес публичный — в результате часть правил не срабатывает или срабатывает наоборот. Укажите свою сеть явно.
Правила. Набор Emerging Threats Open подтягивается командой suricata-update, её ставят в cron раз в сутки. Отдельные шумные сигнатуры отключаются в /etc/suricata/disable.conf по идентификатору — не бойтесь этим пользоваться: набор рассчитан на корпоративную сеть, и десяток правил на обычном веб-сервере будет срабатывать постоянно и без причины.
Режим. По умолчанию Suricata слушает копию трафика и только предупреждает (IDS). Режим блокировки (IPS, через nfqueue) на единственном сервере — риск в первую очередь для вас самих: одно ложное срабатывание, и вы сами себе закрыли доступ. Начните с наблюдения, месяц посмотрите, что ловится.
Как читать без Kibana
Короткие оповещения лежат в /var/log/suricata/fast.log — одна строка на событие, читается глазами:
sudo tail -50 /var/log/suricata/fast.log
Подробности — в eve.json, по одному JSON-объекту на строку. Всё, ради чего обычно ставят Kibana, делается одной командой:
sudo jq -r 'select(.event_type=="alert") | .alert.signature' \
/var/log/suricata/eve.json | sort | uniq -c | sort -rn | head -20
Это двадцать самых частых сигнатур. Такой список за неделю честно отвечает на вопрос, что вообще происходит с сервером, и заодно показывает, какие правила пора отключить.
Зачем это, если уже есть Fail2ban
Разная природа. Fail2ban читает логи приложений и реагирует на неудачные входы — то есть на то, что уже дошло до службы. Suricata смотрит сам трафик и видит то, чего в логах не будет: сканирование портов, попытки эксплойтов по известным сигнатурам, обращения к управляющим серверам изнутри вашей машины. Последнее особенно ценно: исходящее соединение к чужому C2 — самый ранний признак того, что что-то на сервере уже запущено не вами.
Держать оба инструмента нормально, они не конфликтуют. Вопрос лишь в том, чтобы кто-то читал их вывод чаще, чем раз в квартал. Как выглядят те же оповещения на одной странице, с разбивкой по категориям и источникам, — на демо ниже.