Suricata IPS NFQueue with nDPI. Часть II

от автора

Часть I содержит: общие сведения о suricata; требования к железу; описание режимов работы; описание, характеристики и возможности nDPI; описание движков.

В этой части будет рассмотрена установка из исходных кодов.

Содержание:

6. Установка из исходных кодов.

6.1. Сборка nDPI.

6.2 Установка Rust.

6.3. Сборка suricata.

6.3.1 Установите библиотеки для необходимых вам движков.

6.3.2 Установите библиотеки для необходимых вам компонентов и опций.

6.3.2.1 Поддерживаемые компоненты.

6.3.2.2 Поддерживаемые опции.

6.3.3 Определите флаги компилятора для конфигурирования suricata.

6.3.4 Сборка и установка suricata.

Suricata, установленная из репозитариев Debian не поддерживает использование библиотеки nDPI. Поэтому для включения поддержки nDPI приходится устанавливать suricata из исходных кодов. Сохранять исходники будем в/usr/local/src. /usr/local/src — это стандартный каталог в Unix‑подобных системах, предназначенный для хранения исходных кодов программ, которые компилируются и устанавливаются администратором вручную, а не через пакетный менеджер дистрибутива.

Для установки понадобится 4ГБ свободного места в /usr. Из них папка с исходниками будет занимать примерно 1,7ГБ.

6.1. Сборка nDPI.

Сначала нужно собрать nDPI. Главная особенность состоит в том, что нам нужен последний стабильный релиз версии 4, так как suricata на данный момент не поддерживает nDPI v5.0. Разработчики nDPI создали новую версию без обратной совместимости. В итоге сурикатовцы не хотят менять код под новую версию, написали нтоповцам запрос и ждут пока те внесут нужные исправления. Нтоповцы идут вперед и считают, что новая версия — новые лучшие возможности.

Для компиляции необходимы следующие условия:

  • инструменты GNU (autoconf automake libtool pkg-config gettext flex bison)

  • компилятор GNU C (gcc) или clang

Установите программы и библиотеки необходимые для сборки nDPI:

# sudo apt-get -y install wget curl build-essential git gettext flex bison libtool autoconf automake pkg-config libpcap-dev libjson-c-dev libnuma-dev libpcre2-dev libmaxminddb-dev librrd-dev

Затем выполните:

# cd /usr/local/src

# wget https://github.com/ntop/nDPI/archive/refs/tags/4.14.zip

# unzip -tq 4.14.zip && unzip -q 4.14.zip

# cd nDPI-4.14

# ./autogen.sh

Будем использовать для configure следующие опции и флаги:

--prefix=/usr/local — префикс для установки. Чтобы если вы решите выполнить 'make install', установленная из исходников версия не конфликтовала с версией установленной из репозитариев (если она будет установлена для каких-либо пакетов).

--with-pic — генерирует позиционно-независимый код.

-march=native — использовать все инструкции вашего текущего процессора.

-flto=auto, -ffat-lto-objects — оптимизация на этапе линковки. Компилятор анализирует всю программу целиком, а не по одному файлу, что дает прирост скорости.

-std=c11 — используется стандарт языка C 2011 года.

Выполните:

# ./configure --prefix=/usr/local --with-pic CFLAGS="-march=native -flto=auto -ffat-lto-objects -std=c11"

# make -j$(nproc)

После успешной сборки можно посмотреть списки поддерживаемых протоколов: «./example/ndpiReader -a 0«. Опция "-a 1" покажет категории протоколов, а опция "-a 2" покажет известные риски. "./example/ndpiReader -H" покажет расширенную информацию о протоколах и рисках. Посмотреть информацию собранную nDPI в вашей сети:

  • запустить: ./example/ndpiReader -i интерфейс

  • дать поработать, затем прервать с помощью Ctrl+C

В папку ./utils разработчики поместили очень интересные скрипты, которые могут пригодиться.

Выполнять установку nDPI не нужно. Если вы её выполните, то сохраните вывод 'make install', потому что в случае удаления все операции придется выполнять вручную (цели 'make unuinstall' нет).

6.2 Установка Rust.

Suricata 8-й ветки активно использует современные возможности Rust (включая асинхронность и специфические парсеры). Но в репозиториях Debian 13 версия Rust ниже, чем требуют самые свежие версии библиотек (например, необходимая cbindgen требует Rust v1.87.0). Поэтому для сборки suricata не рекомендуется использовать системный Rust из репозитариев. Самый правильный путь для установки Rust последней стабильной версии — использовать официальный установщик rustup. Тогда весь Rust‑код внутри suricata будет скомпилирован с максимальными оптимизациями (особенно если вы добавите флаги оптимизации в config.toml).

Если установлен Rust из репозитариев, то удаляем его:

# apt remove rustc cargo

Чтобы установить Rust через rustup доступным для всех пользователей, включая тех, под которыми будет работать suricata, нужно изменить стандартный путь установки (по умолчанию rustup ставит всё в $HOME/.cargo, но мы перенаправим его в /usr/local). Укажите установщику новые пути, которые не зависят от конкретного пользователя:

