v2.2.5 Source Available Go Linux/FreeBSD Daemon/Docker/K8s

От одного VPS
до распределённого флота —
один бинарник, нулевые накладные расходы

Распределённый движок обработки событий безопасности для любого 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.

↓ Установить GitHub
nginx / Apache / Traefik / Caddy / HAProxy / LiteSpeed access.log
Profile (формат лога · маппинг полей · тип сервера)
TailReader × N потоков (inotify · поддержка logrotate)
Parser (ngx_http_realip · CF-Connecting-IP · XFF цепочка)
Whitelist (IP · CIDR · UA · верификация DNS)
WAF (движок правил · pass / drop / tag)
Tracker (состояние IP · ring buffer · счётчики rate)
Scorer (8 детекторов · линейный decay)
threats.log
Fail2Ban → бан через iptables
8
Поведенческих детекторов
3
Топологии · bare-metal · Docker · K8s
11
Семейств ботов
Плагины · любой язык · exec+JSON
2
Архитектуры (amd64 · arm64)
~16 МБ
Один бинарь · arm64 готов

Любой сервер. Любой прокси. Реальный IP.

Шесть серверов поддерживаются нативно — nginx работает без настройки. Каждый другой сервер включается одной строкой профиля. Работает за любым прокси или Cloudflare — всегда фиксирует реального атакующего, а не CDN или балансировщик.

6
Профилей серверов
1
Строка конфига
0
Regex писать
Без настройки
nginx
default parser

nginx combined log format работает из коробки — профиль не нужен.

Одна строка
Apache
profile: "apache"

Стандартный CLF — изменения на сервере не нужны.

Одна строка
Traefik
profile: "traefik"

Стандартный access log (CLF) — настройка не требуется.

Одна строка
LiteSpeed / OpenLiteSpeed
profile: "litespeed"

Apache CLF по умолчанию — изменения на сервере не нужны.

Плагин
Caddy
profile: "caddy"

Требует xcaddy + плагин transform-encoder для CLF-вывода.

rsyslog
HAProxy
profile: "haproxy-http"

Требует option httplog в haproxy.cfg + rsyslog для записи в файл.

За прокси? Реальный IP всегда доходит до детектора.
Cloudflare
Traefik · Caddy · HAProxy · nginx
ваш сервер
ArxSentinel
XFF chain unwrapped CF-Connecting-IP ngx_http_realip trusted proxy CIDR реальный атакующий · всегда

Блокируй известные атаки до детекторов

pass — явный белый список

Правила вычисляются первыми. Совпавшее pass-правило обрывает весь пайплайн — healthcheck'и, внутренние IP и доверенные боты пропускаются мгновенно, без лишних проверок.

drop — жёсткая блокировка

SQLi, path traversal, сигнатуры сканеров — совпавшие запросы отсекаются на входе и не доходят до скорера. Состояние не выделяется, детекторы заведомо плохой трафик не обрабатывают.

tag — маркировка и продолжение

Подозрительный, но неоднозначный трафик получает метку и прибавку к счёту, затем идёт дальше в pipeline. Комбинируй WAF-сигналы с поведенческими детекторами для коррелированных решений о бане.

Пользовательские поля

Расширяй пространство правил собственными полями http.* — два изменения в Go, без перекомпиляции ядра. Добавь версию TLS, длину тела запроса или любое поле из своего источника логов.

8 детекторов — один score

Каждый детектор добавляет очки к счёту IP. Score затухает линейно за время observation_window — никаких ложных банов от старого трафика.

Probe

Запросы к чувствительным путям: /.env, /.git/config, /.aws/credentials, /wp-config.php, /phpinfo.php, панели администратора, резервные архивы и ещё 30+. Активная разведка — срабатывает немедленно на первом запросе.

+25 за запрос

Rate anomaly

Более 100 запросов за 60 секунд с одного IP. Выявляет DDoS-зондирование, агрессивные сканеры уязвимостей, всплески перебора учётных данных и скраперы, пытающиеся держаться ниже статических ограничений.

+25

Suspicious User-Agent

Регистронезависимое сравнение подстрок с встроенными списками: сканеры (Nuclei, sqlmap...), граберы (Scrapy, HTTrack...) и клиенты автоматизации (python-requests, curl...). Легко расширяется через конфиг.

+15 до +40

Bruteforce

Более 60% ответов — 404 при минимум 10 запросах. Типичная сигнатура инструментов перебора путей (dirbuster, gobuster, ffuf). min_requests предотвращает ложные срабатывания.

+30

Sequential crawler

Пять и более последовательно пронумерованных URL подряд — /page/1, /page/2, /article/100... Характерный признак автоматических скраперов, дампящих целые разделы сайта.

+20

No-asset bot

Загружает страницы, но запрашивает CSS, JS или изображения менее чем в 10% случаев — при минимум 3 просмотрах. Реальный браузер всегда загружает ресурсы; markup-only боты пропускают статику.

