{
version, cpuSet,
controlSection {
flowCount, flowBuffCount, flowBuffSize,
ipSessions, tcpSessions, udpSessions, ip4Fragments,
ndpiEngine, nativeParsers, luaParsers,
trafficRecordSessions, captureMode, controlIf,
tcpLimits { init, soft, hard },
hugePages { enabled, count, mount },
capture { mode, cpuSet, hugePages { enabled, count, mount } }
},
networkAdapters [ ... ],
nativeParsers [ { protocol, enabled, processData }, ... ],
luaParsers [ { script, enabled }, ... ],
recordingRules [ { script, enabled }, ... ],
filters [ { name, groups [ { enabled, name, rules [ ... ] } ] } ],
debug { dumps { log, dump }, memoryTrack { runtime, lua } }
}Приложение Б. Шаблоны конфигурационных файлов
Приложение Б. Шаблоны и примеры конфигурационных файлов
В данном приложении приведены детальные примеры конфигурационных файлов компонентов Alertix-NTA. Примеры содержат типовые значения параметров для продуктивной эксплуатации и могут использоваться как основа для настройки системы.
Все конфигурационные файлы имеют формат JSON (UTF-8) и располагаются в директории /opt/alertixnta/config/. После установки из deb/rpm-пакетов файлы создаются автоматически со значениями по умолчанию; файл ipc.json пакет не содержит — его записывает служба sensor-watcher при запуске, если файла нет.
Значения IP-адресов, портов, токенов, UUID и путей в примерах необходимо заменить на актуальные для вашей инфраструктуры. |
1. ethercap.json — Служба захвата трафика (sensor-ethercap)
Путь: /opt/alertixnta/config/ethercap.json. Служба: sensor-ethercap — захват сетевого трафика с сетевых интерфейсов в реальном времени.
Структура файла
Ключевые параметры
Таблица Б.1 — Параметры ethercap.json
| Параметр | Тип | Умолчание | Описание |
|---|---|---|---|
| string |
| Версия формата конфигурации |
| string |
| CPU affinity (формат Linux cpuset) — ядра для основного потока службы, потоков обработки пакетов (сборка сессий и разбор протоколов; число потоков задаёт |
| int | 4 | Количество параллельных потоков захвата. Увеличивайте при работе с несколькими интерфейсами или высокой скорости трафика |
| int | 1024 | Количество буферов на поток. Общий объём памяти = |
| int | 65536 | Размер одного буфера (байт). 64 КБ покрывает Jumbo Frames |
| bool | true | Отслеживание IP-сессий для корреляции пакетов |
| bool | true | Сборка TCP-потоков. Необходимо для анализа HTTP, SMTP, FTP и других TCP-протоколов. Отключение резко снижает качество анализа |
| bool | true | Группировка UDP-пакетов в логические сессии (DNS, SIP, DHCP) |
| bool | true | Реассемблирование фрагментированных IPv4-датаграмм |
| bool | false | Классификация через nDPI. Увеличивает нагрузку на CPU, улучшает детектирование шифрованных протоколов |
| bool | true | Включение встроенных парсеров протоколов (36 парсеров) |
| bool | true | Включение Lua-парсеров сессий (19 скриптов: 18 парсеров протоколов и сигнатурный движок |
| bool | false | Запись сессий трафика на диск по правилам из |
| string |
| Режим захвата: |
| string |
| Управляющий интерфейс. Пустая строка — управление только через IPC |
| int | 1500000 | Порог числа полуоткрытых TCP-сессий, при достижении которого новые сессии учитываются без разбора протоколов |
| int | 6000000 | Порог числа TCP-сессий, при достижении которого новые сессии учитываются без разбора протоколов |
| int | 9000000 | Порог числа TCP-сессий, при достижении которого новые TCP-сессии не отслеживаются до освобождения ресурсов. Пороги |
| bool | — | Выделение hugepages при запуске службы |
| int | — | Число страниц по 2 МиБ, выделяемых на каждом узле NUMA |
| string |
| Каталог монтирования hugepages |
| string | — | Ядра процессора (формат Linux cpuset) для потоков чтения пакетов с сетевых интерфейсов в режимах AF_PACKET, AF_XDP и DPDK (DPDK — в пакетах с поддержкой DPDK). Служба запускает |
Объект capture. Поставляемый файл задаёт режим захвата и hugepages ключами controlSection.captureMode и controlSection.hugePages. При первом запуске служба sensor-ethercap переносит эти значения в объект controlSection.capture (ключи mode, cpuSet и hugePages) и сохраняет файл; ключи captureMode и hugePages блока controlSection в сохранённом файле отсутствуют. Если объект capture в файле есть, служба читает режим захвата, ядра потоков чтения и hugepages только из него, поэтому после первого запуска изменяйте эти параметры внутри controlSection.capture.
Нативные парсеры (nativeParsers[]) — массив параметров 36 встроенных парсеров. Каждый элемент содержит protocol (идентификатор), enabled (вкл/выкл) и processData (разбирать payload или только фиксировать наличие протокола). Идентификаторы встроенных парсеров:
dc, dcerpc, dns, ftp, http, http2, icap, icmp, icq, imap4, irc, kafka, kerberos, ldap, lotus, mra, msn, mysql, ntp, oracle, pop3, postgres, quic, skype, smb, smtp, socks, ssh, ssl, stun, tds, torrent, websocket, xmpp, yahoo, sip2.
Массив не ограничивает набор парсеров, а переопределяет их параметры: парсер, для которого в массиве нет записи, работает с параметрами enabled: true и processData: true. Поставляемый ethercap.json перечисляет 33 парсера; записей для quic, ssh и stun в нём нет, и эти парсеры включены по умолчанию. Чтобы выключить парсер, добавьте для него запись с "enabled": false; выключить все встроенные парсеры сразу можно параметром controlSection.nativeParsers: false.
Lua-парсеры (luaParsers[]) — 19 скриптов каталога /opt/alertixnta/scripts/eth-sessions/: 18 парсеров и детекторов протоколов — MTProto (Telegram), SSH, DCE/RPC, DNS, DRDA, ФПСУ-IP (клиентский VPN поверх UDP), ICMP, IPsec, Kafka, Kerberos, LDAP, MS-TDS, MySQL, OpenVPN, Oracle, PostgreSQL, PPTP, WireGuard — и сигнатурный движок lwDPI (p2-lwdpi.lua). В базовой поставке протокол gSocket распознаётся движком lwDPI; отдельный скрипт p2-gsocket.lua поставляется только в OEM DPI редакции для NDR. Запись массива содержит ключи script (имя файла в каталоге eth-sessions) и enabled.
Синхронизация списка со скриптами каталога. При каждом запуске служба |
Пример: типовая продуктивная конфигурация
{
"version": "6.2",
"cpuSet": "5-7",
"controlSection": {
"flowCount": 4,
"flowBuffCount": 1024,
"flowBuffSize": 65536,
"ipSessions": true,
"tcpSessions": true,
"udpSessions": true,
"ip4Fragments": true,
"ndpiEngine": false,
"nativeParsers": true,
"luaParsers": true,
"trafficRecordSessions": false,
"captureMode": "afpkt",
"controlIf": "",
"tcpLimits": { "init": 1500000, "soft": 6000000, "hard": 9000000 }
},
"networkAdapters": [],
"nativeParsers": [
{ "protocol": "dc", "enabled": true, "processData": true },
{ "protocol": "dcerpc", "enabled": true, "processData": true },
{ "protocol": "dns", "enabled": true, "processData": true },
{ "protocol": "ftp", "enabled": true, "processData": true },
{ "protocol": "http", "enabled": true, "processData": true },
{ "protocol": "http2", "enabled": true, "processData": true },
{ "protocol": "icap", "enabled": true, "processData": true },
{ "protocol": "icmp", "enabled": true, "processData": true },
{ "protocol": "icq", "enabled": true, "processData": true },
{ "protocol": "imap4", "enabled": true, "processData": true },
{ "protocol": "irc", "enabled": true, "processData": true },
{ "protocol": "ldap", "enabled": true, "processData": true },
{ "protocol": "lotus", "enabled": true, "processData": true },
{ "protocol": "mra", "enabled": true, "processData": true },
{ "protocol": "msn", "enabled": true, "processData": true },
{ "protocol": "ntp", "enabled": true, "processData": true },
{ "protocol": "pop3", "enabled": true, "processData": true },
{ "protocol": "skype", "enabled": true, "processData": true },
{ "protocol": "smb", "enabled": true, "processData": true },
{ "protocol": "smtp", "enabled": true, "processData": true },
{ "protocol": "socks", "enabled": true, "processData": true },
{ "protocol": "ssl", "enabled": true, "processData": true },
{ "protocol": "torrent", "enabled": true, "processData": true },
{ "protocol": "websocket", "enabled": true, "processData": true },
{ "protocol": "xmpp", "enabled": true, "processData": true },
{ "protocol": "yahoo", "enabled": true, "processData": true },
{ "protocol": "sip2", "enabled": true, "processData": true },
{ "protocol": "kafka", "enabled": true, "processData": true },
{ "protocol": "kerberos", "enabled": true, "processData": true },
{ "protocol": "mysql", "enabled": true, "processData": true },
{ "protocol": "oracle", "enabled": true, "processData": true },
{ "protocol": "postgres", "enabled": true, "processData": true },
{ "protocol": "tds", "enabled": true, "processData": true }
],
"luaParsers": [
{ "script": "p2-mtproto.lua", "enabled": true },
{ "script": "p2-ssh.lua", "enabled": true },
{ "script": "p2-dcerpc.lua", "enabled": false },
{ "script": "p2-dns.lua", "enabled": false },
{ "script": "p2-drda.lua", "enabled": false },
{ "script": "p2-fpsu.lua", "enabled": false },
{ "script": "p2-icmp.lua", "enabled": false },
{ "script": "p2-ipsec.lua", "enabled": false },
{ "script": "p2-kafka.lua", "enabled": false },
{ "script": "p2-kerberos.lua", "enabled": false },
{ "script": "p2-ldap.lua", "enabled": false },
{ "script": "p2-mstds.lua", "enabled": false },
{ "script": "p2-mysql.lua", "enabled": false },
{ "script": "p2-openvpn.lua", "enabled": false },
{ "script": "p2-oracle.lua", "enabled": false },
{ "script": "p2-postgres.lua", "enabled": false },
{ "script": "p2-pptp.lua", "enabled": false },
{ "script": "p2-wireguard.lua", "enabled": false },
{ "script": "p2-lwdpi.lua", "enabled": true }
],
"recordingRules": [
{ "script": "p1-record_unknown.lua", "enabled": false }
],
"filters": [
{
"name": "default",
"groups": [
{
"enabled": true,
"name": "Accept all",
"rules": [
{
"type": "accept",
"comment": "Accept all tcp or udp traffic",
"code": "tcp or udp"
}
]
}
]
}
],
"debug": {
"dumps": { "log": true, "dump": false },
"memoryTrack": { "runtime": false, "lua": false }
}
}Пример: высокопроизводительная конфигурация с DPDK и BPF-фильтрами
Для сетей 10+ Гбит/с с фильтрацией по корпоративной подсети; режим "dpdk" работает только в пакетах с поддержкой DPDK. Объект hugePages задаёт выделение 1024 страниц по 2 МиБ на каждом узле NUMA при запуске службы sensor-ipc. Массив nativeParsers перечисляет 13 парсеров, но не ограничивает набор: остальные 23 встроенных парсера остаются включёнными, и для их отключения добавьте записи с "enabled": false. В массив luaParsers при запуске служба сама добавит остальные скрипты каталога eth-sessions (p2-lwdpi.lua — включённым, прочие — выключенными):
{
"version": "6.2",
"cpuSet": "4-7",
"controlSection": {
"flowCount": 8,
"flowBuffCount": 4096,
"flowBuffSize": 65536,
"ipSessions": true,
"tcpSessions": true,
"udpSessions": true,
"ip4Fragments": true,
"ndpiEngine": true,
"nativeParsers": true,
"luaParsers": true,
"trafficRecordSessions": false,
"captureMode": "dpdk",
"controlIf": "eth0",
"hugePages": {
"enabled": true,
"count": 1024,
"mount": "/home/alertixnta/huge"
}
},
"networkAdapters": [],
"nativeParsers": [
{ "protocol": "dns", "enabled": true, "processData": true },
{ "protocol": "http", "enabled": true, "processData": true },
{ "protocol": "http2", "enabled": true, "processData": true },
{ "protocol": "smtp", "enabled": true, "processData": true },
{ "protocol": "ssl", "enabled": true, "processData": true },
{ "protocol": "smb", "enabled": true, "processData": true },
{ "protocol": "ftp", "enabled": true, "processData": true },
{ "protocol": "imap4", "enabled": true, "processData": true },
{ "protocol": "pop3", "enabled": true, "processData": true },
{ "protocol": "ldap", "enabled": true, "processData": true },
{ "protocol": "kerberos", "enabled": true, "processData": true },
{ "protocol": "kafka", "enabled": true, "processData": true },
{ "protocol": "websocket", "enabled": true, "processData": true }
],
"luaParsers": [
{ "script": "p2-mtproto.lua", "enabled": true },
{ "script": "p2-ssh.lua", "enabled": true }
],
"recordingRules": [],
"filters": [
{
"name": "production",
"groups": [
{
"enabled": true,
"name": "Corporate traffic",
"rules": [
{ "type": "accept", "comment": "Corporate subnet",
"code": "net 198.51.100.0/24" },
{ "type": "accept", "comment": "DMZ", "code": "net 172.16.0.0/12" }
]
},
{
"enabled": true,
"name": "Drop noise",
"rules": [
{
"type": "drop", "comment": "Drop multicast",
"code": "multicast"
},
{
"type": "drop", "comment": "Drop broadcast",
"code": "broadcast"
}
]
}
]
}
],
"debug": {
"dumps": { "log": true, "dump": false },
"memoryTrack": { "runtime": false, "lua": false }
}
}Рекомендации по настройке
Число потоков (
flowCount) не должно превышать число ядер процессора: при большем значении служба запускает один поток и записывает предупреждение в журнал. Служба запускаетflowCountпотоков чтения пакетов (ядра —controlSection.capture.cpuSet) и столько же потоков обработки пакетов (ядра —cpuSet); чтобы каждый поток получил собственное ядро, задавайте в каждом наборе не меньшеflowCountядер — при меньшем числе ядер потоки распределяются по ядрам набора по кругу.Общий объём буферов:
flowCount * flowBuffCount * flowBuffSize. По умолчанию: 4 * 1024 * 64 КБ = 256 МБ. Убедитесь, что сервер располагает достаточным объёмом RAM.Режим DPDK доступен в пакетах с поддержкой DPDK. Hugepages для него задаются объектом
controlSection.hugePagesвethercap.json(после первого запуска службы — объектомcontrolSection.capture.hugePages) и выделяются автоматически при каждом запуске службыsensor-ipc; вручную администратор выполняет только привязку сетевых адаптеров к DPDK-драйверу (vfio-pciилиigb_uio).BPF-фильтры компилируются при запуске. Невалидное BPF-выражение блокирует запуск сервиса.
Если протокол не представляет интереса, установите
processData: false— это снизит нагрузку на CPU при сохранении фиксации факта наличия протокола.
2. analyser.json — Служба анализа (sensor-analyser)
Путь: /opt/alertixnta/config/analyser.json. Служба: sensor-analyser — ядро анализа сетевого трафика. Принимает через IPC события, сформированные службами захвата (разбор протоколов выполняют sensor-ethercap и sensor-pcap), и выполняет классификацию, детектирование контента и сопоставление с индикаторами компрометации.
Структура файла
{
version, cpuSet, maxFileSizeInMemory, maxFileSizeOnDisk,
rawFilter { enabled, fileName },
messageFilter { enabled, fileName },
iocAttributes {
enabled, domain, url,
fileHash { md5, sha1, sha256, sha512, tlsh, ssdeep },
cookies, userAgent, email,
ja3, ja4, ja3s, ja4s, ja4x, ja4h, ja4ssh
},
workFlow {
settings {
preFilter { threadCount, maxEventCount },
detect { threadCount, maxEventCount },
postFilter { threadCount, maxEventCount }
},
preFilter [ { name, enabled, on_error }, ... ],
detect [ { name, enabled, on_error }, ... ],
postFilter [ { name, enabled, on_error }, ... ],
analyseIPC [ { name, enabled, on_error }, ... ],
onTimer [ { name, enabled, on_error }, ... ]
},
debug { dumps { log, dump }, memoryTrack { runtime, lua } }
}Массив workFlow.onTimer в поставляемом файле отсутствует и добавляется администратором при подключении скриптов стадии L5.
Ключевые параметры
Таблица Б.2 — Параметры analyser.json
| Параметр | Тип | Умолчание | Описание |
|---|---|---|---|
| string |
| Версия формата конфигурации |
| string |
| CPU affinity для потоков анализатора. Количество ядер должно быть не менее суммы |
| int | 10485760 (10 МБ) | Порог размера файла в RAM. Файлы крупнее сбрасываются на диск (spill-to-disk) |
| int | 536870912 (512 МБ) | Максимальный размер файла на диске. Сверх этого предела объект не дособирается: событие обрабатывается дальше с собранной частью и атрибутом |
| bool | false | Фильтрация сырых пакетов по правилам из XML-файла до передачи в |
| string |
| XML-файл с правилами фильтрации пакетов (в |
| bool | true | Фильтрация на уровне разобранных сообщений |
| string |
| XML-файл с правилами фильтрации сообщений (в |
| bool | false | Главный переключатель сопоставления атрибутов событий с индикаторами компрометации, загруженными службой |
| bool | true | Сопоставление доменных имён (DNS-запросы и ответы, SNI TLS и QUIC, заголовок Host HTTP) и URL |
| bool | true | Сопоставление хэшей MD5 и SHA-256 извлечённых файлов |
| bool | false | Сопоставление хэшей SHA-1 и SHA-512 извлечённых файлов |
| bool | false | Присутствуют в поставляемом файле; оставляйте выключенными — хэши файлов сопоставляются по алгоритмам MD5, SHA-1, SHA-256 и SHA-512 |
| bool | true | Сопоставление отпечатков JA3 и JA4 клиента TLS и QUIC |
| bool | false | Сопоставление cookie и User-Agent HTTP, адресов электронной почты (SMTP, POP3, IMAP), отпечатков сервера TLS (JA3S, JA4S), сертификата клиента TLS (JA4X), HTTP-запроса (JA4H) и SSH (JA4SSH) |
| bool | false | В поставляемом файле отсутствуют и добавляются вручную: IP-адреса из DNS-ответов A/AAAA, отпечаток JA4X сертификата сервера TLS, SHA-1 сертификатов клиента и сервера TLS, отпечатки HASSH клиента и сервера SSH, баннер SSH |
| int | 10 | Потоки предварительной классификации |
| int | 100000 | Размер очереди событий перед |
| int | 10 | Потоки детектирования. Наиболее ресурсоёмкий этап — рекомендуется наибольшее количество потоков |
| int | 100000 | Размер очереди событий перед |
| int | 1 | Потоки постобработки. Обычно достаточно одного |
| int | 100000 | Размер очереди событий перед |
Конвейер Lua-скриптов (workFlow) состоит из пяти этапов. Скрипт этапа исполняется, только если его имя внесено в список этапа с признаком "enabled": true; в скобках указано число записей в поставляемом analyser.json:
preFilter(префиксl1-, каталогan-prefilter/, 25 записей, все включены) — предварительная классификация по протоколам. Каталог содержит 31 скрипт; при запуске служба добавляет отсутствующие в списке скрипты каталога выключеннымиdetect(префиксl2-, каталогan-detect/, 74 записи, включены 72; выключеныl2-kerberos-golden.luaиl2-mapi-http.lua) — детектирование протоколов, веб-сервисов, контента и угроз. Детекторы вызываются по возрастанию номера записи: 69 детекторов встроенного перечня стадии L2 получают фиксированный номер независимо от места своей записи в массиве, остальные детекторы, в том числе детекторы угроз, кромеl2-doh.lua, — номер позиции своей записи (счёт с нуля); взаимный порядок детекторов с равными номерами не определён. Детекторы протоколовl2-ldap.lua,l2-sip2.lua,l2-smb.luaиl2-ssl.lua(фиксированные номера 4, 6, 7 и 8) завершают кодомDROPобработку каждого события своего типа, поэтому детектор угроз получает событие, только если номер позиции его записи меньше номера детектора протокола того же типа события. Записи детекторов угроз ставятся в начало массива; перенос записи на строку выше записи детектора протокола требуемого номера не гарантирует, поскольку номер детектора протокола от места его записи не зависит: например, запись над записьюl2-smb.lua, стоящей в поставляемом файле на позиции 69, получает номер 69. Скриптыl2-tls-anomaly.luaиl2-sip-anomaly.luaпо умолчанию не подключены; их записи также вносятся в начало массива.postFilter(префиксl3-, каталогan-postfilter/, 2 записи; включёнl3-dropall.lua, выключенl3-check-malware.lua) — постобработка (malware-проверка, финальная очистка)analyseIPC(префиксl4-, каталогan-ipcchannels/, 11 записей, включены 10; выключенl4-slow-tcp.lua) — обработка IPC-событий жизненного цикла сессийonTimer(префиксl5-, каталогan-timers/) — периодически вызываемые скрипты (таймерные задачи). В поставляемом файле массива нет, поэтому 5 скриптов стадии L5 по умолчанию не исполняются; для включения добавьте массивonTimerс их именами
Каждый скрипт: name (имя .lua-файла из каталога своего этапа в /opt/alertixnta/scripts/), enabled (вкл/выкл), on_error (true — при ошибке вызывать функцию-обработчик on_error(desc, param1) скрипта, false — не вызывать обработчик). Изменённое содержимое зарегистрированных скриптов стадий L1–L4 применяется без перезапуска службы командой sudo systemctl reload sensor-analyser. Той же командой применяется новая или включённая запись списка detect; перестановка существующих записей этого списка применяется перезапуском службы командой sudo systemctl restart sensor-analyser, а не перечитыванием конфигурации.
Пример: типовая продуктивная конфигурация
{
"version": "6.4",
"cpuSet": "5-8",
"maxFileSizeInMemory": 10485760,
"maxFileSizeOnDisk": 536870912,
"rawFilter": {
"enabled": false,
"fileName": "http.filter.xml"
},
"messageFilter": {
"enabled": true,
"fileName": "msg.filter.xml"
},
"iocAttributes": {
"enabled": false,
"domain": true,
"url": true,
"fileHash": {
"md5": true,
"sha1": false,
"sha256": true,
"sha512": false,
"tlsh": false,
"ssdeep": false
},
"cookies": false,
"userAgent": false,
"email": false,
"ja3": true,
"ja4": true,
"ja3s": false,
"ja4s": false,
"ja4x": false,
"ja4h": false,
"ja4ssh": false
},
"workFlow": {
"settings": {
"preFilter": { "threadCount": 10, "maxEventCount": 100000 },
"detect": { "threadCount": 10, "maxEventCount": 100000 },
"postFilter": { "threadCount": 1, "maxEventCount": 100000 }
},
"preFilter": [
{ "name": "l1-ldap.lua", "enabled": true, "on_error": false },
{ "name": "l1-dns.lua", "enabled": true, "on_error": false },
{ "name": "l1-icmp.lua", "enabled": true, "on_error": false },
{ "name": "l1-ssl.lua", "enabled": true, "on_error": false },
{ "name": "l1-http.lua", "enabled": true, "on_error": false },
{ "name": "l1-sip2.lua", "enabled": true, "on_error": false },
{ "name": "l1-smb.lua", "enabled": true, "on_error": false },
{ "name": "l1-mysql.lua", "enabled": true, "on_error": false },
{ "name": "l1-lotus.lua", "enabled": true, "on_error": false },
{ "name": "l1-oracle.lua", "enabled": true, "on_error": false },
{ "name": "l1-torrent.lua", "enabled": true, "on_error": false },
{ "name": "l1-imap4.lua", "enabled": true, "on_error": false },
{ "name": "l1-ftp.lua", "enabled": true, "on_error": false },
{ "name": "l1-pop3.lua", "enabled": true, "on_error": false },
{ "name": "l1-pcap.lua", "enabled": true, "on_error": false },
{ "name": "l1-tds.lua", "enabled": true, "on_error": false },
{ "name": "l1-xmpp.lua", "enabled": true, "on_error": false },
{ "name": "l1-kafka.lua", "enabled": true, "on_error": false },
{ "name": "l1-kerberos.lua", "enabled": true, "on_error": false },
{ "name": "l1-smtp.lua", "enabled": true, "on_error": false },
{ "name": "l1-websocket.lua", "enabled": true, "on_error": false },
{ "name": "l1-postgres.lua", "enabled": true, "on_error": false },
{ "name": "l1-irc.lua", "enabled": true, "on_error": false },
{ "name": "l1-ssh.lua", "enabled": true, "on_error": false },
{ "name": "l1-drop-100MB.lua", "enabled": true, "on_error": false }
],
"detect": [
{ "name": "l2-pcap.lua", "enabled": true, "on_error": false },
{ "name": "l2-dns.lua", "enabled": true, "on_error": false },
{ "name": "l2-icmp.lua", "enabled": true, "on_error": false },
{ "name": "l2-ssl.lua", "enabled": true, "on_error": false },
{ "name": "l2-sip2.lua", "enabled": true, "on_error": false },
{ "name": "l2-postgres.lua", "enabled": true, "on_error": false },
{ "name": "l2-mysql.lua", "enabled": true, "on_error": false },
{ "name": "l2-oracle.lua", "enabled": true, "on_error": false },
{ "name": "l2-mstds.lua", "enabled": true, "on_error": false },
{ "name": "l2-kafka.lua", "enabled": true, "on_error": false },
{ "name": "l2-kerberos-roasting.lua", "enabled": true, "on_error": false },
{ "name": "l2-kerberos-golden.lua", "enabled": false, "on_error": false },
{ "name": "l2-dcerpc-lateral.lua", "enabled": true, "on_error": false },
{ "name": "l2-ftp.lua", "enabled": true, "on_error": false },
{ "name": "l2-xmpp.lua", "enabled": true, "on_error": false },
{ "name": "l2-websocket-slack.com.lua", "enabled": true, "on_error": false },
{ "name": "l2-websocket-skype.lua", "enabled": true, "on_error": false },
{ "name": "l2-websocket-whatsapp.lua", "enabled": true, "on_error": false },
{ "name": "l2-websocket-ok.ru.lua", "enabled": true, "on_error": false },
{ "name": "l2-websocket-xmpp.lua", "enabled": true, "on_error": false },
{ "name": "l2-websocket-generic.lua", "enabled": true, "on_error": false },
{ "name": "l2-slack.com.lua", "enabled": true, "on_error": false },
{ "name": "l2-connect.lua", "enabled": true, "on_error": false },
{ "name": "l2-doh.lua", "enabled": true, "on_error": false },
{ "name": "l2-search-query.lua", "enabled": true, "on_error": false },
{ "name": "l2-mapi-http.lua", "enabled": false, "on_error": false },
{ "name": "l2-livejournal.lua", "enabled": true, "on_error": false },
{ "name": "l2-ok.ru.lua", "enabled": true, "on_error": false },
{ "name": "l2-vk.com.lua", "enabled": true, "on_error": false },
{ "name": "l2-rabota.ru.lua", "enabled": true, "on_error": false },
{ "name": "l2-hh.ru.lua", "enabled": true, "on_error": false },
{ "name": "l2-superjob.ru.lua", "enabled": true, "on_error": false },
{ "name": "l2-dropbox.com.lua", "enabled": true, "on_error": false },
{ "name": "l2-cloud.mail.ru.lua", "enabled": true, "on_error": false },
{ "name": "l2-mail.ru.lua", "enabled": true, "on_error": false },
{ "name": "l2-rambler.ru.lua", "enabled": true, "on_error": false },
{ "name": "l2-ydisk.lua", "enabled": true, "on_error": false },
{ "name": "l2-yandex.ru.lua", "enabled": true, "on_error": false },
{ "name": "l2-blogger.com.lua", "enabled": true, "on_error": false },
{ "name": "l2-facebook.com.lua", "enabled": true, "on_error": false },
{ "name": "l2-gdrive.lua", "enabled": true, "on_error": false },
{ "name": "l2-gmail.com.lua", "enabled": true, "on_error": false },
{ "name": "l2-instagram.com.lua", "enabled": true, "on_error": false },
{ "name": "l2-linkedin.com.lua", "enabled": true, "on_error": false },
{ "name": "l2-onedrive.lua", "enabled": true, "on_error": false },
{ "name": "l2-live.com.lua", "enabled": true, "on_error": false },
{ "name": "l2-twitter.com.lua", "enabled": true, "on_error": false },
{ "name": "l2-web-icq.lua", "enabled": true, "on_error": false },
{ "name": "l2-web-mra.lua", "enabled": true, "on_error": false },
{ "name": "l2-web-skype.lua", "enabled": true, "on_error": false },
{ "name": "l2-yahoo.com.lua", "enabled": true, "on_error": false },
{ "name": "l2-owa.lua", "enabled": true, "on_error": false },
{ "name": "l2-mamba.lua", "enabled": true, "on_error": false },
{ "name": "l2-loveplanet.lua", "enabled": true, "on_error": false },
{ "name": "l2-ipboard.lua", "enabled": true, "on_error": false },
{ "name": "l2-vbulletin.lua", "enabled": true, "on_error": false },
{ "name": "l2-mybb.lua", "enabled": true, "on_error": false },
{ "name": "l2-phpbb.lua", "enabled": true, "on_error": false },
{ "name": "l2-wordpress.lua", "enabled": true, "on_error": false },
{ "name": "l2-dropmefiles.com.lua", "enabled": true, "on_error": false },
{ "name": "l2-webdav.lua", "enabled": true, "on_error": false },
{ "name": "l2-accounts.lua", "enabled": true, "on_error": false },
{ "name": "l2-generic.lua", "enabled": true, "on_error": false },
{ "name": "l2-file-upload.lua", "enabled": true, "on_error": false },
{ "name": "l2-file-download.lua", "enabled": true, "on_error": false },
{ "name": "l2-imap4.lua", "enabled": true, "on_error": false },
{ "name": "l2-pop3.lua", "enabled": true, "on_error": false },
{ "name": "l2-smtp.lua", "enabled": true, "on_error": false },
{ "name": "l2-torrent.lua", "enabled": true, "on_error": false },
{ "name": "l2-smb.lua", "enabled": true, "on_error": false },
{ "name": "l2-smb-lateral.lua", "enabled": true, "on_error": false },
{ "name": "l2-lotus.lua", "enabled": true, "on_error": false },
{ "name": "l2-ldap-recon.lua", "enabled": true, "on_error": false },
{ "name": "l2-ldap.lua", "enabled": true, "on_error": false }
],
"postFilter": [
{ "name": "l3-check-malware.lua", "enabled": false, "on_error": false },
{ "name": "l3-dropall.lua", "enabled": true, "on_error": false }
],
"analyseIPC": [
{ "name": "l4-open-ip.lua", "enabled": true, "on_error": false },
{ "name": "l4-open-udp.lua", "enabled": true, "on_error": false },
{ "name": "l4-open-tcp.lua", "enabled": true, "on_error": false },
{ "name": "l4-close-ip.lua", "enabled": true, "on_error": false },
{ "name": "l4-close-udp.lua", "enabled": true, "on_error": false },
{ "name": "l4-close-tcp.lua", "enabled": true, "on_error": false },
{ "name": "l4-update-ip.lua", "enabled": true, "on_error": false },
{ "name": "l4-update-udp.lua", "enabled": true, "on_error": false },
{ "name": "l4-update-tcp.lua", "enabled": true, "on_error": false },
{ "name": "l4-slow-tcp.lua", "enabled": false, "on_error": false },
{ "name": "l4-mtproto.lua", "enabled": true, "on_error": false }
]
},
"debug": {
"dumps": { "log": true, "dump": false },
"memoryTrack": { "runtime": false, "lua": false }
}
}Детекторы горизонтального перемещения. Включённые в примере детекторы l2-smb-lateral.lua и l2-ldap-recon.lua выпускают находки только после заполнения списка whitelist_admin_hosts своей секции (anomaly.smb, anomaly.ldap) в файле /opt/alertixnta/config/anomaly.json; детектор l2-dcerpc-lateral.lua — после заполнения списков anomaly.dcerpc.domain_controllers (для выявления DCSync) и anomaly.dcerpc.whitelist_admin_hosts (для остальных классов). В списки вносятся IP-адреса или подсети в нотации CIDR: легитимных узлов администрирования и контроллеров домена соответственно. Кроме того, событие должно дойти до детектора: номер позиции записи детектора угроз в списке detect должен быть меньше фиксированного номера детектора протокола, который завершает кодом DROP обработку событий того же типа, — 7 у l2-smb.lua и 4 у l2-ldap.lua. В примере, как и в поставляемом файле, записи l2-smb-lateral.lua и l2-ldap-recon.lua стоят на позициях 70 и 72, поэтому события raw/smb и raw/ldap до них не доходят, пока записи не перенесены в начало списка; перенос записи на строку выше записи l2-smb.lua или l2-ldap.lua условия не выполняет. Запись l2-dcerpc-lateral.lua переносить не требуется: у событий raw/dcerpc завершающего детектора протокола нет. Детектор l2-kerberos-golden.lua зарегистрирован выключенным: включайте его в средах, где Alertix-NTA получает трафик выдачи билетов Kerberos от всех контроллеров домена.
Пример: высоконагруженная конфигурация
Для серверов с 16+ ядрами и интенсивным трафиком — увеличенные пулы потоков, фильтрация пакетов, расширенные буферы. Скрипты каталога an-prefilter/, не внесённые в сокращённый список preFilter, служба при запуске добавит в список выключенными:
{
"version": "6.4",
"cpuSet": "8-15",
"maxFileSizeInMemory": 52428800,
"maxFileSizeOnDisk": 1073741824,
"rawFilter": {
"enabled": true,
"fileName": "custom-raw.filter.xml"
},
"messageFilter": {
"enabled": true,
"fileName": "msg.filter.xml"
},
"workFlow": {
"settings": {
"preFilter": { "threadCount": 4, "maxEventCount": 500000 },
"detect": { "threadCount": 8, "maxEventCount": 500000 },
"postFilter": { "threadCount": 2, "maxEventCount": 200000 }
},
"preFilter": [
{ "name": "l1-http.lua", "enabled": true, "on_error": false },
{ "name": "l1-dns.lua", "enabled": true, "on_error": false },
{ "name": "l1-ssl.lua", "enabled": true, "on_error": false },
{ "name": "l1-smtp.lua", "enabled": true, "on_error": false },
{ "name": "l1-drop-100MB.lua", "enabled": true, "on_error": false }
],
"detect": [
{ "name": "l2-dns.lua", "enabled": true, "on_error": false },
{ "name": "l2-ssl.lua", "enabled": true, "on_error": false },
{ "name": "l2-smtp.lua", "enabled": true, "on_error": false },
{ "name": "l2-imap4.lua", "enabled": true, "on_error": false },
{ "name": "l2-pop3.lua", "enabled": true, "on_error": false },
{ "name": "l2-generic.lua", "enabled": true, "on_error": false },
{ "name": "l2-file-upload.lua", "enabled": true, "on_error": false },
{ "name": "l2-file-download.lua", "enabled": true, "on_error": false }
],
"postFilter": [
{ "name": "l3-check-malware.lua", "enabled": true, "on_error": true },
{ "name": "l3-dropall.lua", "enabled": true, "on_error": false }
],
"analyseIPC": [
{ "name": "l4-open-tcp.lua", "enabled": true, "on_error": false },
{ "name": "l4-close-tcp.lua", "enabled": true, "on_error": false },
{ "name": "l4-update-tcp.lua", "enabled": true, "on_error": false },
{ "name": "l4-mtproto.lua", "enabled": true, "on_error": false }
]
},
"debug": {
"dumps": { "log": true, "dump": false },
"memoryTrack": { "runtime": false, "lua": false }
}
}Рекомендации по настройке
Суммарный
threadCount(preFilter+detect+postFilter) не должен превышать количество ядер вcpuSet.maxFileSizeOnDiskдолжен быть строго большеmaxFileSizeInMemory.Этап
detect— самый ресурсоёмкий. Выделяйте ему наибольшее количество потоков.Если все скрипты определённого этапа отключены, потоки всё равно выделяются — ресурсы расходуются впустую.
В продуктивной среде отключайте
debug.dumps.dumpи оба флагаmemoryTrack— они существенно снижают производительность.
3. transfer.json — Служба доставки (sensor-transfer)
Путь: /opt/alertixnta/config/transfer.json. Служба: sensor-transfer — передача обработанных данных во внешние системы по различным протоколам.
Структура файла
{
version, sensorID, transportThreads,
profiles [
{ name, enabled, default, protocol, comment, ...параметры протокола... },
...
],
debug { dumps { log, dump }, memoryTrack { runtime, lua } }
}Глобальные параметры
Таблица Б.3 — Глобальные параметры transfer.json
| Параметр | Тип | Умолчание | Описание |
|---|---|---|---|
| string |
| Версия формата конфигурации |
| string | — | UUID v4, уникальный идентификатор экземпляра сенсора. Встраивается во все исходящие события |
| int | 2 | Количество потоков транспортного пула. Ограничено количеством CPU. Рекомендуется >= количества активных профилей |
Общие поля каждого профиля
Таблица Б.4 — Общие поля профиля transfer.json
| Параметр | Тип | Описание |
|---|---|---|
| string | Уникальное имя профиля |
| bool | Активность профиля |
| bool | Профиль по умолчанию — получает все события, не назначенные конкретным профилям |
| string | Тип протокола: |
| string | Комментарий администратора |
Пример: профиль filedrop (локальный файловый вывод)
Сохранение событий в локальную файловую систему в формате JSON с организацией по дате:
{
"name": "local_filedrop",
"enabled": true,
"default": true,
"protocol": "filedrop",
"comment": "Локальное хранение перехваченных событий",
"file_drop_path": "/opt/alertixnta/events/filedrop",
"save_format": "json",
"save_zip": false,
"quota": "50Gb",
"file_drop_mask": "%Y-%m-%d/%H",
"enable_tmp": false
}Параметры filedrop:
Таблица Б.5 — Параметры профиля filedrop
| Параметр | Умолчание | Описание |
|---|---|---|
| — | Базовый путь для записи файлов |
|
| Формат: |
| false | Сжатие ZIP. Экономит место, увеличивает нагрузку CPU |
|
| Квота. |
|
| Маска поддиректорий (strftime). По умолчанию: |
| false | Атомарная запись через |
Пример: профиль syslog (экспорт в SIEM)
Отправка событий в формате CEF через Syslog для интеграции с SIEM-системами:
{
"name": "siem_syslog_cef",
"enabled": true,
"default": false,
"protocol": "syslog",
"comment": "Экспорт событий в SIEM (CEF через Syslog UDP)",
"syslog_server": "192.0.2.100",
"syslog_port": 514,
"syslog_tcp": false,
"enable_ssl": false,
"script_name": "alertixnta_lua_cef.lua",
"tcp_timeout": 10
}Вариант с TCP и SSL для надёжной передачи:
{
"name": "siem_syslog_cef_tls",
"enabled": true,
"default": false,
"protocol": "syslog",
"comment": "Экспорт событий в SIEM (CEF через Syslog TCP+TLS)",
"syslog_server": "siem.company.local",
"syslog_port": 6514,
"syslog_tcp": true,
"enable_ssl": true,
"keep_connection": true,
"script_name": "alertixnta_lua_cef.lua",
"tcp_timeout": 10,
"octet_counting": false
}Вариант для Wazuh (CEF через TCP+TLS с non-transparent framing):
{
"name": "wazuh_syslog_cef",
"enabled": true,
"default": false,
"protocol": "syslog",
"comment": "CEF в Wazuh (remoted не поддерживает RFC 5425 octet counting)",
"syslog_server": "wazuh.company.local",
"syslog_port": 6514,
"syslog_tcp": true,
"enable_ssl": true,
"keep_connection": true,
"script_name": "alertixnta_lua_cef.lua",
"tcp_timeout": 10,
"octet_counting": false
}Важно для Wazuh. Параметр |
Пример: профили syslog для событий угроз
Профиль протокола syslog, у которого параметр channel_name равен имени подканала канала threat, передаёт события угроз — находки детекторов в формате JSON, по одному событию в сообщении; сценарий из параметра script_name к этим событиям не применяется. Один профиль читает один подканал.
В поставляемом файле transfer.json для событий угроз предусмотрен профиль syslog_threat_ioc_match: он читает подканал threat:ti_match (совпадения с индикаторами компрометации) и поставляется выключенным. Ниже профиль приведён в поставляемом виде, адрес приёмника заменён заполнителем <адрес-SIEM>. После установки "enabled": true, указания адреса приёмника и перечитывания конфигурации службы sensor-transfer каждое совпадение с индикатором передаётся на приёмник отдельным сообщением по UDP:
{
"name": "syslog_threat_ioc_match",
"enabled": false,
"default": false,
"comment": "",
"protocol": "syslog",
"syslog_server": "<адрес-SIEM>",
"syslog_port": 514,
"syslog_tcp": false,
"enable_ssl": false,
"keep_connection": true,
"script_name": "syslog_native.lua",
"channel_name": "threat:ti_match",
"tcp_timeout": 10,
"go_profile_weight": 1,
"go_profile_reserve": false
}По UDP сообщение длиннее 1472 байт усекается, а событие с развёрнутыми свидетельствами может превысить этот предел, поэтому для событий угроз предпочтителен TCP ("syslog_tcp": true) с подсчётом октетов ("octet_counting": true). Профили для подканалов threat:behavioral (поведенческие находки) и threat:protocol_anomaly (нарушения спецификаций протоколов) в поставку не входят: администратор создаёт их по образцу поставляемого профиля. Профиль принимает события только из подканала, объявленного в файле ipc.json, поэтому перед добавлением профиля объявите оба подканала в секции subchannels канала threat и перезапустите службы Alertix-NTA командой sudo systemctl restart sensor.target.
Пример профиля для подканала threat:behavioral с доставкой по TCP. Ожидаемый результат — после добавления профиля в массив profiles и перечитывания конфигурации службы sensor-transfer поведенческие находки передаются на приёмник, каждое сообщение предваряется его длиной; профиль для подканала threat:protocol_anomaly отличается только именем и значением channel_name:
{
"name": "syslog_threat_behavioral",
"enabled": true,
"default": false,
"comment": "",
"protocol": "syslog",
"syslog_server": "<адрес-SIEM>",
"syslog_port": 514,
"syslog_tcp": true,
"enable_ssl": false,
"keep_connection": true,
"octet_counting": true,
"script_name": "syslog_native.lua",
"channel_name": "threat:behavioral",
"tcp_timeout": 10,
"go_profile_weight": 1,
"go_profile_reserve": false
}Пример: профиль kafka
Передача завершённых TCP-сессий (канал sessions:tcp) в Apache Kafka по TLS с аутентификацией клиентским сертификатом и сжатием LZ4; так настроены три поставляемых профиля kafka-tcp-traff, kafka-udp-traff и kafka-ip-traff, различающиеся каналом сессий и скриптом (kafka_sessions_tcp.lua, kafka_sessions_udp.lua, kafka_sessions_ip.lua):
{
"name": "kafka_events",
"enabled": true,
"default": false,
"protocol": "kafka",
"comment": "Экспорт событий в Kafka",
"kafka_bootstrap_servers":
"kafka-1.company.local:9093,kafka-2.company.local:9093",
"kafka_topic": "alertixnta-events",
"kafka_security_protocol": "ssl",
"kafka_ssl_key_location": "/opt/alertixnta/certs/client.key",
"kafka_ssl_key_password": "",
"kafka_ssl_certificate_location": "/opt/alertixnta/certs/client.pem",
"kafka_ssl_ca_location": "/opt/alertixnta/certs/ca.pem",
"kafka_compression_codec": "lz4",
"kafka_batch_num_messages": 10000,
"kafka_request_required_acks": 1,
"kafka_log_level": 7,
"kafka_enable_ssl_certificate_verification": true,
"script_name": "kafka_sessions_tcp.lua",
"channel_name": "sessions:tcp",
"keep_connection": true,
"tcp_timeout": 10
}Параметры kafka:
Таблица Б.6 — Параметры профиля kafka
| Параметр | Умолчание | Описание |
|---|---|---|
| — | Брокеры: |
| — | Целевой топик |
|
| Протокол: |
|
| Сжатие: |
| 10000 | Размер батча сообщений |
| 1 | ACK: |
Пример: профиль smtp
Отправка перехваченных писем на выделенный почтовый ящик:
{
"name": "smtp_archive",
"enabled": true,
"default": false,
"protocol": "smtp",
"comment": "Архив перехваченных писем",
"smtp_server": "mail.company.local",
"smtp_port": 587,
"enable_ssl": true,
"mail_from": "sensor@company.local",
"mail_to": "archive@company.local",
"tcp_timeout": 10,
"keep_connection": false
}Пример: профиль statflow (экспорт метрик)
Экспорт статистики парсеров сенсора для мониторинга через Telegraf/InfluxDB. Профиль соответствует поставляемому профилю statflow-parser-statistics: канал statistics:parser, скрипт ipc_statistics_parser.lua каталога tr-statflow, порт 6314 приёмника Telegraf. Остальные каналы статистики экспортируются аналогичными профилями со скриптами ipc_statistics_proc.lua (порт 6514), ipc_statistics_netif.lua (6414), ipc_statistics_script.lua (6214), ipc_statistics_transport.lua (6114) и ipc_statistics_icap.lua (6014):
{
"name": "statflow_telegraf",
"enabled": true,
"default": false,
"protocol": "statflow",
"comment": "Статистика парсеров для Telegraf",
"statflow_server": "127.0.0.1",
"statflow_port": 6314,
"statflow_tcp": false,
"channel_name": "statistics:parser",
"script_name": "ipc_statistics_parser.lua",
"octet_counting": false
}Пример: профиль athena (интеграция с песочницей)
Отправка файлов на проверку в песочницу Athena. Для PT Sandbox используется отдельный протокол ptsb со скриптом sandbox_ptsb.lua:
{
"name": "athena_sandbox",
"enabled": true,
"default": false,
"protocol": "athena",
"comment": "Проверка файлов в песочнице Athena",
"athena_server": "sandbox.company.local",
"athena_port": 443,
"enable_ssl": true,
"athena_scenario": "1",
"athena_force": false,
"athena_token": "<ATHENA_TOKEN>",
"script_name": "sandbox_athena.lua"
}Пример: профиль icap (удалённая проверка контента)
Передача объектов внешнему ICAP-серверу DLP-системы Zecurion скриптом icap_zecurion.lua — единственным скриптом каталога tr-icap в поставке; для ICAP-серверов других производителей укажите в script_name собственный скрипт:
{
"name": "icap_dlp",
"enabled": true,
"default": false,
"protocol": "icap",
"comment": "Передача объектов в DLP по ICAP",
"icap_server": "dlp-gateway.company.local",
"icap_port": 1344,
"icap_preview": true,
"icap_allow204": true,
"enable_ssl": false,
"script_name": "icap_zecurion.lua"
}Пример: полная конфигурация transfer.json
{
"version": "6.2",
"sensorID": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"transportThreads": 4,
"profiles": [
{
"name": "local_filedrop",
"enabled": true,
"default": true,
"protocol": "filedrop",
"comment": "Локальное хранение",
"file_drop_path": "/opt/alertixnta/events/filedrop",
"save_format": "json",
"save_zip": false,
"quota": "50Gb",
"file_drop_mask": "%Y-%m-%d/%H",
"enable_tmp": false
},
{
"name": "siem_syslog",
"enabled": true,
"default": false,
"protocol": "syslog",
"comment": "CEF в SIEM",
"syslog_server": "192.0.2.100",
"syslog_port": 514,
"syslog_tcp": false,
"script_name": "alertixnta_lua_cef.lua"
},
{
"name": "statflow_telegraf",
"enabled": true,
"default": false,
"protocol": "statflow",
"comment": "Статистика парсеров для Telegraf",
"statflow_server": "127.0.0.1",
"statflow_port": 6314,
"statflow_tcp": false,
"channel_name": "statistics:parser",
"script_name": "ipc_statistics_parser.lua"
}
],
"debug": {
"dumps": { "log": true, "dump": false },
"memoryTrack": { "runtime": false, "lua": false }
}
}Примеры выходных форматов событий
Ниже приведены примеры событий, генерируемых службой sensor-transfer при использовании различных значений параметра save_format в профилях filedrop, ftp, sftp, imap и (в редакции для Windows Server) smb.
Формат JSON (save_format: "json")
{
"guid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"time": "2025-03-15T14:32:05.123Z",
"type": "msg_send",
"detector": "smtp_detector",
"subsystem": "email",
"session": {
"id": 847291,
"protocol": "smtp",
"netif": "eth0",
"vlan_id": 100,
"srcaddress": "192.0.2.50:45812",
"dstaddress": "198.51.100.25:25",
"starttime": "2025-03-15T14:31:58.456Z",
"level": 7,
"attributes": {
"tls_version": "TLSv1.2",
"ja3": "e7d705a3286e19ea42f587b344ee6865"
}
},
"attributes": {
"message-id": "<20250315143205.ABC123@mail.company.local>",
"x-mailer": "Thunderbird 128.0"
},
"headers": {
"Received": "from mail.company.local (192.0.2.50) by mx.company.local",
"MIME-Version": "1.0",
"Content-Type": "multipart/mixed; boundary=\"----=_Part_12345\""
},
"from": [
{ "displayname": "Иванов И.И.", "address": "ivanov@company.local" }
],
"to": [
{ "displayname": "Петров П.П.", "address": "petrov@company.local" }
],
"subject": "Отчёт за март 2025",
"bodies": [
{
"type": "detect/message",
"content-type": "text/plain",
"sha256": "a1b2c3d4e5f6...fedcba9876543210",
"text":
"Добрый день!\n\nВо вложении отчёт за март.\n\nС уважением,\nИванов И.И."
}
],
"attachments": [
{
"content-type":
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"filename": "report-2025-03.xlsx",
"size": 245760,
"removed": false,
"sha256": "b2c3d4e5f6a7...0123456789abcdef"
}
]
}Формат XML (save_format: "xml")
Корневой элемент — <ev_detect>. Кодировка — UTF-8.
<?xml version="1.0" encoding="utf-8"?>
<ev_detect guid="a1b2c3d4-e5f6-7890-abcd-ef1234567890"
time="2025-03-15T14:32:05.123Z"
type="msg_send"
detector="smtp_detector"
subsystem="email">
<session id="847291" protocol="smtp">
<netif>eth0</netif>
<vlan_id>100</vlan_id>
<srcaddress>192.0.2.50:45812</srcaddress>
<dstaddress>198.51.100.25:25</dstaddress>
<starttime>2025-03-15T14:31:58.456Z</starttime>
<level>7</level>
<attributes>
<attribute name="tls_version" value="TLSv1.2"/>
<attribute name="ja3" value="e7d705a3286e19ea42f587b344ee6865"/>
</attributes>
</session>
<attributes>
<attribute name="message-id"
value="<20250315143205.ABC123@mail.company.local>"/>
<attribute name="x-mailer" value="Thunderbird 128.0"/>
</attributes>
<headers>
<header name="Received"
value="from mail.company.local (192.0.2.50) by mx.company.local"/>
<header name="MIME-Version" value="1.0"/>
<header name="Content-Type"
value="multipart/mixed; boundary="----=_Part_12345""/>
</headers>
<from>
<item displayname="Иванов И.И." address="ivanov@company.local"/>
</from>
<to>
<item displayname="Петров П.П." address="petrov@company.local"/>
</to>
<subject>Отчёт за март 2025</subject>
<bodies>
<body type="detect/message" content-type="text/plain">
<sha256>a1b2c3d4e5f6...fedcba9876543210</sha256>
<text>Добрый день!
Во вложении отчёт за март.
С уважением,
Иванов И.И.</text>
<attributes/>
</body>
</bodies>
<attachments>
<attachment content-type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
filename="report-2025-03.xlsx"
size="245760"
removed="false">
<sha256>b2c3d4e5f6a7...0123456789abcdef</sha256>
<fileimage>847291_0001.report-2025-03.xlsx</fileimage>
<attributes/>
</attachment>
</attachments>
</ev_detect>Формат EML (save_format: "eml")
Стандартный формат RFC 5322 (MIME). Служебные заголовки X-Sensor-* обеспечивают трассируемость до конкретного сетевого события.
MIME-Version: 1.0
Date: Sat, 15 Mar 2025 14:32:05 +0000
From: =?utf-8?B?0JjQstCw0L3QvtCyINCYLtCYLg==?= <ivanov@company.local>
To: =?utf-8?B?0J/QtdGC0YDQvtCyINCfLtCfLg==?= <petrov@company.local>
Subject: =?utf-8?B?0J7RgtGH0ZHRgiDQt9CwINC80LDRgNGCIDIwMjU=?=
X-Sensor-EventID: a1b2c3d4-e5f6-7890-abcd-ef1234567890
X-Sensor-Protocol: smtp
X-Sensor-Source: 192.0.2.50:45812
X-Sensor-Destination: 198.51.100.25:25
X-Sensor-Timestamp: 2025-03-15T14:32:05.123Z
X-Sensor-SessionID: 847291
X-Sensor-Detector: smtp_detector
Content-Type: multipart/mixed; boundary="----=_SensorBoundary_a1b2c3d4"
------=_SensorBoundary_a1b2c3d4
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
0JTQvtCx0YDRi9C5INC00LXQvdGMIQoK0JLQviDQstC7
0L7QttC10L3QuNC4INC+0YLRh9GR0YIg0LfQsCDQvNCw
0YDRgi4KCiDQoSDRg9Cy0LDQttC10L3QuNC10LwsCiDQ
mNCy0LDQvdC+0LIg0Jgu0Jgu
------=_SensorBoundary_a1b2c3d4
Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
Content-Disposition: attachment; filename="report-2025-03.xlsx"
Content-Transfer-Encoding: base64
UEsDBBQAAAAIAGhIZ1kAAAAAAAAAAAAAABIAHABbQ29u
dGVudF9UeXBlc10ueG1sVVQJAAP...
(содержимое файла в кодировке Base64)
------=_SensorBoundary_a1b2c3d4--"address": "0.0.0.0:1345", "ssl": true, "syncMode": true,
"comment": "ICAPS (TLS)"
}
]
},
"clients": {
"default": {
"action": "ALLOW",
"denial_method": "DROP",
"limits": { "max_connections": 4000, "max_request_size": "10G" }
},
"rules": []
},
"icap": {
"alwaysOk": { "enabled": false },
"allow204": { "enabled": true },
"preview": { "enabled": false, "size": 4096 },
"rawLog": { "enabled": false, "path": "./log/icap-dump/" },
"requestLog": {
"enabled": false, "httpEnabled": true, "channel": "icap-request"
}
},
"debug": {
"dumps": { "log": true, "dump": false },
"memoryTrack": { "runtime": false, "lua": false }
}
}При работе с несколькими прокси-серверами потоки можно разделять по адресам привязки: каждый элемент listenAddresses задаёт собственные значения ssl и syncMode. В синхронном режиме (syncMode: true) копия каждого возвращаемого сообщения временно сохраняется на диске в каталоге cache.path; учитывайте это при планировании дискового пространства. |
10. anomaly.json — Обнаружение аномалий и детекторы угроз (общий файл служб)
Путь: /opt/alertixnta/config/anomaly.json Шаблон поставки: /opt/alertixnta/config/init/anomaly.json-default Службы: sensor-ethercap и sensor-pcap — встроенный движок обнаружения аномалий; sensor-identity — сопоставление сеансов средств удалённого доступа с индикаторами компрометации и список доменов-исключений для сценариев загрузки индикаторов; sensor-analyser — детекторы угроз стадии L2.
При установке пакета шаблон копируется в /opt/alertixnta/config/anomaly.json, только если такого файла ещё нет: при обновлении пакета действующий файл сохраняется, а новый шаблон доступен по пути шаблона поставки. Каждая из четырёх служб читает файл самостоятельно и перечитывает его по собственной команде systemctl reload.
Структура файла
Схема ниже показывает вложенность секций файла; значения параметров приведены в примере поставляемой конфигурации:
{
version,
anomaly {
enabled, profile, whitelist_subnets, episode_idle_window_sec,
scan { ... }, flood { ... }, fragmentation { ... }, ip { ... },
tcp { ... }, arp { ... }, rat_ioc { ... }, tls { ... },
dcerpc { ... }, ldap { ... }, smb { ... },
transport { behavioral { ... }, protocol_anomaly { ... } },
secfeeds { domain_whitelist }
},
debug { dumps { log, dump }, memoryTrack { runtime, lua } }
}Ключевые параметры
| Секция | Службы | Назначение и значения в поставляемом файле |
|---|---|---|
anomaly (корень) | sensor-ethercap, sensor-pcap, sensor-identity | enabled — главный выключатель детекторов сканирования, флуда, Slowloris, межпоточного агрегатора и сопоставления сеансов удалённого доступа; false и в поставляемом файле, и при отсутствии ключа. episode_idle_window_sec = 60 — окно простоя эпизода. profile = "office" и whitelist_subnets = [] записываются в журнал службы при изменении и на детекторы не влияют. |
scan | sensor-ethercap, sensor-pcap | Пороги вертикального, горизонтального и блочного сканирования и окна их учёта (6 параметров). |
flood | sensor-ethercap, sensor-pcap | Пороги флуда SYN, UDP, ICMP, отражённого усиления, накопительного алгоритма CUSUM и атаки Slowloris (13 параметров). |
fragmentation | sensor-ethercap, sensor-pcap | Проверки фрагментации IPv4 и IPv6 (8 параметров, проверки включены). |
ip | sensor-ethercap, sensor-pcap | Проверки атак Land и Smurf (включены). |
tcp | sensor-ethercap, sensor-pcap | Скрытое сканирование пакетами TCP вне сессии и обратное рассеяние (включены). |
arp | sensor-ethercap, sensor-pcap | Подмена ARP: один MAC-адрес на многих IP-адресах, смена MAC-адреса у IP-адреса; списки исключений whitelist_macs, whitelist_ips (7 параметров). |
rat_ioc | sensor-identity | Протоколы удалённого доступа rdp, vnc, ssh, teamviewer, anydesk, направление any, подсети-исключения whitelist_remote_admin_subnets. |
tls | sensor-analyser | Проверки детектора l2-tls-anomaly.lua: устаревшие версии, слабые наборы шифров, самоподписанный и просроченный сертификат, несовпадение SNI, оборванное рукопожатие, фатальные сообщения alert (11 параметров). |
dcerpc | sensor-analyser | Детектор l2-dcerpc-lateral.lua; списки domain_controllers и whitelist_admin_hosts в поставке пусты. |
ldap | sensor-analyser | Детектор l2-ldap-recon.lua; список whitelist_admin_hosts в поставке пуст. |
smb | sensor-analyser | Детектор l2-smb-lateral.lua; список whitelist_admin_hosts в поставке пуст. |
transport | sensor-ethercap, sensor-pcap, sensor-identity | Окно подавления повторов находок подканалов threat:behavioral (60 секунд) и threat:protocol_anomaly (300 секунд); порог важности severity_threshold (0) записывается в журнал службы и на доставку событий не влияет. |
secfeeds | sensor-identity | domain_whitelist — 12 доменов, которые сценарии загрузки индикаторов не заносят в индикаторы-домены. |
Пример: поставляемая конфигурация
Ниже приведено содержимое шаблона поставки /opt/alertixnta/config/init/anomaly.json-default. Сравнение с ним действующего файла (diff шаблона и файла) показывает параметры, изменённые администратором, и параметры, которых нет в файле, оставшемся от прежней версии пакета:
{
"version": "1.9",
"anomaly": {
"enabled": false,
"profile": "office",
"whitelist_subnets": [],
"episode_idle_window_sec": 60,
"scan": {
"vertical_threshold": 50,
"unique_dst_ports_threshold": 30,
"horizontal_threshold": 100,
"block_threshold": 30,
"horizontal_window_sec": 10,
"window_sec": 60
},
"flood": {
"syn_flood_per_pair_threshold": 200,
"syn_flood_distributed_threshold": 500,
"udp_flood_session_rate_threshold": 5000,
"icmp_flood_session_rate_threshold": 1000,
"udp_flood_distributed_threshold": 50000,
"icmp_flood_distributed_threshold": 10000,
"cusum_h": 30,
"cusum_k": 5,
"amplification_ratio_threshold": 20,
"amplification_min_request": 100,
"amplification_min_response_bytes": 1024,
"slowloris_min_concurrent_sessions": 50,
"slowloris_min_idle_seconds": 30
},
"fragmentation": {
"detect_overlap": true,
"detect_tiny_first": true,
"tiny_first_min_size": 32,
"detect_oversized": true,
"oversized_limit_bytes": 65535,
"detect_too_many": true,
"max_fragments": 64,
"detect_atomic_as_frag": true
},
"ip": {
"detect_land": true,
"detect_smurf": true
},
"tcp": {
"detect_stealth_scan": true,
"detect_backscatter": true
},
"arp": {
"detect_mac_multi_ip": true,
"mac_multi_ip_threshold": 5,
"detect_ip_mac_change": true,
"ip_mac_change_idle_sec": 60,
"entry_idle_sec": 1800,
"whitelist_macs": [],
"whitelist_ips": []
},
"rat_ioc": {
"protocols": ["rdp", "vnc", "ssh", "teamviewer", "anydesk"],
"direction": "any",
"whitelist_remote_admin_subnets": []
},
"tls": {
"enabled": true,
"check_outdated_version": true,
"outdated_versions": ["SSLv2", "SSLv3", "TLSv1.0", "TLSv1.1"],
"check_weak_cipher": true,
"weak_cipher_substrings": ["RC4", "DES", "NULL", "MD5", "EXPORT"],
"check_self_signed": true,
"check_expired": true,
"check_sni_mismatch": true,
"check_incomplete_handshake": true,
"check_fatal_alerts": true,
"internal_subnets_excluded_from_self_signed": []
},
"dcerpc": {
"enabled": true,
"detect_dcsync": true,
"detect_lateral": true,
"domain_controllers": [],
"whitelist_admin_hosts": []
},
"ldap": {
"enabled": true,
"whitelist_admin_hosts": []
},
"smb": {
"enabled": true,
"whitelist_admin_hosts": []
},
"transport": {
"behavioral": {
"severity_threshold": 0,
"dedup_idle_window_sec": 60
},
"protocol_anomaly": {
"severity_threshold": 0,
"dedup_idle_window_sec": 300
}
},
"secfeeds": {
"domain_whitelist": [
"github.com",
"githubusercontent.com",
"gitlab.com",
"drive.google.com",
"googleapis.com",
"dropbox.com",
"dropboxusercontent.com",
"pastebin.com",
"postimg.cc",
"mediafire.com",
"discordapp.com",
"t.me"
]
}
},
"debug": {
"dumps": {
"log": true,
"dump": false
},
"memoryTrack": {
"runtime": false,
"lua": false
}
}
}Пример: списки доверенных узлов и исключений
Детекторы l2-smb-lateral.lua и l2-ldap-recon.lua не выпускают находок, пока не заполнен список whitelist_admin_hosts своей секции, а детектор l2-dcerpc-lateral.lua — пока не заполнены domain_controllers (для обнаружения DCSync) и whitelist_admin_hosts (для остальных находок); кроме того, детекторы l2-smb-lateral.lua и l2-ldap-recon.lua получают события, только если их записи перенесены в начало списка workFlow.detect файла analyser.json: номер позиции записи должен быть меньше фиксированного номера детектора протокола того же типа события (7 у l2-smb.lua, 4 у l2-ldap.lua), а в поставляемом файле записи стоят на позициях 70 и 72. Перенос записей применяется перезапуском службы sensor-analyser, а не перечитыванием конфигурации; при запуске служба читает также списки настоящего файла.
Фрагмент секции anomaly ниже заполняет эти списки и списки исключений других детекторов; значения в угловых скобках — заполнители, вместо которых указываются адреса и подсети своей сети в нотации CIDR (отдельный узел — с маской /32) и MAC-адреса. Ожидаемый результат после сохранения файла и перечитывания конфигурации служб sensor-analyser, sensor-ethercap, sensor-pcap и sensor-identity — в журнале каждой службы появляются строки вида anomaly.<секция>.<параметр> was changed с числом элементов изменённых списков:
"arp": {
"detect_mac_multi_ip": true,
"mac_multi_ip_threshold": 5,
"detect_ip_mac_change": true,
"ip_mac_change_idle_sec": 60,
"entry_idle_sec": 1800,
"whitelist_macs": ["<MAC-адрес-виртуального-шлюза>"],
"whitelist_ips": []
},
"rat_ioc": {
"protocols": ["rdp", "vnc", "ssh", "teamviewer", "anydesk"],
"direction": "any",
"whitelist_remote_admin_subnets": ["<подсеть-администраторов>"]
},
"dcerpc": {
"enabled": true,
"detect_dcsync": true,
"detect_lateral": true,
"domain_controllers": ["<адрес-контроллера-домена>/32"],
"whitelist_admin_hosts": ["<подсеть-администраторов>"]
},
"ldap": {
"enabled": true,
"whitelist_admin_hosts": ["<подсеть-администраторов>"]
},
"smb": {
"enabled": true,
"whitelist_admin_hosts": ["<подсеть-администраторов>"]
}Детекторы угроз стадии L2 считывают значения секций smb, ldap, dcerpc и tls при загрузке скрипта, поэтому изменение этих списков применяется перезапуском службы анализа; ожидаемый результат — команда завершается без вывода, служба sensor-analyser переходит в состояние active (running):
sudo systemctl restart sensor-analyserИзменения остальных секций применяются без перезапуска: команда передаёт сигнал перечитывания конфигурации службам, читающим файл; ожидаемый результат — команда завершается без вывода, службы продолжают работу:
sudo systemctl reload sensor-ethercap sensor-pcap
sensor-identityРекомендации по настройке
Встроенные детекторы сканирования, флуда и Slowloris и сопоставление сеансов удалённого доступа с индикаторами компрометации в поставке выключены (anomaly.enabled: false); включайте их после того, как настроен получатель находок — журнал threats.log либо профиль передачи событий угроз.
Пороги подбирайте после одной-двух недель наблюдения: начните с поставляемых значений, внесите легитимные источники в списки исключений и только затем меняйте пороги.
После обновления пакета сравнивайте действующий файл с шаблоном поставки: новые секции и параметры шаблона в действующий файл не переносятся и действуют со значениями по умолчанию.
Детектор l2-tls-anomaly.lua по умолчанию не подключён: секция tls начинает действовать после внесения его записи с "enabled": true в начало списка workFlow.detect файла analyser.json, на позицию с номером меньше 8 — фиксированного номера детектора l2-ssl.lua, который завершает обработку событий raw/ssl. Запись, внесённая рядом с записью l2-ssl.lua, этого условия не обеспечивает.
11. Вспомогательные конфигурации
telegraf.conf — приём метрик от Alertix-NTA
Для сбора статистики сенсора через профиль statflow необходимо настроить приём на стороне Telegraf. Поставляемая конфигурация Telegraf /opt/alertixnta/config/init/telegraf/telegraf.conf содержит 6 приёмников JSON по UDP: 6514 (процессы), 6414 (трафик), 6314 (парсеры), 6214 (скрипты), 6114 (транспорты), 6014 (ICAP) — и записывает данные в InfluxDB. Приёмник статистики парсеров в ней задан так:
service_address = "udp://:6314"
data_format = "json"
tag_keys = ["parserName", "parserType", "parserDesc"]
json_string_fields = ["parserName", "parserType", "parserDesc"]
name_override = "stat_parser"
[inputs.socket_listener.tags]
influxdb_database = "sensor"Порт 6314 должен совпадать с statflow_port в профиле statflow конфигурации transfer.json (поставляемый профиль statflow-parser-statistics). Поставляемые профили statflow-*-statistics выключены: для передачи статистики в Telegraf включите их в transfer.json.
nxlog.conf — пересылка событий аутентификации Windows
Для идентификации пользователей по событиям Windows Security Log (EventID 4768 — запрос TGT-билета Kerberos).
О версиях NXLog. Модуль om_ssl доступен в NXLog Enterprise Edition. В NXLog Community Edition для SSL-соединений используйте связку om_tcp + расширение xm_ssl. Стандартные порты NXLog: 514 (TCP/UDP). Alertix-NTA принимает данные NXLog на порту 10516 (TCP+SSL). |
Пример для NXLog Enterprise Edition:
<Input security_log> Module im_msvistalog Query <QueryList>\ <Query Id="0">\ <Select Path="Security">*[System[(EventID=4768)]]</Select>\ </Query>\ </QueryList> Exec $Message = to_json(); </Input><Output alertixnta_syslog> Module om_ssl Host <IP-сенсора> Port 10516 CAFile C:\Program Files\nxlog\cert\ca.pem </Output><Route 1> Path security_log ⇒ alertixnta_syslog </Route>
IP-адрес и порт должны совпадать с listenAddress соответствующего профиля authFeed в identity.json. При использовании NXLog Community Edition без om_ssl — замените на om_tcp и настройте профиль authFeed с "ssl": false.
Эта страница была полезна?
Спасибо за отзыв!
Спасибо, мы учтём это для улучшения документации.