# export RUSTUP_HOME=/usr/local/rustup

# export CARGO_HOME=/usr/local/cargo

Используем официальный скрипт с флагом -y (автоматическое подтверждение) и без изменения профиля текущего пользователя:

# curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s – -y --no-modify-path

Настройте пути для всей системы — чтобы любой пользователь (и скрипты сборки) видели rustc и cargo, добавьте пути в системный профиль:

Создайте файл:

# nano /etc/profile.d/rust.sh

Вставьте туда следующие строки:

export RUSTUP_HOME=/usr/local/rustup

export CARGO_HOME=/usr/local/cargo

export PATH=$PATH:/usr/local/cargo/bin

Примените изменения:

# source /etc/profile.d/rust.sh

Создайте файл конфигурации Rust /usr/local/cargo/config.toml и внесите в него необходимые параметры, например:

# cat /usr/local/cargo/config.toml

[build]

rustflags = [

“-C”, “target-cpu=native”,

“-C”, “relocation-model=pic”,

“-C”, “control-flow-guard=yes”,

“-C”, “link-arg=-Wl,-z,relro,-z,now”

]

[profile.release]

opt-level = 3

lto = “fat”

codegen-units = 1

strip = “symbols”

panic = “abort”

overflow-checks = true

Устанавливаем cbindgen, необходимый для сборки suricata:

# cargo install cbindgen

6.3. Сборка suricata.

6.3.1 Установите библиотеки для необходимых вам движков.

Для движка NFQueue:

Необходимые библиотеки: libnetfilter-queue-dev, libnetfilter-queue1, libnfnetlink-dev, libnfnetlink0 (libnetfilter-queue для поддержки очередей,libnfnetlink для связи с подсистемой Netfilter в ядре).

Опция для configure: --enable-nfqueue

6.3.2 Установите библиотеки для необходимых вам компонентов и опций.

6.3.2.1 Поддерживаемые компоненты.

Посмотреть какие компоненты поддерживает suricata можно выполнив команду (применяется к существующей программе — после сборки):

# suricata --build-info | grep Features

Features: NFQ PCAP_SET_BUFF AF_PACKET HAVE_PACKET_FANOUT LIBCAP_NG LIBNET1.1 HAVE_HTP_URI_NORMALIZE_HOOK PCRE_JIT HAVE_NSS HTTP2_DECOMPRESSION HAVE_LUA HAVE_JA3 HAVE_JA4 HAVE_LIBJANSSON TLS TLS_C11 MAGIC RUST POPCNT64

Результатом выполнения команды будет список флагов. Флаги показывают поддержку ключевых компонентов: с какими библиотеками собрана suricata, какие механизмы, функции, языки, алгоритмы и др. она поддерживает и какие возможности suricata они обеспечивают.

Флаг NFQ — указывает, что suricata собрана с поддержкой движка NFQueue.

AF_PACKET — указывает, что suricata собрана с поддержкой родного для Linux движка (механизма захвата пакетов) AF_PACKET.

HAVE_PACKET_FANOUT — указывает, что suricata собрана с поддержкой механизма Fanout на уровне ядра Linux (используется вместе с движком AF_PACKET). Это критически важная опция для работы на скоростях 1 Гбит/с и выше.

Поддержка механизма Fanout обеспечивает:

  • Эффективное распределение входящего трафика между несколькими потоками (воркерами) suricata.

  • Параллельную обработку: без поддержки механизма Fanout вся нагрузка по захвату пакетов ложилась бы на одно ядро процессора. При 1 Гбит/с это привело бы к 100% загрузке одного ядра и потере пакетов, в то время как остальные ядра простаивали бы.

  • Сохранение целостности потоков (Flow Integrity): механизм Fanout гарантирует, что все пакеты одной сессии (например, конкретного TCP‑соединения) всегда попадут в один и тот же поток suricata. Это необходимо для правильной работы сигнатур, анализа протоколов и дефрагментации.

  • Балансировку нагрузки: ядро само следит за тем, чтобы потоки были загружены равномерно, используя хэширование (обычно по 5-tuple: IP, порты и протокол).

Необходимая библиотека: нет. Это функционал ядра Linux (доступен начиная с версии 3.1). Для сборки достаточно стандартных системных заголовков: linux-libc-dev.

Устанавливается автоматически, если вы собираете suricata на Linux.

LIBCAP_NG — указывает, что suricata собрана с библиотекой POSIX Capabilities. Это критически важная опция для безопасности вашего сервера. Библиотека POSIX обеспечивает принцип «минимальных привилегий». В Linux процесс root имеет абсолютную власть, что опасно. Если хакер взломает парсер suricata, он получит полный контроль над системой.

