
maltrail v3.2
Система обнаружения вредоносного трафика в реальном времени, использующая публичные чёрные списки, статические следы вредоносного ПО и эвристический анализ для выявления угроз в DNS-, HTTP- и IP-трафике.

Maltrail
Maltrail — это система обнаружения сетевого трафика, которая выявляет взаимодействие с известной вредоносной инфраструктурой и сообщает об отдельных аномалиях трафика. Она сопоставляет домены, URL-адреса, IP-адреса, пары IP:port и значения User-Agent, наблюдаемые в сети, с набором индикаторов, называемых trails.
Обнаружение фиксируется как отдельное событие, содержащее источник, назначение, протокол, совпавший trail, классификацию и источник trail:```text "2026-08-07 09:14:22.117034" gw 10.13.13.2 57809 1.1.1.1 53 UDP DNS malware.bakewithdavid.com "asyncrat (malware)" (static)
Maltrail предназначен для сетевого мониторинга на основе индикаторов. Его эвристические обнаружения дополняют
сопоставление с трейлами, но не заменяют телеметрию конечных точек или систему предотвращения вторжений
общего назначения.
## Возможности
- Полная сборка трейлов, объединяющая более 3 000 встроенных статических файлов, 42 интеграции с публичными фидами
и дополнительные трейлы, предоставляемые оператором.
- Многопоточный сенсор на Rust с использованием libpcap и опциональными воркерами захвата Linux `PACKET_FANOUT`.
- Сервер на Python, обеспечивающий интерфейс отчётности, приём событий и HTTP API.
- Пользовательские трейлы и белые списки в виде простого текста, которые можно проверять и контролировать версии.
- Эвристики для сканирования, исчерпания DNS, DGA-подобных запросов, подозрительных загрузок, прокси-зондирований,
подозрительных значений User-Agent и связанной сетевой активности.
- Локальное журналирование событий, удалённое журналирование Maltrail, CEF через syslog и вывод Logstash JSON.
- Проверка развёртывания с помощью `maltrail-sensor -T` и опциональные метрики Prometheus.
## Содержание
- [Архитектура](#architecture)
- [Интерфейс отчётности](#reporting-interface)
- [Производительность](#performance)
- [Установка](#installation)
- [Установщик](#installer)
- [Сборка из исходного кода](#building-from-source)
- [Systemd](#systemd)
- [Docker](#docker)
- [Конфигурация](#configuration)
- [Трейлы](#trails)
- [События и API](#events-and-api)
- [Эксплуатация](#operations)
- [Мониторинг](#monitoring)
- [Хранение событий](#event-retention)
- [Документация](#documentation)
- [Участие в разработке](#contributing)
- [Проект](#project)
- [Лицензия](#license)
- [Сопровождающие](#maintainers)
- [Спонсоры](#sponsors)
- [Презентации и публикации](#presentations-and-publications)
- [Производный чёрный список](#derived-blacklist)
- [Сторонние интеграции](#third-party-integrations)
- [Благодарности](#acknowledgements)
## Архитектура
Maltrail состоит из двух независимых процессов, которые могут работать на одном хосте или на разных хостах:```text
┌──────────┐ events (UDP or file) ┌──────────┐
│ sensor │ ───────────────────────► │ server │ ◄── browser
└──────────┘ └──────────┘
Rust Python
libpcap + PACKET_FANOUT reporting UI + API
trail matching + heuristics
Сенсор захватывает трафик, выполняет сопоставление по следам и эвристический анализ, а затем формирует события.
Он может записывать события локально (LOG_DIR), отправлять их на удалённый сервер Maltrail (LOG_SERVER) или делать
и то, и другое. Он также может передавать CEF через syslog (SYSLOG_SERVER) и JSON в Logstash
(LOGSTASH_SERVER).
Сервер принимает и хранит удалённые события, обслуживает локально доступные журналы событий и предоставляет веб-интерфейс и API.
Интерфейс отчётности
Maltrail включает браузерный интерфейс отчётности для исследования обнаруженного трафика, с живыми обновлениями, поиском по полям, ретроспективным поиском, географическими представлениями, триажем, сохранёнными представлениями и экспортом.