+20

URL overflow / WAF bypass

URL длиннее 2048 символов или содержащий известные ключевые слова обхода WAF: bypass, shell, cmd, eval, exec... Нацелен на переполнения буфера и инъекции кода.

+30

Bad Bot Blocklist

Сравнивает User-Agent (и опционально Referer) с community-maintained списком ~685 известных плохих ботов: скраперы, SEO-краулеры, спам-боты, сканеры уязвимостей. Список обновляется ежедневно. Основан на nginx-ultimate-bad-bot-blocker — проекте Mitchell Krog и его команды.

+60

Легитимный трафик никогда не блокируется

Автоматическая верификация

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

Запись событий угроз в лог-файл классического формата Fail2Ban. Никакой новой инфраструктуры — вывод по умолчанию, и всё ещё самый быстрый путь к рабочему бану на любом Linux-хосте.

Cloudflare WAF

Добавление IP угроз в Cloudflare IP List и блокировка на краю сети — без iptables, без host firewall. Пакетные операции, асинхронный polling, автоматическое TTL-истечение и cross-instance dedup.

nginx

Запись заблокированных IP в простой blocklist-файл с автоматическим TTL-истечением и атомарной записью. arxsentinel только пишет файл; вы подключаете его в nginx как вам удобно. Опциональная reload-команда.

MikroTik RouterOS v7

Управление firewall address-list RouterOS через REST API. TTL-основанный auto-unban, безопасное удаление только собственных записей arxsentinel, работает на CHR и ARM-роутерах.

Файервол OpenWrt через ubus

Блокировка IP на роутере OpenWrt через ubus (uhttpd-mod-ubus) — без SSH, без exec. Батчевая правка UCI + один reload файервола за цикл; TTL считает сам плагин, а не nftables-таймауты.

REST API OPNsense

Блокировка IP на файерволе OPNsense через нативный REST API (alias_util) — без батчинга, изменения применяются немедленно к pfctl-таблице. Независимый point add/delete на событие, активный TTL-sweep.

Отправляйте напрямую в SIEM, который у вас уже есть

Grafana Loki

Прямая отправка сырых и скорированных событий в Grafana Loki через Push API. Любое поле — stream-label (job, severity, stream), батчинг с gzip, опциональный mTLS. Для читаемости в платформе рекомендуется JSON-envelope.

Splunk HEC

Пересылка в HTTP Event Collector Splunk с токен-аутентификацией. JSON-режим, мультииндекс, gzip-батчинг, опциональный mTLS. События индексируются сразу при пересечении вердиктом порога — отдельный log shipper не нужен.

Datadog Logs API

Отправка в 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(): никакого центрального списка фабрик, фреймворк находит их по имени. Собирайте пайплайн из ролей, а не из внутренних хуков.

Любой язык, Go не нужен

Протокол 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 внутри потока

Один поток может определять несколько pipeline, у каждого свои inputs, процессоры rule-engine / WAF, детекторы и sink'и — например, один pipeline следит за /api/* со строгим WAF-шлюзом, другой за /admin/* с другими порогами детекторов, оба внутри одного конфига потока. Prometheus получает лейбл pipeline на всех векторах.

Корреляция pipeline через tracker_group

Pipeline'ы с одинаковым значением tracker_group разделяют один IP-state трекер: атакующий, щупающий ваш API и админ-панель, копит один общий score вместо двух раздельных, пересекая порог бана быстрее, чем поймал бы любой pipeline по отдельности. Опустите tracker_group (или оставьте пустым) — и будет полная изоляция.

Впишется в то, как вы уже разворачиваете.

Произвольный формат логов

Нет подходящего профиля? Опишите свой regex с именованными группами или переключитесь на JSON-парсинг — без перекомпиляции. Любой формат, который захватывает IP, timestamp, метод, путь, статус и байты, подключается к полному пайплайну обнаружения.

Профили серверов

Готовые профили для популярных серверов. Переопределяйте позиции полей, форматы дат и правила разделителей для каждого источника лога без изменения ядра.

Docker Compose sidecar

Разворачивается рядом с любым контейнеризованным HTTP-сервером через общий том с логами — без изменений в контейнере приложения. Готовый docker-compose.yml и конфиг в deploy/examples/docker/. Метрики Prometheus доступны на :9117.

Kubernetes DaemonSet

Один pod на узел читает host-логи через hostPath. Включён Helm-чарт со справкой по values и интеграцией Prometheus Operator. Поддерживается и sidecar-топология для managed-кластеров без доступа к host-логам.

Offline config validation

Запустите `arxsentinel validate` чтобы проверить весь конфиг перед деплоем. Topology-aware валидатор моделирует реальный поток данных и ловит нарушенную проводку, используя статические plugin manifests — без live трафика.

Pluggable queue backends