Библиотека POSIX позволяет suricata:

  • Сбросить права root: сразу после запуска и открытия сетевых интерфейсов suricata превращается в обычного бесправного пользователя (например, suricata).

  • Сохранить только нужные «способности»: процесс оставляет себе лишь узкие разрешения, необходимые для работы:

    • CAP_NET_RAW — право захватывать «сырые» пакеты с интерфейса.

    • CAP_NET_ADMIN — право управлять сетевыми очередями (нужно для режима IPS/NFQ).

    • CAP_IPC_LOCK — право блокировать память (нужно для некоторых высокоскоростных движков захвата).

    • CAP_SYS_NICE — право повышать приоритет процессов и привязывать процессы к конкретным ядрам процессора.

Необходимая библиотека: libcap-ng-dev

Устанавливается, если suricata собрана с библиотекой libcap-ng-dev.

LIBNET — указывает, что suricata собрана с библиотекой libnet. См. «Libnet support» в пункте «6.3.2.2 Поддерживаемые опции».

PCAP_SET_BUFF — указывает, что suricata собрана с поддержкой функции pcap_set_buffer_size. Эта функция позволяет suricata напрямую управлять размером кольцевого буфера захвата пакетов на уровне библиотеки libpcap.

HAVE_HTP_URI_NORMALIZE_HOOK — указывает, что suricata собрана с библиотекой LibHTP (которая занимается разбором HTTP‑трафика) и позволяет вмешаться в процесс разбора URI (адреса запроса) на самом раннем этапе.