Интерфейс обслуживается server.py по адресу HTTP_ADDRESS:HTTP_PORT. Это чистый JavaScript с
единственной сторонней зависимостью времени выполнения (PapaParse, для разбора CSV) и без этапа сборки. Одновременно
просматривается один день, выбираемый с помощью средства выбора даты, которое также служит сеткой плотности событий по
доступным ежедневным журналам. События передаются потоком из /events и агрегируются в браузере в
угрозы — одна строка на каждую отдельную пару (source, trail) — отображаемые в сортируемой сетке с панелью деталей.
| Возможность | Примечания |
|---|---|
| Живой режим | Добавленные события передаются через Server-Sent Events (/live) и объединяются с текущим представлением. При недоступности SSE происходит откат к опросу диапазонов байтов ежедневного журнала, либо для сессий, которые поток не может обслужить. Новые угрозы высокой важности могут вызывать уведомление на рабочем столе и звуковое оповещение; оба можно отключить |
| Поиск | Токены с областью действия по полям (src: dst: port: proto: type: trail: info: family: tag: uid: sev: dir: status:; family:interlock подтягивает interlock-1/-2, осколки, на которые разбивается один дамп фида) в сочетании с пробелом как AND, - для исключения, * как подстановочные знаки, CIDR (src:10.0.0.0/8), а также числовые диапазоны и сравнения (port:>1024, count:>=100). Активные фильтры отображаются в виде удаляемых чипов |
| Ретроспективный поиск | Ищет во всех сохраняемых ежедневных журналах по одному индикатору (/hunt), а не только по просматриваемому дню. Ограничен лимитом дней, бюджетом реального времени и пределом выборки; день, который бюджет прервал досрочно, сообщается отдельно от завершённых дней, а не засчитывается как завершённый итог. Побочный индекс по дням (LOG_DIR/index/, USE_EVENT_INDEX) позволяет проходу пропускать каждую несовпадающую строку и делает /counts точным |
| Карта мира | Плотность событий по странам для выбранного дня (/geo), с размещением внешней конечной точки каждого события. События, которые не могут быть отнесены к внешнему адресу, сообщаются как неотображённые, а не угадываются. Установите HOME_LAT / HOME_LON, чтобы рисовать дуги происхождения |
| Триаж | Статус каждой угрозы (новая / в расследовании / решена / ложное срабатывание), заметки в свободной форме, теги и скрытие. Правила белого списка и точки опоры OSINT доступны из контекстного меню строки |
| Сохранённые представления | Именованные предустановки фильтров |
| Экспорт | Текущее отфильтрованное представление в виде CSV, JSON или обезвреженных индикаторов |
| Внешний вид | Тёмная и светлая темы, а также дискретные шаги размера текста |
Состояние триажа, сохранённые представления, теги и настройки внешнего вида хранятся в браузере
(localStorage), а не на сервере: они привязаны к браузеру и источнику и не разделяются
между аналитиками.
Сессии, ограниченные сетевым фильтром, видят только события из своих собственных сетей, и это ограничение применяется к конечным точкам подсчётов, карты и чёрного списка, а также к списку событий.
Обогащение данными о странах и ASN для отдельных адресов запрашивается на stat.ripe.net
сервером, который кэширует результаты и передаёт их интерфейсу из своей собственной конечной точки /ripe;
браузер не общается ни с чем, кроме Maltrail. Установите DISABLE_RIPE_LOOKUPS, чтобы полностью отключить
исходящие запросы. Без них — или на хосте без доступа к интернету — флаги берутся
из локальной таблицы RIR, а всё остальное в интерфейсе работает офлайн.
Производительность
Производительность зависит от процессора, состава трафика, размера набора следов, драйвера захвата и сетевого интерфейса. Приведённые ниже показатели измеряют путь обработки пакетов сенсором изолированно; это не сквозные измерения живого захвата.
Репрезентативные измерения на AMD Ryzen 7 PRO 4750U с включёнными эвристиками и набором следов на 1,5 миллиона строк:
| Трафик | Время на пакет |
|---|---|
| ICMP echo, 58 байт | 101 нс |
| TCP SYN, 70 байт | 302 нс |
| Массовый TLS, 1 473 байта | 402 нс |
| DNS-запрос с тёплым кэшем, 93 байта | 452 нс |
| Смешанный трафик, в среднем 866 байт | 552 нс |
| HTTP-запрос, 169 байт | 602 нс |
| DNS-запрос с уникальным именем, 93 байта | 1 102 нс |
Сравнительные офлайн-прогоны с использованием одного и того же сгенерированного захвата, конфигурации и набора следов показали
в 14–37 раз меньшую удельную стоимость на пакет в установившемся режиме по сравнению с выведенным из эксплуатации сенсором на Python на протестированных системах.
Эти показатели отделяют время всего процесса от установившегося режима, поскольку загрузка следов доминирует при
коротком воспроизведении. Само обнаружение проверяется отдельно с помощью корпуса из 42 случаев в
sensor/tests/replay.rs.
Измерьте это на целевой системе с помощью:```bash cargo bench --manifest-path sensor/Cargo.toml --bench hotpath
Один capture worker используется по умолчанию. Дополнительные worker'ы могут увеличить пропускную способность захвата, но хеширование потоков Linux делит состояние для каждого источника между worker'ами и, следовательно, снижает чувствительность некоторых эвристик сканирования. В документированном тесте 91% эвристических оповещений при одном worker'е сохранялись при двух worker'ах, 86% — при четырёх и 65% — при восьми. Точное сопоставление trail осталось неизменным. Увеличивайте `CAPTURE_FANOUT` только тогда, когда метрики потерь захвата показывают, что это необходимо.
Методология бенчмарков, результаты на оборудовании, вывод профайлера, измерения памяти и проверки fanout в реальном времени задокументированы в [`sensor/docs/REPORT.md`](https://github.com/stamparm/maltrail/blob/master/sensor/docs/REPORT.md).
## Установка
### Установщик
Установщик проверяется на двенадцати дистрибутивах Linux — Debian, Ubuntu, Fedora, Rocky, AlmaLinux, Arch, openSUSE Leap и Tumbleweed, а также Alpine — плюс FreeBSD и macOS, при каждом релизе, с полным результатом, записанным в [`docs/compat`](https://github.com/stamparm/maltrail/blob/master/docs/compat). Raspberry Pi OS и другие 64-битные ARM-системы используют сборку `aarch64`; для 32-битного ARM нет готового сенсора, и его необходимо собирать из исходного кода.```bash
curl -fsSL https://raw.githubusercontent.com/stamparm/maltrail/master/install.sh | sudo sh
Он устанавливает зависимости, создаёт управляемую рабочую копию в /opt/maltrail, проверяет контрольную сумму
предварительно собранного сенсора, создаёт непривилегированную учётную запись maltrail, устанавливает юниты systemd, подготавливает
каталоги логов и состояния и запускает сенсор и сервер. Повторный запуск установщика обновляет
управляемую рабочую копию.
Просмотрите скрипт перед запуском с повышенными привилегиями. Из существующей рабочей копии пробный запуск показывает команды без изменения системы:```bash sh install.sh --dry-run
Общие параметры установщика:```bash
sh install.sh --role sensor # Install only the sensor
sh install.sh --ref 3.1.2 # Install a release tag instead of master
sh install.sh --no-service # Install without changing systemd
sh install.sh --dry-run # Print commands without applying them
sh install.sh --uninstall # Remove the managed installation; keep logs and state
Панель управления доступна по адресу http://127.0.0.1:8338 после установки. Обратите внимание, что поставляемый
HTTP_ADDRESS — это 0.0.0.0, поэтому она доступна на каждом интерфейсе, а не только на loopback — и
учётные данные по умолчанию — admin / changeme!. Измените USERS и установите HTTP_ADDRESS в
127.0.0.1 (или разместите сервер за обратным прокси с TLS), прежде чем хост окажется в
недоверенной сети.
Первоначальное построение trail может занять несколько минут. Датчик не обнаруживает совпадения с trail, пока не
станет доступен допустимый набор trail. Юнит systemd запускает проверку -T датчика перед запуском, так
что отсутствие привилегий, недоступный для записи каталог журналов или недопустимый набор trail приводят к видимому
сбою запуска.
Тестовый стенд установщика охватывает двенадцать дистрибутивов, и «он установился» — это не утверждение: в
каждом из них сервер запускается и запрашивается /ping, датчик проверяет себя с
помощью -T, юниты проверяются на разрешимость путей, установщик запускается повторно, чтобы доказать, что обновление
сохраняет конфигурацию оператора, и выполняется --uninstall. Каждый результат записывается для каждой платформы в
docs/compat, и страница там генерируется из этих строк, а не написана
вручную.
Alpine и другие системы на musl получают сборку датчика -musl. Раньше им говорили, что предварительно собранный бинарник
связан с glibc, и предлагали компилировать самостоятельно; датчик собирается и работает на musl нативно, так что это был
отсутствующий артефакт, а не ограничение платформы.
Сборка из исходного кода
Датчику требуется Rust 1.74 или новее, заголовки разработки libpcap и системные инструменты для работы с capabilities. Серверу и обновлятору trail требуется Python 3.6 или новее.
Установите пакеты дистрибутива:```bash
Debian / Ubuntu / Raspberry Pi OS
sudo apt-get install cargo libpcap-dev libcap2-bin python3
RHEL / Fedora
sudo dnf install cargo libpcap-devel libcap python3
openSUSE / SLES
sudo zypper install cargo rust libpcap-devel libcap-progs python311
Затем соберите и проверьте сенсор:```bash
git clone --depth 1 https://github.com/stamparm/maltrail.git
cd maltrail
cargo build --release --manifest-path sensor/Cargo.toml
sudo setcap cap_net_raw,cap_net_admin=eip \
sensor/target/release/maltrail-sensor
sudo install -d -o "$USER" -g "$(id -gn)" -m 750 /var/log/maltrail
sensor/target/release/maltrail-sensor -T
sensor/target/release/maltrail-sensor
Запустите сервер в другом терминале или на другом хосте:```bash python3 server.py
Готовые бинарные файлы сенсора прилагаются к текущим релизам с контрольными суммами SHA-256: Linux `x86_64`
и `aarch64` как для glibc, так и для musl, macOS на Apple silicon и Intel, FreeBSD `amd64` и
Windows `x86_64`.
Сборки для glibc статически линкуют libpcap и нацелены на glibc 2.28, поэтому единственное, что им
нужно — это библиотека C — ничего устанавливать не требуется, одинаково на RHEL 8+, Debian 10+, Ubuntu 18.04+ и Leap 15.x. Сборки
для musl полностью статические, поэтому Alpine не нужно вообще ничего. Сборка для Windows — 64-битная и требует Windows 10 или новее плюс
установленный [Npcap](https://npcap.com) до того, как она запустится — `wpcap.dll` является зависимостью времени загрузки,
поэтому без неё загрузчик отказывается запускать исполняемый файл, а не выдаёт ошибку при захвате. В архиве об этом
тоже сказано.
Бинарные файлы из версий **3.1.1 и более ранних** — нет: они линковали libpcap динамически и запрашивали её по
имени, которое использует их сборочный хост AlmaLinux. Debian и Ubuntu поставляют идентичную библиотеку под
более старым именем `libpcap.so.0.8`, поэтому эти бинарные файлы останавливаются ещё до запуска —```
./maltrail-sensor: error while loading shared libraries: libpcap.so.1: cannot open shared object file
— на машине, где установлен libpcap. install.sh создаёт недостающую ссылку за вас. Вручную:```bash
adjust the directory for your architecture: aarch64-linux-gnu, or /usr/lib64 on RPM distributions
sudo ln -sf /usr/lib/x86_64-linux-gnu/libpcap.so.0.8 /usr/lib/x86_64-linux-gnu/libpcap.so.1 sudo ldconfig
### Systemd
Поставляемые модули в `packaging/systemd/` запускают оба процесса от имени
непривилегированного пользователя `maltrail`. Systemd создаёт `/var/log/maltrail` и `/var/lib/maltrail`, ограничивает
доступ к файловой системе и предоставляет сенсору `CAP_NET_RAW` и `CAP_NET_ADMIN`.
Установщик настраивает эти модули автоматически. Для существующей установки из исходного кода следуйте
процедуре ручной настройки службы в [`sensor/docs/INSTALL.md`](https://github.com/stamparm/maltrail/blob/master/sensor/docs/INSTALL.md).
Проверить состояние службы и логи можно с помощью:```bash
systemctl status maltrail-sensor maltrail-server
journalctl -u maltrail-sensor -f
Docker
Запустите предоставленное развёртывание Compose с помощью:```bash docker compose -f docker/docker-compose.yml up -d
Конфигурация контейнера, хранилище, привилегии и проверки работоспособности описаны в
[`docker/README.md`](https://github.com/stamparm/maltrail/blob/master/docker/README.md).
## Конфигурация
Maltrail читает `maltrail.conf`, который содержит отдельные настройки `[Sensor]` и `[Server]`. Установщик
размещает управляемую конфигурацию в `/etc/maltrail.conf`.
Часто используемые параметры сенсора включают:
| Параметр | Назначение |
| --- | --- |
| `MONITOR_INTERFACE` | Интерфейс или интерфейсы захвата; `any` выбирает все поддерживаемые интерфейсы |
| `CAPTURE_FILTER` | Фильтр захвата BPF |
| `CAPTURE_FANOUT` | Количество сокетов захвата Linux; по умолчанию один |
| `CAPTURE_WORKERS` | Воркеры захвата, по одному сокету на каждый; по умолчанию равно `CAPTURE_FANOUT`, то есть один, если не задан ни один из них |
| `LOG_DIR` | Каталог локального журнала событий |
| `TRAILS_FILE` | Сгенерированная база данных трейлов |
| `LOG_SERVER` | Удалённый сервер событий Maltrail |
| `SYSLOG_SERVER` | Назначение или назначения CEF syslog |
| `LOGSTASH_SERVER` | Назначение или назначения Logstash JSON |
| `STATS_ADDRESS` | Слушатель метрик Prometheus; отключён, если не настроен |
| `UPDATE_PERIOD` | Интервал обновления трейлов |
| `STATIC_TRAILS_URL` | Откуда загружается собранный набор статических трейлов; привяжите его к датированному релизу, чтобы контролировать появление нового контента |
| `USER_WHITELIST` | Управляемые оператором индикаторы, которые не должны вызывать оповещения |
| `CUSTOM_TRAILS_DIR` | Управляемый оператором каталог трейлов |
| `STATIC_TRAILS_DIR` | Необязательная копия репозитория трейлов; используется только для отображения ссылки на источник трейла в UI |
`PROCESS_COUNT` применяется к выведенному из эксплуатации Python-сенсору и к устаревшему механизму
ограничения журнала событий; он **не** задаёт количество воркеров Rust-сенсора. Настраивайте воркеры
захвата с помощью `CAPTURE_FANOUT` или `CAPTURE_WORKERS`.
Запустите проверку развёртывания после изменения конфигурации:```bash
sensor/target/release/maltrail-sensor -T
Проверка валидирует конфигурацию, трейлы, записи белого списка, фильтр захвата, привилегии, хранилище логов, поддержку обновлений и настройки воркеров. Успешная проверка включает положительные значения количества трейлов и записей белого списка, а не только подтверждение существования файлов.
Трейлы
Трейл — это один индикатор: домен, URL, IP-адрес, пара IP:port, User-Agent, отпечаток JA3/JA4
или хеш сертификата — вместе с тем, что он означает и откуда он взялся. Обновлятор
объединяет четыре источника в TRAILS_FILE в следующем порядке:
| источник | откуда берётся |
|---|---|
| Фиды | feeds/*.py, загружаются напрямую вашим развёртыванием от каждого издателя |
| Пользовательские | CUSTOM_TRAILS_DIR и CUSTOM_TRAILS_URL, ваши собственные индикаторы |
| Статические | собранный набор из stamparm/trails, загружается из STATIC_TRAILS_URL; отдельная лицензия |
| Списки движка | data/mass_scanner*.txt, поставляются здесь, поскольку меняются редко |
Статические трейлы живут в собственном репозитории. Содержимое для обнаружения меняется десятки раз в
день; движок — нет, и их совместное хранение означало, что обновление обнаружения требовало подтягивания кода
и делало историю этого репозитория непригодной для использования. STATIC_TRAILS_URL указывает на новейший опубликованный
набор:```text
STATIC_TRAILS_URL https://github.com/stamparm/trails/releases/latest/download/trails.csv.gz
Направьте его на конкретный релиз `content-YYYYMMDD-HHMM`, чтобы зафиксировать версию, и тогда неудачная публикация не станет сразу глобальной. Набор кэшируется рядом с `TRAILS_FILE`, что и обеспечивает работу офлайн- или изолированной пересборки; опубликованный `sha256` проверяется перед загрузкой, поэтому развёртывание, которое обновляется чаще, чем меняется контент, передаёт 65 байт вместо 11 МБ, а полезная нагрузка, не совпадающая со своим дайджестом, отклоняется в пользу кэша.
`update_trails()` публикует новый `TRAILS_FILE` атомарно и только после успешной сборки. Фиды, возвращающие пустой результат, сообщаются по имени, чтобы развёртывание не зависело молча от источника, который тихо прекратил работу.
Добавляйте свои индикаторы в `CUSTOM_TRAILS_DIR`, а всё, что никогда не должно вызывать событие, — в `USER_WHITELIST`. Держите и то, и другое вне каталога установки, чтобы обновление не могло их перезаписать.
Вклад в статические трейлы направляйте в [stamparm/trails](https://github.com/stamparm/trails); новые фиды — сюда. В любом случае индикатору нужна классификация и источник, который кто-то может проверить — см. [Contributing](#contributing).
## События и API
Maltrail записывает одно событие, разделённое пробелами, на каждое обнаружение, используя CSV-экранирование там, где значение содержит пробелы:```text
"<time>" <sensor> <src_ip> <src_port> <dst_ip> <dst_port> <proto> <type> <trail> "<info>" <reference>
Поле type определяет, что именно совпало, включая DNS, IP, IPORT, URL, PATH, HTTP,
UA, PORT, CERT, JA3 и JA4. Поле info содержит классификацию следа, а
reference указывает на статический список, фид, пользовательский источник или эвристику, которые его породили. Типы
JA3/JA4 срабатывают на TLS-отпечатках клиента: TLS-стек импланта переживает каждую
смену адреса и домена, поэтому его hello-хэш продолжает совпадать после того, как всё остальное уже сгорело
(публикуется в фиде abuse.ch SSLBL JA3).
Поиск индикаторов
Используйте /check для запроса одного домена, IP-адреса или URL:```bash
curl 'http://127.0.0.1:8338/check?q=www.sub.evil.example'
| `--no-color` | Отключить цветной вывод |
| `--debug` | Включить режим отладки |
| `--verbose` | Включить подробный вывод |
| `--silent` | Подавить весь вывод |
| `--json` | Выводить результаты в формате JSON |
| `--csv` | Выводить результаты в формате CSV |
| `--html` | Выводить результаты в формате HTML |
| `--xml` | Выводить результаты в формате XML |
| `--markdown` | Выводить результаты в формате Markdown |
| `--output FILE` | Записать вывод в FILE |
| `--input FILE` | Читать входные данные из FILE |
| `--config FILE` | Использовать файл конфигурации FILE |
| `--threads N` | Использовать N потоков |
| `--timeout N` | Установить тайм-аут в N секунд |
| `--retry N` | Повторить N раз |
| `--proxy URL` | Использовать прокси-сервер по адресу URL |
| `--user-agent STRING` | Установить строку User-Agent |
| `--header STRING` | Добавить пользовательский заголовок |
| `--cookie STRING` | Добавить пользовательскую cookie |
| `--help` | Показать справку |
| `--version` | Показать версию |```json
{
"query": "www.sub.evil.example",
"found": true,
"trail": "evil.example",
"info": "asyncrat (malware)",
"reference": "(static)",
"confidence": 100
}
Поле confidence (0–100 или null, когда недоступно) показывает, насколько сильно источники подтверждают
запись: 40 для одного фида, +15 за каждый дополнительный независимо подтверждающий фид вплоть до 100, и полный
балл для собственных пользовательских и статических записей оператора. Оно вычисляется во время обновления trails
на основе согласованности фидов в sidecar-файл trails.confidence рядом с trails.csv; сервер, получающий trails
от UPDATE_SERVER, не имеет происхождения для оценки и сообщает null. Используйте его для приоритизации
триажа — запись из одного фида с оценкой 40 заслуживает второго взгляда, прежде чем получить правило файрвола.
Поиск поддомена может совпасть с указанным родительским доменом. Поиск по URL сначала проверяет host/path, а затем
только хост. Сервер читает отображённую в память базу данных trails и замечает обновления trails без
перезапуска.
Публичные статические и фидовые trails доступны без аутентификации, что согласуется с эндпоинтом /trails,
используемым удалёнными сенсорами. Пользовательские trails требуют авторизованной сессии; неавторизованный
поиск только по пользовательским записям сообщается как промах. Данные событий по-прежнему требуют аутентификации.
Операции
Мониторинг
Используйте maltrail-sensor -T как проверку развёртывания и конфигурации. Поставляемый systemd-юнит запускает его
как ExecStartPre.
Чтобы убедиться, что работает само обнаружение — а не просто запускаются процессы — выполните:```bash python3 server.py --detect-test
Он воспроизводит подготовленный pcap эмулированного вредоносного трафика (срабатывания trail по DNS-запросу, IP, `IP:port`, пути URL и заголовку `Host`, а также эвристики SQL-инъекций, обхода каталогов, RCE, XSS, проверки прокси, sinkhole, отсутствующего `Host` и сканирования портов/веб-ресурсов/заражений) через установленный сенсор и проверяет, что каждое ожидаемое обнаружение срабатывает. Ему не требуются root, сетевой интерфейс или собственный набор trail. При исправной установке выводится `20/20 detection(s) fired`.
Когда настроен `STATS_ADDRESS`, отслеживайте как минимум следующие метрики Prometheus:
| Метрика | Операционное значение |
| --- | --- |
| `maltrail_up == 0` | Ни один рабочий процесс захвата не запущен |
| Рост `maltrail_capture_dropped_total` | Кольцевой буфер захвата теряет пакеты |
| Рост `maltrail_local_log_errors_total` | События были сгенерированы, но не могли быть записаны локально |
| Рост `maltrail_remote_log_errors_total` | События не могли быть доставлены в удалённый приёмник; при `DISABLE_LOCAL_LOG_STORAGE` они теряются |
| `maltrail_trail_generation` не увеличивается | Активный набор trail не обновляется |
| `maltrail_log_dir_free_bytes` | Оставшаяся ёмкость для локального хранения событий |
| Рост `maltrail_state_saturations_total` | Достигнут лимит состояния эвристики |
| Рост `maltrail_throttle_evictions_total` | Таблица ограничения событий достигла предела, поэтому события агрегируются раньше, чем настроено |
Насыщение состояния влияет на соответствующую эвристику; точное сопоставление trail остаётся активным.
Отправьте `SIGHUP` или используйте `systemctl reload maltrail-sensor`, чтобы запросить перезагрузку trail. Файлы trail, обновлённые другим процессом, обнаруживаются автоматически и публикуются рабочим процессам без перезапуска сенсора.
Сжатое хранилище наблюдаемых данных (`USE_CONDENSED_STORAGE`, `meta.sqlite`) поддерживает представления новизны и retro-hunt на сервере. Побочный индекс журнала событий по дням (`USE_EVENT_INDEX`, `LOG_DIR/index/*.sqlite`, примерно вдвое больше размера журнала на диске) обеспечивает точность `/counts` и скорость `/hunt`; он поддерживается инкрементально из самих журналов и может быть перестроен с помощью `server.py --rebuild-index`. Совместимость с выведенным из эксплуатации сенсором описана в [`sensor/docs/COMPATIBILITY.md`](https://github.com/stamparm/maltrail/blob/master/sensor/docs/COMPATIBILITY.md).
### Хранение событий
Maltrail не выполняет ротацию и не удаляет журналы событий. Операторы несут ответственность за определение сроков хранения, архивирования и удаления в соответствии с требованиями к хранилищу и политикой организации.
Рекомендуемые практики:
- Отправляйте долговременную копию событий на удалённый сервер Maltrail или в SIEM с помощью `LOG_SERVER`, `SYSLOG_SERVER` или `LOGSTASH_SERVER`.
- Настройте оповещения по `maltrail_log_dir_free_bytes` с достаточным запасом для ожидаемой интенсивности событий.
- Выполняйте ротацию, архивирование или удаление локальных ежедневных журналов с помощью внешних инструментов.
- Храните файлы, необходимые интерфейсу отчётности, несжатыми в `LOG_DIR`; архивируйте сжатые файлы в другом месте.
Когда файловая система журналов заполнена, сенсор не может добавлять события. Журналы событий также могут содержать IP-адреса и домены, которые в некоторых юрисдикциях регулируются как персональные данные; политика хранения должна учитывать применимые требования.
### Синтетический трафик
Чтобы проверить, что обнаружение и панель управления по-прежнему работают, не дожидаясь реального трафика:```bash
python3 server.py --detect-test # assert every detection fires, then exit
python3 server.py --detect-test --keep DIR --serve # ...and keep the events, serving them on :8338
--keep также воспроизводит sensor/tests/corpus/ в тот же журнал и выводит, за какими из форм, которые панель управления отображает иначе, стоит событие, так что отсутствующая иконка, цвет или глиф становятся видимыми, а не предполагаемыми. Метки времени сдвигаются так, чтобы самый новый день был сегодняшним. Требуется бинарный файл sensor (cargo build --release --manifest-path sensor/Cargo.toml).
Данные публичного демо регенерируются из такого запуска:```bash python3 sensor/tools/gen_demo_js.py --from DIR/logs # tops up html/js/demo.js
## Документация
| Документ | Содержание |
| --- | --- |
| [`sensor/docs/INSTALL.md`](https://github.com/stamparm/maltrail/blob/master/sensor/docs/INSTALL.md) | Установка, привилегии, конфигурация и устранение неполадок |
| [`sensor/docs/ARCHITECTURE.md`](https://github.com/stamparm/maltrail/blob/master/sensor/docs/ARCHITECTURE.md) | Внутреннее устройство сенсора и поток данных |
| [`sensor/docs/COMPATIBILITY.md`](https://github.com/stamparm/maltrail/blob/master/sensor/docs/COMPATIBILITY.md) | Намеренные отличия от снятого с эксплуатации Python-сенсора |
| [`sensor/docs/REPORT.md`](https://github.com/stamparm/maltrail/blob/master/sensor/docs/REPORT.md) | Измерения, профили и результаты тестирования |
| [`sensor/docs/ROADMAP.md`](https://github.com/stamparm/maltrail/blob/master/sensor/docs/ROADMAP.md) | Открытые задачи по сенсору |
| [`SekuriPy Labs`](https://www.sekuripy.hr/labs/maltrail/) | Инженерные заметки, бенчмарки и статьи |
## Участие в разработке
Дополнения трейлов, поддержка фидов, сообщения об ошибках, документация и улучшения сенсора приветствуются.
Предложения по трейлам должны включать надёжный источник и использовать наиболее узкую подходящую
классификацию.
Перед отправкой кода запустите соответствующие проверки. Полный набор проверок сенсора:```bash
bash sensor/tools/check.sh
Он выполняет форматирование, Clippy с запретом предупреждений, а также наборы тестов debug и release. Запустите набор тестов Python-сервера с помощью:```bash bash tests/run.sh python3
Сборку для Windows можно запустить из Linux, именно там и были найдены её ошибки:```bash
sh sensor/tools/check_windows.sh
Он выполняет кросс-компиляцию сенсора с помощью mingw-w64, извлекает пользовательскую библиотеку Npcap из его установщика
(архив NSIS, поэтому ничего не устанавливается) и запускает результат под Wine — весь набор модульных тестов,
-T против поставляемой конфигурации, корпус pcap, сравниваемый побайтово с нативным
бинарником, и сервер, отвечающий на /ping под Windows Python. Живой захват — единственное, что он
не может покрыть; для этого нужен драйвер ядра Npcap и настоящая машина с Windows. Предварительные требования —
gcc-mingw-w64-x86-64, wine и p7zip-full.
Проект
Лицензия
Кратко: Maltrail распространяется по лицензии MIT, но набор данных Maltrail Trails имеет отдельные условия. Независимый поиск/ссылка на IOC допустимы; систематическое использование Trails в качестве источника разведданных в коммерческом продукте или сервисе требует разрешения/лицензирования.
Maltrail распространяется по лицензии MIT. См. LICENSE.
Это движок. Набор статических трейлов — отдельная работа на отдельных условиях: бесплатно для внутреннего
защитного использования, исследований и обучения, но коммерческий продукт, сервис, предложение MSSP или MDR, или
распространяемый фид требует лицензии. Движок под MIT не делает контент бесплатным для продажи — см.
LICENSE.md в
stamparm/trails, прежде чем включать его во что-то, за что вы взимаете
плату.
Сопровождающие
- Miroslav Stampar (@stamparm)
- Mikhail Kasimov (@MikhailKasimov)
Спонсоры
Презентации и публикации
- 47th TF-CSIRT Meeting, Prague, 2016 (слайды)
- Detect attacks on your network with Maltrail, Linux Magazine, 2022 (статья)
- Best Cyber Threat Intelligence Feeds, Silent Push, 2022 (обзор)
- Research on Network Malicious Traffic Detection System Based on Maltrail, Nanotechnology Perceptions, 2024 (статья)
Сторонние интеграции
- FreeBSD Port
- OPNsense Gateway Plugin
- D4 Project
- BlackArch Linux
- Validin
- Maltrail Add-on for Splunk
- Maltrail decoder and rules for Wazuh
- GScan (только trails)
- MalwareWorld (только trails)
- oisd domain blocklist (только trails)
- NextDNS (только trails)
- NoTracking (только trails)
- OWASP Mobile Audit (только trails)
- Mobile Security Framework MobSF (только trails)
- pfBlockerNG-devel (только trails)
- Sansec eComscan (только trails)
- Palo Alto Networks Cortex XSOAR (коннектор trails)
Благодарности
- Thomas Kristner
- Eduardo Arcusa Les
- James Lay
- Ladislav Baco (@laciKE)
- John Kristoff (@jtkdpu)
- Michael Münz (@mimugmail)
- David Brush
- @Godwottery
- Chris Wild (@briskets)
- Keith Irwin (@ki9us)
- Simon Szustkowski (@simonszu)