Распределённый движок обработки событий безопасности для любого HTTP-сервера — и не только
Умный, универсальный, распределённый движок безопасности: поведенческая детекция вместо статических правил, любой источник логов на входе, любой пункт назначения на выходе, любой язык для собственных плагинов. Масштабируйтесь от одного VPS до распределённого флота — собирайте события на одной машине, скорируйте на другой, баньте на третьей — через встроенную шифрованную сетку узлов. Bare-metal, Docker Compose или Kubernetes DaemonSet.
Восемь поведенческих детекторов скорят паттерны — зондирование, аномалии частоты запросов, соотношение bruteforce, последовательный краулинг — вместо сверки со статическими сигнатурами. Легитимные краулеры верифицируются через rDNS/fDNS и никогда не скорятся.
Любой источник логов на входе (файл, stdin, syslog, HTTP push/pull в 9 вендорских форматах), любой пункт назначения на выходе (Fail2Ban, Cloudflare WAF, файерволы MikroTik/OpenWrt/OPNsense, Loki/Splunk/Datadog), любой язык для собственного плагина через exec+JSON.
Один процесс обслуживает N независимых потоков логов, у каждого — свой pipeline источников, детекторов и sink'ов — от одного nginx vhost до флота edge-узлов, без запуска отдельного процесса на каждый сайт.
Собирайте на одной машине, скорируйте на другой, баньте на третьей — через встроенную шифрованную QUIC/TLS 1.3 сетку узлов с Ed25519-идентичностью и TOFU-пиннингом. Без брокера сообщений, без log shipper'а, без VPN.
Шесть серверов поддерживаются нативно — nginx работает без настройки. Каждый другой сервер включается одной строкой профиля. Работает за любым прокси или Cloudflare — всегда фиксирует реального атакующего, а не CDN или балансировщик.
nginx combined log format работает из коробки — профиль не нужен.
Стандартный CLF — изменения на сервере не нужны.
Стандартный access log (CLF) — настройка не требуется.
Apache CLF по умолчанию — изменения на сервере не нужны.
Требует xcaddy + плагин transform-encoder для CLF-вывода.
Требует option httplog в haproxy.cfg + rsyslog для записи в файл.
Правила вычисляются первыми. Совпавшее pass-правило обрывает весь пайплайн — healthcheck'и, внутренние IP и доверенные боты пропускаются мгновенно, без лишних проверок.
SQLi, path traversal, сигнатуры сканеров — совпавшие запросы отсекаются на входе и не доходят до скорера. Состояние не выделяется, детекторы заведомо плохой трафик не обрабатывают.
Подозрительный, но неоднозначный трафик получает метку и прибавку к счёту, затем идёт дальше в pipeline. Комбинируй WAF-сигналы с поведенческими детекторами для коррелированных решений о бане.
Расширяй пространство правил собственными полями http.* — два изменения в Go, без перекомпиляции ядра. Добавь версию TLS, длину тела запроса или любое поле из своего источника логов.
Каждый детектор добавляет очки к счёту IP. Score затухает линейно за время observation_window — никаких ложных банов от старого трафика.
Запросы к чувствительным путям: /.env, /.git/config, /.aws/credentials, /wp-config.php, /phpinfo.php, панели администратора, резервные архивы и ещё 30+. Активная разведка — срабатывает немедленно на первом запросе.
Более 100 запросов за 60 секунд с одного IP. Выявляет DDoS-зондирование, агрессивные сканеры уязвимостей, всплески перебора учётных данных и скраперы, пытающиеся держаться ниже статических ограничений.
Регистронезависимое сравнение подстрок с встроенными списками: сканеры (Nuclei, sqlmap...), граберы (Scrapy, HTTrack...) и клиенты автоматизации (python-requests, curl...). Легко расширяется через конфиг.
Более 60% ответов — 404 при минимум 10 запросах. Типичная сигнатура инструментов перебора путей (dirbuster, gobuster, ffuf). min_requests предотвращает ложные срабатывания.
Пять и более последовательно пронумерованных URL подряд — /page/1, /page/2, /article/100... Характерный признак автоматических скраперов, дампящих целые разделы сайта.
Загружает страницы, но запрашивает CSS, JS или изображения менее чем в 10% случаев — при минимум 3 просмотрах. Реальный браузер всегда загружает ресурсы; markup-only боты пропускают статику.
URL длиннее 2048 символов или содержащий известные ключевые слова обхода WAF: bypass, shell, cmd, eval, exec... Нацелен на переполнения буфера и инъекции кода.
Сравнивает User-Agent (и опционально Referer) с community-maintained списком ~685 известных плохих ботов: скраперы, SEO-краулеры, спам-боты, сканеры уязвимостей. Список обновляется ежедневно. Основан на nginx-ultimate-bad-bot-blocker — проекте Mitchell Krog и его команды.
Googlebot, Bingbot, Яндекс, DuckDuckBot, GPTBot и ещё 6 семейств верифицируются через обратный + прямой DNS. Легитимные краулеры никогда не получают очков. Фейковые боты получают штраф. Доверенные краулеры можно матчить по User-Agent только (`ua_only`, без DNS) и дать per-bot detector exemptions (`exempt_detectors`) чтобы легитимная автоматизация никогда не была наказана.
Добавьте IP офиса, VPN-подсети (CIDR), сервисы мониторинга, SEO-инструменты по подстроке User-Agent или URL-пути. Изменения применяются по SIGHUP.
Все изменения конфигурации — белые списки, веса детекторов, пороги — применяются мгновенно по SIGHUP. Без перезапуска. IP-состояние и DNS-кэш сохраняются.
Запись событий угроз в лог-файл классического формата Fail2Ban. Никакой новой инфраструктуры — вывод по умолчанию, и всё ещё самый быстрый путь к рабочему бану на любом Linux-хосте.
Добавление IP угроз в Cloudflare IP List и блокировка на краю сети — без iptables, без host firewall. Пакетные операции, асинхронный polling, автоматическое TTL-истечение и cross-instance dedup.
Запись заблокированных IP в простой blocklist-файл с автоматическим TTL-истечением и атомарной записью. arxsentinel только пишет файл; вы подключаете его в nginx как вам удобно. Опциональная reload-команда.
Управление firewall address-list RouterOS через REST API. TTL-основанный auto-unban, безопасное удаление только собственных записей arxsentinel, работает на CHR и ARM-роутерах.
Блокировка IP на роутере OpenWrt через ubus (uhttpd-mod-ubus) — без SSH, без exec. Батчевая правка UCI + один reload файервола за цикл; TTL считает сам плагин, а не nftables-таймауты.
Блокировка IP на файерволе OPNsense через нативный REST API (alias_util) — без батчинга, изменения применяются немедленно к pfctl-таблице. Независимый point add/delete на событие, активный TTL-sweep.
Прямая отправка сырых и скорированных событий в Grafana Loki через Push API. Любое поле — stream-label (job, severity, stream), батчинг с gzip, опциональный mTLS. Для читаемости в платформе рекомендуется JSON-envelope.
Пересылка в HTTP Event Collector Splunk с токен-аутентификацией. JSON-режим, мультииндекс, gzip-батчинг, опциональный mTLS. События индексируются сразу при пересечении вердиктом порога — отдельный log shipper не нужен.
Отправка в Datadog Logs API v2 по HTTPS — выбор регионального intake-URL (US, EU, AP1, AP2, UK1, US3, US5, US2 Gov) и произвольные ddtags. Gzip-батчинг, опциональный mTLS, работает параллельно с вашими Datadog log-пайплайнами.
Source / Sink / Detector / Processor / Executor — компактный Go-интерфейс в pkg/plugin/. Плагины регистрируют себя в init(): никакого центрального списка фабрик, фреймворк находит их по имени. Собирайте пайплайн из ролей, а не из внутренних хуков.
Протокол exec+JSON: сабпроцесс читает JSON-объект события из stdin и пишет JSON-ответ в stdout. Расширяйте детекторы, добавляйте sink или executor на Python, Bash или на чём угодно, что умеет читать байтовый поток — ArxSentinel берёт на себя жизненный цикл сабпроцесса (запуск, проводку stdin/stdout, завершение).
Пять поставляемых executor-плагинов — Cloudflare, MikroTik, OpenWrt, OPNsense, nginx — и три только что добавленных observability-sink (Loki, Splunk, Datadog) используют ровно те же публичные интерфейсы, что и внешний автор плагина. Никакого внутреннего fast-path, никакого привилегированного доступа: работает для встроенных — работает и для ваших.
Один процесс следит за N независимыми источниками логов через streams: — у каждого свой трекер, scorer, состояние whitelist и threat-лог. Падение или медленное сканирование в одном потоке не трогает остальные. Обратная совместимость: классический конфиг с одним файлом (general.log_file) автоматически оборачивается в один безымянный поток (stream="" в метриках), миграция не нужна.
Один поток может определять несколько pipeline, у каждого свои inputs, процессоры rule-engine / WAF, детекторы и sink'и — например, один pipeline следит за /api/* со строгим WAF-шлюзом, другой за /admin/* с другими порогами детекторов, оба внутри одного конфига потока. Prometheus получает лейбл pipeline на всех векторах.
tracker_groupPipeline'ы с одинаковым значением tracker_group разделяют один IP-state трекер: атакующий, щупающий ваш API и админ-панель, копит один общий score вместо двух раздельных, пересекая порог бана быстрее, чем поймал бы любой pipeline по отдельности. Опустите tracker_group (или оставьте пустым) — и будет полная изоляция.
Нет подходящего профиля? Опишите свой regex с именованными группами или переключитесь на JSON-парсинг — без перекомпиляции. Любой формат, который захватывает IP, timestamp, метод, путь, статус и байты, подключается к полному пайплайну обнаружения.
Готовые профили для популярных серверов. Переопределяйте позиции полей, форматы дат и правила разделителей для каждого источника лога без изменения ядра.
Разворачивается рядом с любым контейнеризованным HTTP-сервером через общий том с логами — без изменений в контейнере приложения. Готовый docker-compose.yml и конфиг в deploy/examples/docker/. Метрики Prometheus доступны на :9117.
Один pod на узел читает host-логи через hostPath. Включён Helm-чарт со справкой по values и интеграцией Prometheus Operator. Поддерживается и sidecar-топология для managed-кластеров без доступа к host-логам.
Запустите `arxsentinel validate` чтобы проверить весь конфиг перед деплоем. Topology-aware валидатор моделирует реальный поток данных и ловит нарушенную проводку, используя статические plugin manifests — без live трафика.
Буферизация событий executor через in-memory, file-based (bbolt), Redis — или transport-очередь, растянутую между машинами через шифрованную сетку узлов. Выбирайте per executor для bare-metal, single-host, Kubernetes или мультиузловых схем.
Маршрутизация событий угроз между независимыми pipelines по имени — один pipeline может детектировать, другой enforcing, полностью decoupled. А теперь та же именованная очередь может заканчиваться на другой машине: Distributed NCS.
Один и тот же бинарник становится коллектором, детектором или респондером — только через конфиг, соединяясь по встроенной шифрованной event-сетке. Единственный инструмент в своём классе со встроенным в движок транспортом событий безопасности между узлами: без брокера сообщений, без log shipper'а, без иерархии агент-сервер, без VPN.
QUIC на одном UDP-порту, всегда TLS 1.3, Ed25519-ключи узла генерируются при первом старте, TOFU-пиннинг fingerprints как в SSH. Взаимная аутентификация до первого события — чужак на вашем порту не получит ничего.
Каждый коллектор пробрасывает в один общий per-IP score. Атакующий, прощупывающий веб-слой, API и auth-сервис, накапливает суммарный score на детекторе — и пересекает порог бана раньше, чем его поймал бы любой сервис поодиночке.
Пробрасывайте сырые распарсенные записи внутрь для центральной детекции, скорированные вердикты наружу для enforcement — или оба потока в ваш SIEM. Префильтруйте на edge — и пусть счёт за инжест определяют угрозы, а не объём трафика.
Каждая документированная топология — агрегация edge-флота, смешанная маршрутизация на nginx + MikroTik/OpenWrt/OPNsense респондеры — прогоняется как реальный мультиконтейнерный тест при каждом merge. Диаграммы в доках исполняемы.
Читает из любого источника логов. Пишет угрозы в любой приёмник. Fail2Ban остаётся вариантом по умолчанию — теперь одним из многих.
Примеры input-конфигов
type: file · path: /var/log/nginx/access.log
type: syslog · addr: udp://0.0.0.0:5514 · без общего тома
type: http · protocol: plain|cloudflare|firehose|pubsub|loki|otlp|azure|splunk|ndjson
protocol: loki и protocol: splunk здесь означают приём логов, уже
оформленных в формате Loki push API или Splunk HEC — это не связано с Grafana Loki / Splunk HEC
в списке Outputs выше, которые, наоборот, отправляют события на эти платформы.
40+ готовых рецептов в 14 категориях: все поддерживаемые серверы (nginx, Apache, Caddy, Traefik, HAProxy, LiteSpeed), все экзекуторы (Cloudflare, MikroTik, OpenWrt, OPNsense), все observability-приёмники (Loki, Splunk, Datadog), CMS-специфичные probe-пути (WordPress, Laravel, Drupal) и другое. Индекс в cookbook/CookBook.ru.md — каждая строка ведёт прямо к рабочему *.yaml.
5 категорий рецептов идут с полным Docker Compose-стеком — Cloudflare, nginx executor, syslog, MikroTik, Fail2Ban — плюс отдельная директория Kubernetes. Не только конфиг ArxSentinel, а весь референсный деплой.
3 полноценных рабочих примера multi-node Distributed NCS в cookbook/distributed-ncs/ — базовый, edge aggregation и mixed routing. Те же топологии, что описаны в гайде выше, проверены реальными multi-container CI-прогонами при каждом merge.
Пакет делает всё сам: бинарник, systemd unit, Fail2Ban config и системный пользователь.
# Работает на Debian, Ubuntu, Fedora, RHEL, AlmaLinux, Rocky Linux, Arch Linux # Скрипт сам определяет дистрибутив и архитектуру (amd64 / arm64) curl -fsSL https://raw.githubusercontent.com/mr-addams/arxsentinel/main/scripts/get.sh | sudo bash
Скрипт скачивает нужный пакет с GitHub Releases, устанавливает через системный менеджер пакетов, проверяет наличие fail2ban, автоматически определяет путь к access.log и запускает сервис.
# Требуется Go 1.26+ git clone https://github.com/mr-addams/arxsentinel cd arxsentinel sudo ./scripts/install.sh sudo systemctl enable --now arxsentinel
# Docker — дистроблесс-образ (~12 МБ), uid 65532, amd64 + arm64 docker run -d \ -v /var/log/nginx/access.log:/var/log/nginx/access.log:ro \ -v /var/log/arxsentinel:/var/log/arxsentinel \ -p 127.0.0.1:9117:9117 \ ghcr.io/mr-addams/arxsentinel:latest
Метрики Prometheus доступны на :9117/metrics сразу после старта.
Docker Compose и Kubernetes (Helm DaemonSet) — подробные руководства:
README.docker.md ·
Kubernetes (Helm) README
# Нативный бинарник — 386 / amd64 / arm / arm64. Отдельный установщик + rc.d-сервис. fetch https://github.com/mr-addams/arxsentinel/releases/latest/download/arxsentinel_<version>_freebsd_<arch>.tar.gz tar xzf arxsentinel_<version>_freebsd_<arch>.tar.gz cd arxsentinel_<version>_freebsd_<arch> sudo sh install.sh sysrc arxsentinel_enable=YES service arxsentinel start
Создаёт системного пользователя arxsentinel, устанавливает rc.d-сервис и сидирует конфиг из примера (при повторном запуске существующий конфиг не перезаписывается).
Запускаете веб-сервер в podman на FreeBSD? Полное руководство — драйвер хранилища, настройка firewall, особенности контейнерной сети:
FreeBSD Deployment Cookbook
/etc/arxsentinel/config.yaml и укажите путь к access.log. nginx работает без профиля. Для Apache, Traefik, Caddy, HAProxy или LiteSpeed укажите parser.profile с именем сервера. Конфиг перезагружается по SIGHUP — рестарт не нужен.
Записывание IP угроз прямо в наборы IP-правил AWS WAF. Интегрируется с существующими группами WAF — не требует Lambda или кастомной инфраструктуры.
Парсинг auth-логов sshd (syslog/journald) и скоринг brute-force / credential-stuffing паттернов выделенными детекторами — тот же pipeline скоринга и executor'ов, что уже используется для HTTP.
Отправка угроз в Telegram, Slack и PagerDuty — со встроенной дедубликацией и rate-limiting, чтобы всплеск не затопил канал.