Библиотека LibHTP обеспечивает:

  • Защиту от обхода (Evasion): злоумышленники часто пытаются скрыть вредоносные запросы, используя двойное кодирование (например, %252e вместо точки) или лишние слеши (///etc//passwd). Возможности библиотеки LibHTP позволяют привести к стандартному виду URI перед тем, как suricata начнет сверять его с правилами.

  • Повышение точности правил: ключевое слово http.uri в ваших правилах всегда работает с «чистой» строкой, что исключает ложные пропуски атак.

  • Специфическую очистку: активирует дополнительные алгоритмы декодирования UTF-8 и обработки спецсимволов, характерных для разных веб‑серверов (IIS, Apache).

Необходимая библиотека: современная suricata поставляется со своей встроенной версией LibHTP или требует libhtp-dev.

Устанавливается автоматически.

PCRE_JIT — указывает, что suricata собрана с поддержкой механизма Just‑In‑Time компиляции для регулярных выражений. См. «PCRE jit» в пункте «6.3.2.2 Поддерживаемые опции».

HAVE_NSS — указывает, что suricata собрана с библиотекой NSS (Network Security Services). «HAVE_NSS» дополняет возможности «TLS».

Библиотека NSS используется в suricata для выполнения специфических криптографических операций, которые не всегда удобно (или возможно) делать через стандартный OpenSSL/GnuTLS:

  • Декомпрессия и работа с сертификатами: библиотека NSS помогает suricata корректно разбирать цепочки сертификатов в TLS‑трафике.

  • Хеширование и фингерпринтинг: функции вроде JA3/JA4 часто полагаются на криптографические примитивы, предоставляемые именно через интерфейсы, связанные с NSS.

  • Определение протоколов: библиотека NSS участвует в логике определения того, является ли текущий поток данных валидным TLS‑соединением.

  • Дешифровка (с ключами): если у вас есть закрытый ключ сервера или файл с сессионными ключами (SSLKEYLOGFILE), библиотека NSS помогает suricata расшифровать трафик для анализа.

Необходимые библиотеки: libnss3-dev, libnspr4-dev.

Устанавливается, если suricata собрана с библиотеками libnss3-dev, libnspr4-dev.

HTTP2_DECOMPRESSION — указывает, что suricata собрана с поддержкой автоматической распаковки данных в протоколе HTTP2. Это критически важная функция для современных сетей, так как почти весь веб‑трафик (Google, YouTube, соцсети, облачные сервисы) сегодня идет через HTTP2.

Поддержка автоматической распаковки данных обеспечивает:

  • Распаковку заголовков (HPACK): позволяет suricata «читать» заголовки (User‑Agent, Host, Cookies) для анализа. (В отличие от HTTP/1.1, где заголовки передаются в открытом текстовом виде, в HTTP2 они сжимаются алгоритмом HPACK.)

  • Декомпрессию тела ответа (Gzip/Brotli): если сервер отправляет сжатый контент внутри потока HTTP2, suricata сможет распаковать его в памяти и проверить на наличие зловредного кода или сигнатур.

  • Инспекцию бинарных фреймов: HTTP2 — это бинарный протокол. Опция гарантирует, что suricata правильно восстанавливает структуру данных из сжатых бинарных фреймов для сопоставления с правилами.

Необходимые библиотеки: zlib1g-dev (для Gzip/Deflate), liblz4-dev (если используется LZ4).

Требования для сборки: rustc и cargo.

Устанавливается, если при сборке в системе найден Rust и установлены необходимые библиотеки.

HAVE_LUA (LUA support) — указывает, что suricata собрана с поддержкой языка Lua.

Поддержка языка Lua позволяет:

  • Использовать Lua‑скрипты в правилах: вы можете писать сложные условия проверки трафика, которые невозможно реализовать обычными сигнатурами. Например, можно вычислить энтропию данных (для поиска зашифрованных каналов управления ботнетами) или проверить специфическую логику в заголовках, которую не поддерживает стандартный движок.

  • Выполнять необходимое вам логирование: вы можете создавать собственные форматы логов. Если вам не подходит стандартный JSON, вы пишете небольшой Lua‑скрипт, который будет сохранять данные о событиях в любом нужном вам виде или сразу отправлять их в стороннюю базу данных.

  • Выполнять обработку с условиями: скрипт может анализировать содержимое пакета и решать, нужно ли логировать это событие или стоит ли извлекать передаваемый файл.

Необходимая библиотека: libluajit-5.1-dev.

Устанавливается, если suricata собрана с библиотекой libluajit-5.1-dev.

HAVE_JA3, HAVE_JA4 — указывает, что suricata собрана с поддержкой алгоритмов создания «отпечатков пальцев» JA3 и JA4 для TLS‑клиентов. См. «JA3 support, JA4 support» в пункте «6.3.2.2 Поддерживаемые опции».

HAVE_LIBJANSSON — указывает, что suricata собрана с библиотекой Jansson. См. «Libjansson support» в пункте «6.3.2.2 Поддерживаемые опции».

TLS — указывает, что suricata собрана с поддержкой парсеров для анализа зашифрованного трафика. Без поддержки TLS suricata будет видеть защищенный трафик как обычный TCP‑поток данных. Возможности «TLS» дополняет «HAVE_NSS».

Анализа зашифрованного трафика обеспечивает:

  • Извлечение SNI (Server Name Indication): suricata «видит», на какой домен заходит пользователь (например, google.com), даже если само содержимое сайта зашифровано.

  • Анализ сертификатов: система считывает данные о владельце сертификата, издателе (CA), сроках действия и серийных номерах. Это позволяет блокировать поддельные или самоподписанные сертификаты.

  • Идентификацию версий протокола: suricata определяет, используется ли устаревший и небезопасный TLS 1.0/1.1 или современный TLS 1.3.

  • Fingerprinting (JA3/JA4): позволяет вычислять «отпечатки пальцев» клиентских приложений.

  • Логирование метаданных: Все данные о TLS-сессиях записываются в eve.json в структурированном виде.

  • А также:

    • Возможность запретить доступ к соцсетям или мессенджерам по именам доменов.

    • Обнаружить вредоносное ПО, которое скачивает обновления с зашифрованных серверов управления (C2).

    • Применять правила типа tls.sni, tls.subject или tls.fingerprint.

Необходимая библиотека: libssl-dev.

Требования для сборки: rustc и cargo.

Устанавливается, если при сборке в системе найден Rust и библиотека libssl-dev.

TLS_C11 — указывает, что suricata собрана с поддержкой стандарта языка C11 (ISO/IEC 9899:2011) для работы с потокобезопасными локальными данными (Thread‑Local Storage). Не путайте это с протоколом защиты трафика TLS (Transport Layer Security). Здесь речь идет о внутреннем управлении памятью процессора.

Поддержка стандарта языка C11 обеспечивает:

  • Потокобезопасность (Thread‑Local Storage): она позволяет каждому потоку (worker) suricata иметь свои собственные копии переменных. Это критично для многопоточной обработки трафика на скоростях 1 Гбит/с и выше, чтобы потоки не блокировали друг друга при обращении к общим данным.

  • Использование ключевого слова Threadlocal: это стандартный механизм C11. Компилятор и системные библиотеки (glibc) поддерживают нативный и быстрый способ работы с локальной памятью потока.

  • Оптимизацию производительности: нативная поддержка C11 TLS работает быстрее, чем старые обертки (вроде pthread_getspecific), что снижает накладные расходы на переключение контекста процессора.

Необходимая библиотека: нет. Это часть стандартной библиотеки языка C (GNU C Library — glibc) и возможностей компилятора GCC. В Debian 13 используется современная версия libc6 и gcc, которые полностью поддерживают стандарт C11.

Устанавливается автоматически.

MAGIC — указывает, что suricata собрана с библиотекой libmagic. См. «Libmagic support» в пункте «6.3.2.2 Поддерживаемые опции».

RUST — указывает, что suricata собрана с поддержкой языка программирования Rust. Начиная с 7-й версии, suricata перевела почти всю логику разбора протоколов (Application Layer) с языка C на Rust. Это было сделано для безопасности и производительности.

Поддержка языка Rust обеспечивает:

  • Безопасный парсинг: Rust защищает от ошибок работы с памятью (переполнения буфера), которые исторически были главным вектором атак на сами системы IDS/IPS.

  • Поддержку современных протоколов: только с использованием языка Rust работают парсеры: (HTTP2, TLS, QUIC, DNS, Bittorrent, SNMP, RDP и многие другие).

  • Критичные функции: без Rust не будут работать JA3/JA4 и HTTP2_DECOMPRESSION.

Требования для сборки: rustc и cargo.

Устанавливается автоматически.

POPCNT64 — указывает, что suricata собрана с поддержкой процессорной инструкции POPCNT для 64-битных систем. Эта инструкция используется для аппаратного ускорения специфических математических операций в движке suricata.

Поддержка инструкции POPCNT обеспечивает:

  • Подсчет установленных битов: инструкция POPCNT (Population Count) выполняет одну задачу — максимально быстро подсчитывает количество единиц в двоичном представлении числа.

  • Ускорение работы с Bloom‑фильтрами: в suricata эта операция критически важна для эффективной работы Bloom‑фильтров, которые используются для сверхбыстрой проверки наличия элементов в наборах данных (например, при сопоставлении паттернов или проверке IP‑репутаций).

  • Снижение нагрузки на CPU: без поддержки POPCNT процессору пришлось бы выполнять целую последовательность логических операций для получения того же результата. Аппаратная поддержка позволяет сделать это за один такт процессора.

В большинстве случаев эта опция включается автоматически на этапе конфигурирования, если ваш компилятор (GCC/Clang) и процессор поддерживают соответствующие расширения набора инструкций (SSE4.2 и выше). В Debian 13 при сборке на современном железе этот флаг почти всегда будет в значении YES. Если вы видите POPCNT64: NO, это может означать, что вы компилируете suricata для очень старой архитектуры или используете флаги совместимости, отключающие современные инструкции (например, ‑-disable‑gccmarch‑native).

6.3.2.2 Поддерживаемые опции.

Посмотреть какие опции будет поддерживать suricata можно после окончания configure. А для уже собранной программы необходимо выполнить команду:

# suricata --build-info

Здесь приведен обзор существующих опций для понимания того, какие возможности suricata они обеспечивают и и что необходимо для активирования этих опций.

Libmagic support — отвечает за определение типов файлов на основе их содержимого («магических чисел»), а не только по расширению или заголовкам протокола.

Опция “Libmagic support” позволяет:

  • Использовать ключевое слово filemagic: вы можете писать правила, которые срабатывают на конкретный тип данных внутри трафика. Например, правило может искать «исполняемый файл Windows» или «PDF-документ», даже если злоумышленник изменил расширение файла на .jpg.

  • Улучшить идентификацию файлов: suricata использует библиотеку для заполнения «липкого буфера» (sticky buffer) file.magic, по которому затем проводится поиск сигнатур.

  • Добавить дополнительную информацию в лог: в логах (например, в eve.json) появляется более точная информация о типе передаваемых файлов.

Необходимо до выполнения configure установить библиотеку: libmagic-dev

Необходимо выполнить configure с опцией: --enable-libmagic

Libjansson support — отвечает за работу с форматом JSON. Без этой библиотеки suricata не сможет формировать современные логи.

Опция «libjansson support» позволяет:

  • Выполнять вывод логов в формате JSON: это основной и самый важный функционал. Он объединяет алерты, метаданные протоколов (HTTP, DNS, TLS), информацию о файлах и потоках в единый структурированный JSON‑файл (eve.json).

  • Выполнять расширенное логирование: только с поддержкой Jansson доступны детальные поля, такие как хеши файлов, тела HTTP‑запросов и специфические атрибуты сертификатов.

Необходима библиотека: libjansson‑dev

Поддержка «libjansson support» включена по умолчанию и требуется чтобы библиотека libjansson‑dev была установлена.

Hiredis support — позволяет suricata отправлять события (EVE logs) напрямую в базу данных Redis.

Необходима библиотека: libhiredis-dev

Опция для configure: --enable-hiredis

Hiredis async with libevent — поддержка асинхронного режима для hiredis, чтобы запись в Redis не блокировала работу основных потоков suricata (что критично для роутера).

Необходима библиотека: libevent-dev

Опция для configure: --enable-hiredis-async

PCRE jit — значительно ускоряет проверку правил, использующих регулярные выражения. Позволяет компилировать регулярные выражения непосредственно в машинный код во время выполнения, вместо того чтобы интерпретировать их каждый раз при проверке пакета. Дополняет «Hyperscan support»

При использовании данной опции вы получаете:

  • Прирост производительности — скорость обработки сигнатур с ключевым словом pcre может вырасти в несколько раз (по некоторым тестам — до 3–6 раз для определенных типов правил).

  • Снижение нагрузки на CPU — за счет более эффективного выполнения кода регулярных выражений высвобождаются ресурсы процессора для других задач анализа трафика.

Необходима библиотека: libpcre2-dev.

Если установлена библиотека libpcre2-dev, поддержка включится автоматически.

GeoIP2 support — даёт возможность определять географическое местоположение IP-адресов (страну, город, координаты, ASN) в режиме реального времени.

Опция “GeoIP2 support” позволяет:

  • Фильтровать по странам в правилах: вы можете писать правила, которые срабатывают только для трафика из определенных стран или, наоборот, исключают их.

  • Обогащать логи: в файле eve.json для каждого события будут добавлены поля с кодом страны, названием города и данными о провайдере (ASN). Это критично для визуализации атак на картах в Kibana или Grafana.

  • Анализировать атаки по странам: позволяет быстро понять, на какие регионы приходится основной объем сканирования или брутфорса.

Необходима библиотека: libmaxminddb-dev

Утилита для проверки баз (полезно): mmdb-bin

Опция для configure: --enable-geoip

JA3 support, JA4 support — это методы «отпечатков пальцев» (fingerprinting) для TLS‑соединений. Они позволяют идентифицировать клиентское приложение (браузер, бот, малварь) по тому, как оно устанавливает защищенное соединение, даже если сам трафик зашифрован.

Опции «JA3 support, JA4 support» обеспечивают:

  • Идентификацию без дешифровки: вы можете узнать, что к серверу пришел не браузер Chrome, а, например, конкретный вирусный агент или Python‑скрипт, просто по набору параметров в пакете Client Hello.

  • Блокировку по отпечаткам: в правилах можно использовать ключевые слова ja3.hash, ja3.string или ja4. Пример: alert tls any any → any any (msg:«Обнаружен вредоносный агент»; ja3.hash:«773906b0efceda54573678b3378356ef»; sid:1000005;)

  • Обогащение логов: в eve.json для каждого TLS‑соединения будут добавлены уникальные хэш‑строки JA3/JA4.

Разница между JA3 и JA4:

  • JA3: Классический стандарт (создан инженерами Salesforce). Генерирует MD5-хэш на основе 5 параметров TLS.

  • JA4: Современный стандарт (целое семейство отпечатков). Он учитывает больше нюансов (протокол, количество расширений, ALPN) и выдает результат в более читаемом виде.

Необходимые пакеты для сборки:

  • OpenSSL (разработка): libssl‑dev

  • Rust и Cargo: rustc, cargo.

  • Python 3 (для генерации кода): python3 

Поддержка JA3 и JA4 включается по умолчанию, если у вас установлен Rust, включена поддержка TLS и установлена библиотека libssl‑dev.

Hyperscan support — это «турбо‑режим» для suricata. Использует высокопроизводительную библиотеку от Intel для одновременного поиска множества регулярных выражений. Hyperscan работает только на процессорах с поддержкой SSE3 и выше.

Проверка: # grep ‑o „pni|sse3“ /proc/cpuinfo | sort ‑u. Что искать в выводе:

pni (Prescott New Instructions) — это внутреннее название SSE3 в ядрах Linux для процессоров Intel. Если видите pni, значит SSE3 поддерживается.

sse3 — прямое название (чаще встречается на процессорах AMD).

Опция “Hyperscan support” обеспечивает:

  • Экстремальную скорость: Hyperscan использует специфические инструкции процессора (SSE, AVX) для параллельной обработки пакетов.

  • Скалируемость: она спроектирована для работы на скоростях 10 Gbps и выше.

  • Эффективность на больших наборах правил: чем больше у вас сигнатур (например, полные наборы правил от ET Pro), тем заметнее преимущество Hyperscan перед другими движками.

Обязательна для добавления. Без неё производительность suricata упадет в разы при обработке большого количества правил.

Необходима библиотека: libhyperscan-dev.

Зависимость для компиляции: ragel (необходим для сборки движка регулярных выражений).

Поддержка “Hyperscan support” включена по умолчанию и требуется чтобы библиотека libhyperscan-dev была установлена.

Hwloc support (Portable Hardware Locality) — отвечает за интеллектуальное управление потоками процессора. Она позволяет suricata «понимать» физическую топологию вашего железа: сколько в системе сокетов, ядер, кэшей (L1-L3) и как устроены NUMA‑узлы.

Опция «Hwloc support» обеспечивает:

  • Автоматическую оптимизацию (Affinity): suricata может сама распределять потоки обработки трафика (workers) по физическим ядрам так, чтобы они не конкурировали за кэш и не перепрыгивали между ядрами (что вызывает задержки).

  • Оптимизацию NUMA: на многопроцессорных серверах (например, двухсокетных Intel Xeon) работа с памятью идет быстрее, если поток процессора обращается к той оперативной памяти, которая подключена напрямую к его сокету. Hwloc помогает suricata привязывать потоки к «правильной» памяти.

  • Снижение пакетных потерь: за счет минимизации контекстных переключений (context switching) и оптимизации доступа к памяти увеличивается общая пропускная способность.

Необходима библиотека: libhwloc‑dev

Опция для configure: ‑-enable‑hwloc

Libnet support — библиотека libnet это высокоуровневый API, позволяющий программисту создавать и внедрять сетевые пакеты.

Использование libnet предоставляет возможности: сгенерировать и отправить поддельный TCP-пакет с флагом RST обеим сторонам соединения (клиенту и серверу). Они «думают», что партнер разорвал связь, и закрывают сессию. отправить ICMP-сообщение о недоступности порта для UDP-трафика, что также заставит приложения прекратить передачу данных. Используется только если вы хотите вместо «тихого» drop отправить атакующему явное уведомление о разрыве через действие reject.

Необходимая библиотека: libnet1-dev

Если установлена библиотека libnet1-dev, поддержка включится автоматически.

Liblz4 support — позволяет работать с алгоритмом сжатия LZ4, который ориентирован на экстремально высокую скорость распаковки при минимальной нагрузке на процессор.

Опция «Liblz4 support» обеспечивает:

  • Инспекцию сжатого контента: как и в случае с zlib, эта опция нужна для декомпрессии данных в сетевых протоколах «на лету». Если вредоносный файл или скрипт передается в потоке, сжатом с помощью LZ4, suricata сможет его распаковать и просканировать.

  • Работу с современными протоколами: LZ4 все чаще используется в распределенных системах и некоторых проприетарных протоколах передачи данных вместо более медленного Gzip.

  • Логирование (EVE JSON): В некоторых конфигурациях LZ4 может использоваться для быстрого сжатия самих логов suricata перед отправкой их в хранилище, чтобы сэкономить место на диске без потери производительности захвата пакетов.

Необходима библиотека: liblz4-dev

Если установлена библиотека liblz4-dev, поддержка включится автоматически.

Landlock support — это современный механизм безопасности Linux (LSM), который реализует принцип «песочницы» (sandboxing) на уровне ядра. Она ограничивает возможности процесса suricata после его запуска.

Даже если злоумышленник найдет уязвимость в коде парсера и попытается захватить управление, Landlock не позволит процессу:

  • Читать файлы вне разрешенных директорий (например, /etc/shadow).

  • Записывать данные в системные папки.

  • Открывать новые сетевые соединения (если это запрещено).

Это работает как дополнительный слой защиты (аналог AppArmor или SELinux), но настраивается самой программой «изнутри».

Необходимые библиотеки: не требует внешних библиотек. Это часть ядра Linux (в Debian 13 ядро достаточно свежее, чтобы поддерживать его полностью). Нужны только системные заголовочные файлы Linux, которые обычно уже есть в системе: linux‑libc‑dev (обычно установлен по умолчанию).

Поддержка включается автоматически.

Rust strict mode — Режим строгой проверки кода на языке Rust во время компиляции. Это опция для разработчиков suricata, чтобы находить ошибки в коде. Не нужно.

Profiling enabled — предназначена исключительно для разработчиков и глубокой отладки. Она добавляет в код инструкции для сбора статистики о том, какие части программы (правила, парсеры, ключевые слова) потребляют больше всего процессорного времени. Не нужно.

GCC Protect enabled — специальные механизмы защиты от взлома самой suricata (например, Stack Protector от переполнения буфера). Необходимо включить данную опцию, чтобы заработали флаги защиты и безопасности указанные в 'CFLAGS‘.

Опция для configure: --enable-gccprotect

GCC march native enabled — компилятор оптимизирует код именно под тот процессор, на котором идет сборка (использует все его инструкции: AVX2, SSE4.2 и т.д.).

Как включить: CFLAGS="-march=native"

GCC Profile enabled — cборка со специальными метками для профилирования (анализа производительности) кода. Нужно только разработчикам. В обычном режиме это только замедляет работу.

Position Independent Executable (PIE) — технология защиты (ASLR), которая загружает программу в случайные области оперативной памяти, чтобы хакерам было сложнее эксплуатировать уязвимости. Часто отключается для небольшого выигрыша в производительности.

Опция для configure: --enable-pie

6.3.3 Определите флаги компилятора для конфигурирования suricata.

Например: CFLAGS=“-O3 -march=native -flto=auto -ffat-lto-objects -fstack-protector-strong -fstack-clash-protection -fcf-protection --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Werror=implicit-function-declaration -std=c11”

Оптимизация производительности:

-O3 — Максимальный уровень оптимизации компилятора. Он заставляет программу работать быстрее, но сборка занимает больше времени, а исполняемый файл может стать чуть больше.

-march=native — Говорит компилятору использовать все инструкции вашего текущего процессора (например, AVX2, SSE4.2). Это дает прирост скорости, но такая suricata не запустится на другом, более старом процессоре.

-flto=auto, -ffat-lto-objects — Оптимизация на этапе линковки. Компилятор анализирует всю программу целиком, а не по одному файлу, что дает прирост скорости в 5-10%.

-std=c11 — Используется стандарт языка C 2011 года.

Защита и безопасность:

-fstack-protector-strong — Защищает от атак типа «переполнение стека». Компилятор добавляет специальные проверки («канарейки»), которые обрушат программу раньше, чем злоумышленник сможет выполнить свой код. Защищает около 99% реально опасных мест, но почти не замедляет работу программы в отличии от -fstack-protector-all.

-fstack-clash-protection — Предотвращает атаки типа «столкновение стека», когда память переполняется настолько, что перепрыгивает защитные зоны.

-fcf-protection — Аппаратная защита (на новых CPU Intel/AMD) от атак типа ROP (возвратное ориентированное программирование).

–-param=ssp-buffer-size=4 — Устанавливает порог для защиты буферов. Даже небольшие массивы данных (от 4 байт) будут под защитой. По умолчанию защита часто включается только для крупных массивов (8 байт и более).

-Wformat — проверять правильность передачи аргументов в функции вывода текста, такие как printf, scanf или syslog.

-Werror=format-security — Запрещает компиляцию, если найдены опасные функции вывода текста, которые могут привести к утечке памяти.

-Werror=implicit-function-declaration — превращает предупреждение о «неявном объявлении функции» в критическую ошибку, прерывающую сборку.

6.3.4 Сборка и установка suricata.

К этому моменту должны быть установлены все библиотеки для поддержки необходимых компонентов и опций.

Так же необходимо установить библиотеки:

libyaml-dev — требуется для поддержки YAML-парсера (основной конфигурационный файл suricata имеет yaml-формат).

libseccomp-dev — Создает «песочницу» для системных вызовов.

libunwind-dev — позволяет записать в лог-файл подробный отчет в случае аварийного завершения suricata.

libpcap-dev — нужна для захвата пакетов из сетевого интерфейса и чтение файлов дампов (.pcap)

libnl-3-dev — для взаимодействия с ядром Linux через интерфейс Netlink.

libjemalloc-dev — продвинутый менеджер управления оперативной памятью. Больше подходит для высоких нагрузок.

Для работы suricata-update необходимо установить:

python3 и python3-yaml

Итоговая команда установки необходимых библиотек и программ (если вы это не сделали):

apt install -y python3 python3-yaml libyaml-dev libseccomp-dev libunwind-dev libpcap-dev libnl-3-dev libnetfilter-queue-dev libnetfilter-queue1 libnfnetlink-dev libnfnetlink0 libcap-ng-dev libnss3-dev libnspr4-dev libhtp-dev zlib1g-dev liblz4-dev libluajit-5.1-dev libssl-dev libmagic-dev libjansson-dev libpcre2-dev libmaxminddb0 libmaxminddb-dev mmdb-bin libhyperscan-dev ragel libhwloc-dev libnet1-dev liblz4-1 linux-libc-dev sudo libjemalloc-dev

Выполняем:

# cd /usr/local/src/

# wget https://github.com/OISF/suricata/archive/refs/tags/suricata-8.0.4.zip

# unzip -tq suricata-8.0.4.zip && unzip -q suricata-8.0.4.zip

# mv suricata-suricata-8.0.4 suricata-8.0.4

# cd suricata-8.0.4

# ./scripts/bundle.sh # включаем suricata-update в состав сборки

# ./autogen.sh

Используемые опции для configure:

--prefix=/usr --sysconfdir=/etc --localstatedir=/var --datarootdir=/usr/share — указывают куда копировать файлы suricata при установке. С данными опциями файлы будут установлены в стандартные места (как если бы suricata была установлена из репозитариев).

--enable-nfqueue— включить поддержку движка NFQueue.

--enable-suricata-update — собирать и устанавливать «suricata‑update».

--enable-ndpi — включить поддержку nDPI.

--with-ndpi=/usr/local/src/nDPI-4.14 — путь к исходникам nDPI.

LDFLAGS="-ljemalloc" — использовать библиотеку jemalloc на этапе линковки.

Выполняем:

# ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --datarootdir=/usr/share --enable-nfqueue --enable-suricata-update --enable-libmagic --enable-geoip --enable-hwloc --enable-gccprotect --enable-pie --enable-ndpi --with-ndpi=/usr/local/src/nDPI-4.14 --enable-gccprotect CFLAGS=“-O3 -march=native -flto=auto -ffat-lto-objects -fstack-protector-strong -fstack-clash-protection -fcf-protection --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Werror=implicit-function-declaration -std=c11” LDFLAGS=“-ljemalloc”

После завершения configure внимательно проверьте в выдаваемой сводке, что включены все необходимые опции. Если нет, то выполните очистку "make clean", добавьте необходимые опции для configure и выполните configure снова. Если все устраивает, то выполняем сборку:

# make -j$(nproc)

После успешной сборки внимательно проверьте наличие всех необходимых компонентов и опций:

# ./src/suricata --build-info

Если чего-то не хватает, то выполните очистку, добавьте необходимые опции, выполните configure и сборку.

Имеющиеся варианты установки:

make install — установка основных файлов suricata.

make install-conf — автоматически создаст/настроит все необходимые каталоги.

make install-rules — автоматически загрузит и настроит последний набор правил из Emerging Threats, доступный для suricata.

make install-full — объединит все вышеперечисленное (install, install-conf и install-rules).

Выполняем установку:

# sudo make install && sudo make install-conf && sudo ldconfig

ссылка на оригинал статьи https://habr.com/ru/articles/1027966/