Suricata – это высокопроизводительная открытая система сетевого обнаружения угроз (IDS) и предотвращения (IPS), а также движок сетевого мониторинга безопасности (NSM). Она разрабатывается некоммерческой организацией OISF и ориентирована на многопоточные современные архитектуры. Благодаря этому Suricata способна эффективно обрабатывать трафик на многопроцессорных системах: по умолчанию она использует Intel Hyperscan для быстрого поиска строк в правилах, что позволяет увеличить пропускную способность в несколько раз. В режиме NSM Suricata ведёт подробное логирование сетевых сессий: фиксирует HTTP-запросы, хранит TLS-сертификаты, извлекает файлы из потоков, журналирует DNS-запросы и другие события.
Архитектура и конвейер обработки
Suricata имеет модульную многопоточную архитектуру. Пакеты проходят через конвейер обработки: модуль захвата, декодирования, затем потоковый движок (stream, для пересборки TCP/UDP-сессий), после чего – движок обнаружения (сравнение с сигнатурами) и модуль вывода результатов. Каждая часть конвейера выполняется в потоках Suricata, что позволяет параллельно обрабатывать множество пакетов. Например, в режиме workers трафик из сетевого интерфейса аппаратно/драйверно распределяется по потокам, и каждый поток содержит полный конвейер обработки. На схеме ниже показан пример такой организации: каждый поток обрабатывает свой набор пакетов, а отдельные управляющие потоки собирают статистику и логируют события.
Suricata в «workers»-режиме: каждый поток (Worker) получает трафик из интерфейса, полностью декодирует его, собирает сессии (Stream) и выполняет детектирование по правилам. Архитектура позволяет задействовать несколько ядер процессора, а для балансировки потоков используются возможности драйверов (PF_RING, RSS и т.п.).
Режимы работы (IDS, IPS, NSM)
Suricata может работать в пассивном режиме IDS (только обнаружение и логирование) или в inline-режиме IPS (активное блокирование трафика). По словам разработчиков, Suricata является «системой IDS, IPS и NSM». В режиме IPS она подключается к сетевому трафику (например, через NFQUEUE или мост между интерфейсами) и может удалять подозрительные пакеты. В режиме NSM Suricata предоставляет богатый набор логов сетевой активности: HTTP-трафик, обмен ключами TLS/SSL, DNS-пакеты и т.д. Эти данные обычно передаются в системы анализа (SIEM, NSM-платформы), где их можно визуализировать и исследовать.
Захват трафика и сетевые интерфейсы
Suricata поддерживает несколько способов захвата трафика:
- Оффлайн-режим (pcap). С помощью опции -r <файл> или --pcap Suricata читает пакеты из файла pcap или каталога файлов. Это удобно для анализа сохранённых логов или тестирования.
- libpcap. При указании интерфейса через -i <интерфейс> Suricata автоматически выбирает оптимальный метод захвата (обычно pcap или AF_PACKET).
- AF_PACKET (Linux). Это эффективный низкоуровневый захват через сетевой сокет в Linux. Suricata может слушать один или несколько интерфейсов (с опцией --af-packet). AF_PACKET используется как в IDS-, так и в IPS-режиме.
- AF_XDP/eBPF (Linux). В новых версиях доступен захват через XDP/AF_XDP (входящие пакеты на уровне драйвера). Также можно применять фильтрацию и балансировку на уровне eBPF/XDP для повышения скорости.
- NFQUEUE (Netfilter IPS). Для организованного inline-режима Suricata может подключаться через Netfilter NFQUEUE на Linux. При настройке iptables -j NFQUEUE пакеты помещаются в очередь, из которой Suricata их анализирует и по правилам может блокировать (опция -q <номер очереди>). Такой режим используется, если Suricata должна защищать сам хост или обрабатывать входящий/исходящий трафик.
- Bridge (IPFW) IPS. В режиме AF_PACKET-IPS требуется два физических интерфейса, объединённых мостом: Suricata получает пакеты между ними и может удалять ненужные.
- PF_RING и Netmap. Suricata поддерживает ускоренные библиотеки захвата: PF_RING (от Silicom) и Netmap. Они обеспечивают более быстрый приём пакетов на высоких скоростях.
- Специализированное оборудование. Suricata умеет работать с сетевыми картами ускоренного захвата: Endace DAG (через libdag), Napatech, Myricom и др. При сборке включается поддержка этих устройств, и Suricata получает пакеты напрямую из драйвера, минуя libpcap-обёртку.
Каждый из способов настраивается в конфиге suricata.yaml. В сумме это даёт гибкость: Suricata может слушать обычные интерфейсы, быть запущенной на мостах и аппаратных ускорителях, а также читать трафик из файлов.
Обработка трафика
После захвата пакеты проходят декодирование протоколов. Suricata распознаёт разные типы каналов (Ethernet, VLAN, MPLS, RAW и др.), затем IP (IPv4/IPv6) и транспорт (TCP/UDP/ICMP). IP-фрагменты (при необходимости) собираются заново, а для TCP-соединений ведётся отслеживание потока и транспортная реконструкция. Движок потоков состоит из двух частей: модуль отслеживания состояния TCP-сессии и модуль пересборки потока. Первый следит за стадиями соединения (трёхстороннее рукопожатие, закрытие и т.д.), второй воссоздаёт полную последовательность байтов из сегментов. Это позволяет правилам анализировать содержимое приложения целиком, а не только отдельные пакеты.
После сборки потоки передаются в детектор по сигнатурам. В Suricata подключены парсеры на уровне приложений: HTTP, DNS, FTP, SMTP, TLS, SSH, SMB и др. (система Apache-HTP используется для HTTP) – благодаря этому правила могут обращаться к полям протоколов (например, http.uri или tls.certificate). Suricata логирует детали приложений: все HTTP-запросы, ответы DNS, обмен ключами TLS (что помогает анализу шифрования) и т.д.
На каждом этапе Suricata использует ограничения производительности (бюджеты памяти, сроки жизни потоков), чтобы избежать перегрузки. При заполнении буфера потоков (параметр stream.reassembly.depth) движок может по политикам исключения сбрасывать или пропускать трафик. Результаты обнаружения (события и алерты) передаются в выводящий модуль (обычно в лог-файлы или в JSON-формат EVE).
Сигнатуры и правила
Основой обнаружения угроз в Suricata являются сигнатуры – правила, описывающие известные атаки или нежелательное поведение. Suricata совместима с синтаксисом правил Snort и может загружать готовые правила (например, Emerging Threats, VRT и др.), которые обычно устанавливаются с помощью утилиты suricata-update. Каждое правило состоит из трёх частей:
- Action (действие) – определяет реакцию движка при совпадении (например, alert, drop, reject, pass).
- Header (заголовок) – описывает, к какому трафику применяется правило: протокол (tcp/udp/icmp/ip), диапазоны исходных/целевых адресов и портов, направление потока. Для описания сетей используют переменные типа $HOME_NET и $EXTERNAL_NET, задаваемые в конфиге Suricata.
- Options (опции) – перечисление ключевых слов с условиями поиска: например, flow:established(допустимый поток), content:"NICK " (поиск последовательности байтов), pcre:"..." (регулярное выражение), а также поля msg, classtype, sid и др. (идентификатор сигнатуры, комментарий, класс атаки и т.д.).
Например
drop tcp $HOME_NET any -> $EXTERNAL_NET any (msg:"Пример"; flow:established; content:"NICK "; pcre:"/NICK .*USA.*/i"; sid:12345;)
при получении TCP-пакета из внутренней сети ($HOME_NET) в сторону внешней ($EXTERNAL_NET) с уже установленным соединением и с содержимым «NICK » – удалить пакет и записать событие. Действия drop и reject фактически блокируют трафик, alert лишь генерирует сигнал, pass пропускает без проверки и т.д. Suricata обрабатывает эти сигнатуры параллельно в потоках, используя Hyperscan для быстрого поиска строк и PCRE для регулярных выражений.
Сама система правил в Suricata богата ключевыми словами уровня приложений и сетевых протоколов (HTTP-заголовки, DNS, TLS, FTP и др.), что позволяет описывать сложные условия. Например, есть ключи http.host, tls.cert_subject, dns.query, а также flowbits для передачи данных между правилами и др. Правила подхватываются движком обнаружения во время загрузки и постоянно применяются к обработанному трафику.
Логирование и анализ
Suricata выводит результаты обнаружения и данные сессий через EVE JSON – расширяемый JSON-формат событий. Один общий JSON-файл (или поток) включает все типы событий: оповещения по правилам, сообщения об аномалиях, журналы HTTP, DNS, TLS, FTP, SSH, метрики потоков и т.д. Например, в EVE предусмотрены события с полем "event_type":"alert", "dns", "http", "tls", "flow" и др., содержащие подробные сведения (IP-адреса, порты, полезную нагрузку, дополнительные поля протоколов и пр.). Конфигурация Suricata позволяет направлять EVE-логи в файл, syslog или Unix-сокет; по умолчанию eve-logвключён в файл eve.json.
Следует отметить, что начиная с версии Suricata 6.0 устаревший формат Unified2 (legacy Fast-лог в стиле Snort) официально удалён – рекомендуемый выход для логов событий теперь именно EVE JSON. Для совместимости можно включить логирование полезной нагрузки (payload) в EVE в Base64. В итоге EVE-логи Suricata обычно направляются в системы анализа (например, Elastic Stack с модулем Suricata, Splunk App, Grafana и др.), где их фильтруют и визуализируют.
Таким образом, Suricata сочетает современный высокопроизводительный движок обработки трафика с гибкой системой правил и расширенными возможностями логирования, что делает её универсальным инструментом сетевого мониторинга и защиты.
Источники: официальная документация Suricata и материалы Open Information Security Foundation