Буферизация событий executor через in-memory, file-based (bbolt), Redis — или transport-очередь, растянутую между машинами через шифрованную сетку узлов. Выбирайте per executor для bare-metal, single-host, Kubernetes или мультиузловых схем.

Named Channel Switch

Маршрутизация событий угроз между независимыми pipelines по имени — один pipeline может детектировать, другой enforcing, полностью decoupled. А теперь та же именованная очередь может заканчиваться на другой машине: Distributed NCS.

Собирай где угодно. Детектируй централизованно. Бань на границе.

Один и тот же бинарник становится коллектором, детектором или респондером — только через конфиг, соединяясь по встроенной шифрованной event-сетке. Единственный инструмент в своём классе со встроенным в движок транспортом событий безопасности между узлами: без брокера сообщений, без log shipper'а, без иерархии агент-сервер, без VPN.

Коллекторы — Pi · VPS · NAS · филиал (по 12 МБ, только парсинг)
QUIC / TLS 1.3 · Ed25519-идентичность узла · TOFU-пиннинг (как в SSH)
Узел-детектор — 8 детекторов · WAF · whitelist · один общий IP-score по всем источникам
Скорированные вердикты маршрутизируются дальше — per pipeline, на разные узлы
Респондеры → роутер MikroTik · файервол OpenWrt · файервол OPNsense · nginx blocklist · Cloudflare WAF · Grafana Loki · Splunk HEC · Datadog Logs API (сырой + скорированный JSON)

Шифрованная сетка из коробки

QUIC на одном UDP-порту, всегда TLS 1.3, Ed25519-ключи узла генерируются при первом старте, TOFU-пиннинг fingerprints как в SSH. Взаимная аутентификация до первого события — чужак на вашем порту не получит ничего.

Корреляция между сервисами

Каждый коллектор пробрасывает в один общий per-IP score. Атакующий, прощупывающий веб-слой, API и auth-сервис, накапливает суммарный score на детекторе — и пересекает порог бана раньше, чем его поймал бы любой сервис поодиночке.

Сырые или скорированные — оба потока

Пробрасывайте сырые распарсенные записи внутрь для центральной детекции, скорированные вердикты наружу для enforcement — или оба потока в ваш SIEM. Префильтруйте на edge — и пусть счёт за инжест определяют угрозы, а не объём трафика.

Доказано CI, а не обещано

Каждая документированная топология — агрегация edge-флота, смешанная маршрутизация на nginx + MikroTik/OpenWrt/OPNsense респондеры — прогоняется как реальный мультиконтейнерный тест при каждом merge. Диаграммы в доках исполняемы.

Руководство по распределённой обработке Готовые топологии

Работает с вашим стеком

Читает из любого источника логов. Пишет угрозы в любой приёмник. Fail2Ban остаётся вариантом по умолчанию — теперь одним из многих.

Источники

nginx Apache Traefik Caddy HAProxy LiteSpeed любой лог-файл stdin pipe syslog-приёмник HTTP (push/pull)

Приёмники

Fail2Ban Cloudflare WAF MikroTik RouterOS OpenWrt ubus OPNsense REST nginx blocklist exec+JSON stdout JSON Grafana Loki Splunk HEC Datadog Telegram (скоро)

Примеры 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+ рецептов. Скопируй. Заполни. Запусти.

Скопируй, заполни, запусти

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.

Docker и Kubernetes в комплекте

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.

~16 МБ. Работает везде.

~16 МБ
Размер бинаря · arm64
~25 МБ
RAM · конфиг для Pi 3B
>20k
Записей лога/сек · Pi 3B
0
Зависимостей рантайма
Угрозы уровня Enterprise.
Даже на железе Raspberry Pi.
Чистый Go-бинарь — без JVM, без Python, без утечек памяти. Запускается нативно на Raspberry Pi 3B (ARM Cortex-A53): ~25 МБ RAM, 22k+ записей лога в секунду — в 20 раз быстрее любой реальной нагрузки на Pi.

Без чёрных ящиков. Детерминированная оценка — каждый бан обоснован и виден в структурированных JSON-логах.
YAML конфиг перезагрузка по SIGHUP JSON логи Prometheus метрики нативный arm64 Raspberry Pi 3B systemd unit

Установка за 3 шага

Пакет делает всё сам: бинарник, 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 — рестарт не нужен.

Что появится в v2.x

NEXT

AWS WAF executor

Записывание IP угроз прямо в наборы IP-правил AWS WAF. Интегрируется с существующими группами WAF — не требует Lambda или кастомной инфраструктуры.

PLANNED

SSH-источник + детекторы

Парсинг auth-логов sshd (syslog/journald) и скоринг brute-force / credential-stuffing паттернов выделенными детекторами — тот же pipeline скоринга и executor'ов, что уже используется для HTTP.

PLANNED

Alert sinks

Отправка угроз в Telegram, Slack и PagerDuty — со встроенной дедубликацией и rate-limiting, чтобы всплеск не затопил канал.