После первой версии дашборда я понял, что сам по себе список заблокированных IP — это только половина истории.
CrowdSec отлично знает, кого и за что заблокировал. Nginx отлично знает, какой запрос в этот момент пришёл на сервер.
А вот посмотреть на эти две вещи вместе оказалось гораздо интереснее.
Поэтому BAN LOG теперь связывает события CrowdSec с реальными HTTP-запросами из Nginx.
То есть вместо условного:
«IP заблокирован за подозрительную активность»
можно увидеть примерно:
«Вот этот IP, вот в это время, отправил такой-то запрос, на такой-то адрес VPS, а Nginx ответил таким-то HTTP-кодом».
Причём здесь пришлось немного подумать о сопоставлении.
Недостаточно просто найти ближайшую запись с таким же IP. Иначе два похожих запроса, пришедших практически одновременно, вполне могут случайно «познакомиться» друг с другом.
Поэтому для связи используются сразу несколько признаков: IP источника, HTTP-метод, точный путь запроса и небольшой временной интервал.
Именно «точный путь» здесь довольно важен.
Например, /foo/.env.dev и /foo/.env.development — это для человека две похожие строки.
Для логики корреляции это два совершенно разных запроса.
Иначе однажды можно получить очень уверенный технический отчёт о событии, которого на самом деле не было.
Отдельно пришлось учитывать и запросы, которые приходят не на доменное имя, а непосредственно на IP VPS.
В Nginx для таких случаев используется default server, поэтому в журнале может фигурировать _.
Для дашборда это малоинформативно, поэтому такие события отображаются уже с фактическим публичным IP VPS.
Получается немного забавная картина.
Один журнал говорит:
«Вот человек пришёл».
Второй:
«Вот что он сделал».
А дашборд теперь пытается аккуратно выяснить:
«Так, господа, вы случайно не об одном и том же событии говорите?»
Причём всё это работает без изменения основной конфигурации логирования Nginx.
Данные просто сопоставляются уже на стороне самого дашборда.
В итоге BAN LOG стал для меня гораздо полезнее: это уже не просто список решений CrowdSec, а небольшой журнал того, что реально происходило на HTTP-уровне VPS.
И особенно приятно, что большая часть этой работы вообще не видна пользователю.
Никаких новых графиков на полэкрана, анимации, разноцветных индикаторов и очередного «AI-powered security overview».
Просто несколько логов, несколько точных условий и немного занудства.
Иногда именно так и получается нормальный технический инструмент.
А интернет тем временем продолжает присылать бесплатные тестовые данные.
За что ему, в общем-то, отдельное спасибо.