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

Тримати обидва — нормально, вони не конфліктують. Питання лише в тому, чи читає хтось їхній вивід частіше, ніж раз на квартал. Який вигляд ті самі сповіщення мають на одній сторінці, розділені за категорією та джерелом, показує демо нижче.