Практично кожен посібник із 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 дивиться на сам трафік і бачить те, чого в журналі не буде ніколи: сканування портів, спроби експлуатації, що збігаються з відомими сигнатурами, з’єднання до командних серверів зсередини вашої машини. Останнє особливо цінне: вихідне з’єднання до чужого командного сервера — найраніша ознака того, що на сервері вже працює щось, чого ви не запускали.
Тримати обидва — нормально, вони не конфліктують. Питання лише в тому, чи читає хтось їхній вивід частіше, ніж раз на квартал. Який вигляд ті самі сповіщення мають на одній сторінці, розділені за категорією та джерелом, показує демо нижче.