|
Professor Seleznov
|
Часть I содержит: общие сведения о suricata; требования к железу; описание режимов работы; описание, характеристики и возможности nDPI; описание движков. Часть II содержит: установка suricata из исходных кодов. Часть III содержит: подготовка к запуску и запуск suricata. В этой части будет рассмотрено: 8. Примеры просмотра данных eve.json в консоли. 9. Просмотр лога, алертов и дропов через web-интерфес. 10. Простой пример использования suricata - блокировка торрентов. 11. Контроль работоспособности и используемых ресурсов. 8. Примеры просмотра данных eve.json в консоли. Установим jq необходимую для анализа json файлов:
sudo apt install jq
Добавьте пользователя под которым вы будете выполнять команды в группу suricata для обеспечения доступа к лог-файлам:
sudo usermod -a -G suricata user_name
Посмотреть все значения поля event_type, отсортированные по количеству появления в логе:
cat /var/log/suricata/eve.json | jq -r '.event_type' | sort | uniq -c | sort -nr
В зависимости от ваших настроек в suricata.yaml, вы можете в значении ‘.event_type’ увидеть: alert - оповещение о срабатывании правила. drop - оповещение о блокировке трафика. tls - событие на уровне прикладного протокола TLS. quic - событие на уровне прикладного протокола QUIC. http - событие на уровне прикладного протокола HTTP. dns - событие на уровне прикладного протокола DNS. flow - общая статистика по каждому сетевому соединению fileinfo - данные о переданных файлах stats - техническая статистика производительности suricata anomaly - зафиксированные нарушения структуры пакетов Посмотреть данные только по конкретному типу:
cat /var/log/suricata/eve.json | jq 'select(.event_type=="alert")' | more
Или в другом формате:
grep '"event_type":"alert"' /var/log/suricata/eve.json | more
Топ 10 самых частых alert-сигнатур. Выведет количество срабатываний, номер правила и текст сообщения:
jq -r 'select(.event_type=="alert") | [.alert.signature_id, .alert.signature] | @tsv' /var/log/suricata/eve.json | sort | uniq -c | sort -rn | head -n 10
Посмотреть кто и когда из клиентов попал под правило с sid:2068224:
jq -r 'select(.alert.signature_id==2068224) | [.timestamp, .src_ip, .dest_ip, .proto] | @tsv' /var/log/suricata/eve.json
Посмотреть все блокировки:
grep '"event_type":"drop"' /var/log/suricata/eve.json | jq -c '{timestamp, src_ip, dest_ip, reason: .drop.reason}'
'stream error' - блокировки потоков в которых suricata обнаруживает какие-либо ошибки или несоответствия при их анализе. Это не блокировки правилами. Посмотреть строку лога с приведенной блокировкой для подробного анализа (вставьте свой timestamp):
grep '"timestamp":"2026-04-08T22:15:17.281920+0300"' /var/log/suricata/eve.json
Для подробного анализа используйте «Dadroit JSON Viewer». Вывести tls-данные для посещенных сайтов:
jq -r 'select(.event_type=="tls") | .tls.subject' /var/log/suricata/eve.json | sort | uniq -c | sort -rn
Топ-10 самых активных nDPI протоколов:
jq -r 'select(.ndpi.proto != null) | .ndpi.proto' /var/log/suricata/eve.json | sort | uniq -c | sort -nr | head -n 10
Живой мониторинг через eve.json покажет, кто и какой nDPI протокол использует прямо сейчас:
tail -f /var/log/suricata/eve.json | jq -r 'select(.ndpi.proto != null) | "[\(.timestamp[11:19])] \(.src_ip) -> \(.dest_ip) | Протокол: \(.ndpi.proto) | Категория: \(.ndpi.category)"'
9. Просмотр лога, алертов и дропов через web-интерфес. Для комфортного просмотра лог-файла eve.json установим легкую программу evebox - инструмент для управления оповещениями и событиями suricata. Сайт разработчиков: https://evebox.org/ В стандартных репозиториях дистрибутива Debian/Ubuntu пакета evebox нет. Его нужно установить из репозитория разработчиков по приведенной ими инструкции:
sudo su - curl -fsSL https://evebox.org/files/evebox.asc -o /etc/apt/keyrings/evebox.asc echo "deb [signed-by=/etc/apt/keyrings/evebox.asc] https://evebox.org/files/debian stable main" | sudo tee /etc/apt/sources.list.d/evebox.list apt update apt install evebox exit
По умолчанию evebox настроен на использование базы данных elasticsearch. Будем использовать легкую бесплатную базу данных sqlite. Редактируем конфигурационный файл evebox /etc/evebox/evebox.yaml и изменяем его основные параметры.
Настройки в evebox.yaml
http: host: "192.168.124.13" # внутренний ip роутера port: 1026 database: type: sqlite retention: days: 3 input: enabled: true paths: - "/var/log/suricata/eve.json"
Параметр 'retention:' определяет сколько дней необходимо хранить данные (days:) и максимальный размер базы данных (size:). Можно одновременно указывать оба параметра. Не рекомендуется указывать большой срок хранения и большой размер базы данных, т.к. в ней будут продублированы данные лог-файла eve.json.
Так же в файле конфигурации можно настроить доступ по https, доступ по логину и паролю и включить обогащение записей информацией GeoIP. Подробную информацию по данным параметрам смотрите на сайте разработчиков. В suricata есть возможность настроить вывод алертов и дропов в отдельный json-файл, если вы хотите чтобы в evebox были только алерты и дропы. Evebox работает от имени пользователя evebox. Чтобы evebox имел разрешение на чтение файла статистики suricata необходимо добавить пользователя evebox в группу suricata:
sudo usermod -a -G suricata evebox
Редактируем файл сервиса evebox/usr/lib/systemd/system/evebox.service
Пример evebox.service
[Unit] Description=EveBox Server After=network.target network-online.target Requires=network-online.target [Service] User=evebox Group=evebox ExecStart=/usr/bin/evebox server $CONFIG Environment="CONFIG=-c /etc/evebox/evebox.yaml" Environment=EVEBOX_DATA_DIRECTORY=/var/lib/evebox [Install] WantedBy=multi-user.target
Перечитаем конфиги системных служб:
sudo systemctl daemon-reload
Включаем автозагрузку сервиса и запускаем его:
sudo systemctl enable evebox && sudo systemctl start evebox
Обращаемся к данным eve.json через браузер: http://192.168.124.13:1026 В настройках рекомендую включить темную тему. Events - текущие записи eve.json Inbox - как папка входящие где отображаются поступающие блокировки и оповещения. Когда вы выясните что это за события, примените к ним действие archive и evebox уберет их из Inbox. Escalated - помещаются события выбранные для расследования. Alerts - помещаются проверенные события, к которым применено действие archive. Dashboards - статистика по трафику Stats - статистика suricata. Отключена. Занимает безумно много места. Для анализа работы suricata ее можно получить с помощью 'suricatasc'. 10. Простой пример использования suricata - блокировка торрентов. Теперь, когда есть evebox для комфортного анализа оповещений, можно приступить к тестированию блокировки торрентов. Должны быть созданы списки правил как описано в "Часть III" в пункте "7.9 Создание списка правил". Запустите торрент-клиент на каком-нибудь компьютере локальной сети и посмотрите результат в evebox. У меня torrent трафик блокируется правилами с sid:1000000, sid:1000001 и sid:2008581. Посмотреть блокировки в консоли: Посмотреть сколько раз срабатывали правила блокировки:
cat /var/log/suricata/eve.json | jq -r 'select(.event_type=="drop" and .drop.reason=="rules") | "\(.alert.signature_id) \(.alert.signature)"' | sort | uniq -c | sort -nr
У меня получился такой вывод:
1425 1000001 nDPI: Block BitTorrent Protocol 50 1000000 Block BitTorrent DHT 12 2008581 ET P2P BitTorrent DHT ping request
Если вы не меняли порядок правил в /etc/suricata/rules/local.rulesи порядок просмотра файлов с правилами в конфиг-файле suricata /etc/suricata/suricata.yaml, то данные сверяются с правилами в следующем порядке: 1 - 1000000, 2 - 1000001, 3 - 2008581. Правила'drop' проверяются до первого совпадения. Если данные совпали с шаблоном указанным в каком-либо правиле, то проверка прекращается. Приведенные цифры статистики сработавших правил означают, что хоть правило 1000000 (содержит шаблон протокола bittorrent-dht парсера suricata) и указано первым, оно заблокировало всего 3% пакетов. А правило 1000001, содержащее шаблон протокола bittorrent-dht библиотеки nDPI заблокировало 96% пакетов. Вот в этом и заключается преимущество использования библиотеки nDPI и, значит, все мучения при установке и настройке вручную были не зря. Посмотрите уведомления о блокировках в evebox. Вы увидите, что правило, блокирующее торренты с использованием возможностей nDPI понимает:
- bittorrent-dht протокол;
- использование торрент-клиентами протокола http;
- трафик торрент-клиентов в протоколах tcp и udp при передаче данных с/на произвольные адреса и порты!
Нужно всего то 2-3 правила suricata, чтобы заблокировать торрент трафик, что является практически невыполнимой задачей при использовании только классического firewall. Посмотреть кто из клиентов попал под правило с sid:1000000 с выводом количества блокировок:
jq -r 'select(.alert.signature_id==1000000) | [.src_ip, .dest_ip, .proto] | @tsv' \ /var/log/suricata/eve.json | sort | uniq -c | sort -rn
11. Контроль работоспособности и используемых ресурсов. Я использую легкую программу monitorix для анализа загрузки процессора и использования оперативной памяти. Она показывает все необходимые данные на графиках и использует минимальные ресурсы. Установка:
sudo apt install monitorix
Отредактируйте конфиг-файл /etc/monitorix/monitorix.conf.
Настройки в monitorix.conf
enabled = y host = 192.168.124.13 # внутренний ip адрес роутера port = 1025 # порт сервиса Выбираем какие графики отображать
process = y serv = n port = n user = n Измените имена сетевых интерфейсов на свои: # NET graph
max = 10 list = wan, lan wan = Internet WAN, 0, 10000000 lan = LocalNet LAN, 0, 10000000 <\desc> gateway = wan <\net> # TC graph
list = wan, lan wan = cbq 1, sfq 10, sfq 20, sfq 30, ingress ffff lan = cbq 1, sfq 10, sfq 20, sfq 30, ingress ffff Здесь оставьте только те процессы, которые необходимо мониторить, например: # PROCESS graph
0 = suricata, evebox <\list> suricata = suricata evebox = evebox <\desc>
Перегружаем сервис:
sudo systemctl restart monitorix
Ждем некоторое время для наполнения данными и смотрим статистику: http://192.168.124.13:1025/monitorix/ Основные показатели - сколько suricata использует памяти и насколько нагружает процессор. Посмотреть в консоли:
ps aux | grep -E "USER|suricata"
Посмотреть пиковое значение используемой памяти:
sudo journalctl -u suricata | grep "memory peak"
Значения может не быть в журнале, если suricata работает недолго. В выводе может быть указано значение "memory swap peak". Оно показывает сколько оперативной памяти не хватает программе для нормальной работы. Количество переходов в режим Emergency -самый главный показатель здоровья suricata:
suricatasc -c dump-counters | jq -r '"Входов в режим Emergency: \(.message.flow.emerg_mode_entered)"'
Emergency mode (аварийный режим) в suricata — это механизм самосохранения, который включается автоматически, когда движок перестает справляться с потоком трафика и его внутренние очереди переполняются. Т.е. если пакетов приходит больше, чем suricata успевает обработать, она переходит в «аварийный режим», чтобы не упасть и не забить всю память системы. Когда лимит свободных слотов в очередях (flow или packet) достигает критически низкого порога, suricata выполняет:
- Агрессивную очистку памяти: suricata начинает моментально закрывать старые или неактивные соединения (flows), чтобы освободить место для новых пакетов.
- Сокращение таймаутов: время ожидания завершения TCP/UDP сессий резко уменьшается (в десятки раз). Например, если обычный таймаут для TCP — 300 секунд, в режиме Emergency он может упасть до 2 секунд.
- Смену приоритетов: движок перестает глубоко анализировать «зависшие» соединения, отдавая все ресурсы на обработку свежего трафика.
Если были переходы в аварийный режим, то количество этих переходов покажет насколько ваш конфиг-файл не соответствует нагрузке сети. Еще один способ посмотреть насколько плохи дела и понять какая часть данных не была обработана можно получив информацию из файла /proc/net/netfilter/nfnetlink_queue. Низкоуровневый контроль за очередями: В файле /proc/net/netfilter/nfnetlink_queue содержится информация об очередях netfilter в пользовательском пространстве (если это используется). Каждая строка описывает очередь. Очереди, на которые не было подписок из пространства пользователя, не показываются. # sudo cat /proc/net/netfilter/nfnetlink_queue
0 11909 0 2 65531 0 0 36054 1 1 2648202259 0 2 65531 0 0 7406 1 колонки: 1 2 3 4 5 6 7 8 9
Колонки каждой строки: 1 - Идентификатор очереди. Совпадает с указанным в параметрах --queue-num или --queue-balance для цели NFQUEUE. 2 - Номер процесса подписанного на очередь (для первого идентификатора очереди). 3 - Количество пакетов, находящихся сейчас в очереди и ожидающих обработки приложением. 4 - Режим копирования очереди. 1 - только метаданные; 2 - также копировать в пространство пользователя данные полезной нагрузки. 5 - Диапазон копирования. Т.е. не более скольких байт полезной нагрузки пакета должно быть скопировано в пространство пользователя. 6 - Отброшено ядром. Количество пакетов, которое было отброшено ядром из-за слишком большого количества пакетов уже ожидающих в пространстве пользователя (переполнения буфера приема). 7 - Отброшено приложением. Количество пакетов, которое было отброшено внутри процесса (программы) обрабатывающего данные. Обычно такое отбрасывание происходит когда переполнен соответствующий буфер приложения; т.е. приложение не способно обрабатывать данные достаточно быстро. 8 - Последовательный номер. Поле отображает ID самого нового пакета в очереди. Т.е. показывает количество обработанных пакетов. 9 - Номер существует только для совместимости и всегда равен 1. Если значения колонок 6 или 7 больше нуля, то необходимо увеличить параметр конфиг-файла 'max-pending-packets' и/или увеличить количество потоков анализа данных 'workers', если ресурсы процессора позволяют. Для серьезного анализа возникших проблем включите вывод статистики. Можно включить вывод в отдельный файл stats.log и в eve.json. Уменьшите интервал вывода, если необходимо (не рекомендуется устанавливать его менее 5 секунд). Так же статистику работы suricata можно получить выполнив:
sudo suricatasc -c dump-counters
Использование скриптов. За основу для получения информации о suricata можете взять представленные скрипты: suricata_check - Выводит расширенную информацию. В секции "Использование памяти и ошибки" выводит для указанных режимов обработки данных: заданный буфер памяти; сколько памяти используется; сколько было отброшено пакетов (dp) и потоков (df) при исчерпании выделенного буфера памяти. Для nfnetlink_queueвыводит колонки 1,6,7,8. В конце выводит все потоки suricata для анализа их распределения по ядрам процессора - колонка 'PSR'. suricata_check_memuse - Выводит информацию об используемой памяти и ошибки. suricata_check_memuse_tolog - Выводит только данные об используемой памяти и ошибки. Используйте для ведения лога при поиске проблем. Для быстрого получения информации о проблемах используйте: # grep -m 1 -B 8 "e: 1" suricata_check_memuse.log
suricata_check
#!/usr/bin/sh #20260416 # Для v.8.0.4 /usr/bin/suricatasc -c dump-counters > /tmp/dump-counters /usr/bin/suricatasc -c memcap-list > /tmp/memcap-list /usr/bin/jq -rs '"Время работы: \(.[0].message.uptime / 3600 | floor) ч \(.[0].message.uptime % 3600 / 60 | floor) мин", "Запущена: \(.[0].message.detect.engines[0].last_reload)", "Загружено правил: \(.[0].message.detect.engines[0].rules_loaded)", "Сработавших правил: \(.[0].message.detect.alert)", "Использование памяти и ошибки:", (.[1].message[0].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.tcp.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use | (.[0].message.exception_policy.tcp.ssn_memcap.drop_packet) as $dp | (.[0].message.exception_policy.tcp.ssn_memcap.drop_flow) as $df | " stream: memcap: \($cap)MB, memuse: \($use)MB - \(($use / $cap * 10000 | round) / 100)%; mpol dp: \($dp) df: \($dp)", (.[1].message[1].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.tcp.reassembly_memuse / 1024 / 1024 * 10000 | round) / 10000) as $use | (.[0].message.exception_policy.tcp.reassembly.drop_packet) as $dp | (.[0].message.exception_policy.tcp.reassembly.drop_flow) as $df | " reassembly: memcap: \($cap)MB, memuse: \($use)MB - \(($use / $cap * 10000 | round) / 100)%; mpol dp: \($dp) df: \($dp)", (.[1].message[2].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.flow.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use | (.[0].message.exception_policy.flow.memcap.drop_packet) as $dp | " flow: memcap: \($cap)MB, memuse: \($use)MB - \(($use / $cap * 10000 | round) / 100)%; mpol dp: \($dp)", (.[1].message[5].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.defrag.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use | (.[0].message.exception_policy.defrag.memcap.drop_packet) as $dp | " defrag: memcap: \($cap)MB, memuse: \($use)MB - \(($use / $cap * 10000 | round) / 100)%; mpol dp: \($dp)", (.[1].message[4].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.http.byterange.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use | " HTTP-Range: memcap: \($cap)MB, memuse: \($use)MB - \(($use / $cap * 10000 | round) / 100)%", (.[1].message[6].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.ippair.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use | " ippair: memcap: \($cap)MB, memuse: \($use)MB - \(($use / $cap * 10000 | round) / 100)%", (.[1].message[7].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.host.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use | " host: memcap: \($cap)MB, memuse: \($use)MB - \(($use / $cap * 10000 | round) / 100)%", "Accepted ядром: \(.[0].message.ips.accepted)", "Rejected ядром: \(.[0].message.ips.rejected)", "Replaced ядром: \(.[0].message.ips.replaced)", "Blocked ядром: \(.[0].message.ips.blocked)", (select(.[0].message.ips.drop_reason.decode_error > 0) | " Ошибок при попытке декодирования пакетов: \(.[0].message.ips.drop_reason.decode_error)"), (select(.[0].message.ips.drop_reason.defrag_error > 0) | " Ошибок при попытке собрать фрагментированный пакет: \(.[0].message.ips.drop_reason.defrag_error)"), (select(.[0].message.ips.drop_reason.defrag_memcap > 0) | " Отброшеных из-за исчерпания памяти, выделенной на дефрагментацию: \(.[0].message.ips.drop_reason.defrag_memcap)"), (select(.[0].message.ips.drop_reason.flow_memcap > 0) | " Отброшеных из-за переполнения таблица потоков (Flow table: \(.[0].message.ips.drop_reason.flow_memcap)"), (select(.[0].message.ips.drop_reason.flow_drop > 0) | " Отброшеных из-за специфических настроек управления потоками: \(.[0].message.ips.drop_reason.flow_drop)"), (select(.[0].message.ips.drop_reason.applayer_error > 0) | " Ошибок при попытке разбора парсерами: \(.[0].message.ips.drop_reason.applayer_error)"), (select(.[0].message.ips.drop_reason.applayer_memcap > 0) | " Отброшеных из-за превышения лимита памяти для анализа парсеров): \(.[0].message.ips.drop_reason.applayer_memcap)"), (select(.[0].message.ips.drop_reason.rules > 0) | " Заблокированных правилами с действием drop: \(.[0].message.ips.drop_reason.rules)"), (select(.[0].message.ips.drop_reason.threshold_detection_filter > 0) | " Отброшенных из-за сработавшего ограничения частоты (threshold): \(.[0].message.ips.drop_reason.threshold_detection_filter)"), (select(.[0].message.ips.drop_reason.stream_error > 0) | " Отброшенных из-за ошибок TCP-стека (напр. некорректный размер окна): \(.[0].message.ips.drop_reason.stream_error)"), (select(.[0].message.ips.drop_reason.stream_memcap > 0) | " Отброшенных из-за исчерпания памяти, выделенной для анализа потоков: \(.[0].message.ips.drop_reason.stream_memcap)"), (select(.[0].message.ips.drop_reason.stream_midstream > 0) | " Пакетов пришедших «посреди» сессии, которую Suricata не видела с самого начала: \(.[0].message.ips.drop_reason.stream_midstream)"), (select(.[0].message.ips.drop_reason.stream_reassembly > 0) | " Ошибок при попытке собрать данные из разных TCP-сегментов в один поток: \(.[0].message.ips.drop_reason.stream_reassembly)"), (select(.[0].message.ips.drop_reason.stream_urgent > 0) | " Блокировок пакетов с установленным флагом TCP Urgent: \(.[0].message.ips.drop_reason.stream_urgent)"), (select(.[0].message.ips.drop_reason.nfq_error > 0) | " Ошибок взаимодействия с очередью NFQUEUE: \(.[0].message.ips.drop_reason.nfq_error)"), (select(.[0].message.ips.drop_reason.tunnel_packet_drop > 0) | " Проблем с инкапсулированным трафиком (VXLAN, GRE, IPsec и т.д.): \(.[0].message.ips.drop_reason.tunnel_packet_drop)"), (select(.[0].message.ips.drop_reason.default_packet_policy > 0) | " Пакет был отброшен из-за default_packet_policy: \(.[0].message.ips.drop_reason.default_packet_policy)"), (select(.[0].message.ips.drop_reason.default_app_policy > 0) | " Пакет был отброшен из-за default_app_policy: \(.[0].message.ips.drop_reason.default_app_policy)"), (select(.[0].message.ips.drop_reason.pre_stream_hook > 0) | " Пакет был отброшен движком реорганизации потоков (Stream Engine): \(.[0].message.ips.drop_reason.pre_stream_hook)"), (select(.[0].message.ips.drop_reason.pre_flow_hook > 0) | " Пакет отброшен при создании или обновлении записи о потоке: \(.[0].message.ips.drop_reason.pre_flow_hook)"), "Декодировано пакетов: \(.[0].message.decoder.pkts)", " tcp: \(.[0].message.decoder.tcp)", " udp: \(.[0].message.decoder.udp)", "Ошибок декодирования: \(.[0].message.decoder.invalid)", "Разрывов в TCP-потоках: \(.[0].message.tcp.reassembly_gap)", "Потоков в памяти: \(.[0].message.flow.active)", "Входов в режим Emergency: \(.[0].message.flow.emerg_mode_entered)"' /tmp/dump-counters /tmp/memcap-list /usr/bin/echo "Размер буфера сокета netlink (ядра):" `/usr/bin/grep "setting nfnl bufsize" /var/log/suricata/suricata.log | /usr/bin/tail -n 1 | /usr/bin/awk '{ print $12/1024 }'` "КБ" /usr/bin/echo "Размер буфера сокета suricata (приложения):" `/usr/bin/grep "setting queue length" /var/log/suricata/suricata.log | /usr/bin/tail -n 1 | /usr/bin/awk '{ print $12/1024 }'` "КБ" /usr/bin/echo /usr/bin/echo "Содержание nfnetlink_queue:" /usr/bin/cat /proc/net/netfilter/nfnetlink_queue | awk '{ print $1," " $6," " $7," " $8}' /usr/bin/echo /usr/bin/ps -T -p $(pgrep -f /usr/bin/suricata) -o pid,tid,%cpu,%mem,vsz,rss,ni,pri,stat,psr,comm /usr/bin/echo
suricata_check_memuse
#!/usr/bin/sh #20260416 /usr/bin/suricatasc -c dump-counters > /tmp/dump-counters /usr/bin/suricatasc -c memcap-list > /tmp/memcap-list /usr/bin/jq -rs '"Использование памяти и ошибки:", (.[1].message[0].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.tcp.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use | (.[0].message.exception_policy.tcp.ssn_memcap.drop_packet) as $dp | (.[0].message.exception_policy.tcp.ssn_memcap.drop_flow) as $df | " stream: memcap: \($cap)MB, memuse: \($use)MB - \(($use / $cap * 10000 | round) / 100)%; mpol dp: \($dp) df: \($dp)", (.[1].message[1].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.tcp.reassembly_memuse / 1024 / 1024 * 10000 | round) / 10000) as $use | (.[0].message.exception_policy.tcp.reassembly.drop_packet) as $dp | (.[0].message.exception_policy.tcp.reassembly.drop_flow) as $df | " reassembly: memcap: \($cap)MB, memuse: \($use)MB - \(($use / $cap * 10000 | round) / 100)%; mpol dp: \($dp) df: \($dp)", (.[1].message[2].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.flow.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use | (.[0].message.exception_policy.flow.memcap.drop_packet) as $dp | " flow: memcap: \($cap)MB, memuse: \($use)MB - \(($use / $cap * 10000 | round) / 100)%; mpol dp: \($dp)", (.[1].message[5].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.defrag.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use | (.[0].message.exception_policy.defrag.memcap.drop_packet) as $dp | " defrag: memcap: \($cap)MB, memuse: \($use)MB - \(($use / $cap * 10000 | round) / 100)%; mpol dp: \($dp)", (.[1].message[4].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.http.byterange.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use | " HTTP-Range: memcap: \($cap)MB, memuse: \($use)MB - \(($use / $cap * 10000 | round) / 100)%", (.[1].message[6].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.ippair.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use | " ippair: memcap: \($cap)MB, memuse: \($use)MB - \(($use / $cap * 10000 | round) / 100)%", (.[1].message[7].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.host.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use | " host: memcap: \($cap)MB, memuse: \($use)MB - \(($use / $cap * 10000 | round) / 100)%", "Входов в режим Emergency: \(.[0].message.flow.emerg_mode_entered)"' /tmp/dump-counters /tmp/memcap-list /usr/bin/echo
suricata_check_memuse_tolog
#!/usr/bin/sh #20260416 /usr/bin/suricatasc -c dump-counters > /tmp/dump-counters /usr/bin/suricatasc -c memcap-list > /tmp/memcap-list /usr/bin/date +"%d.%m.%y %H:%M:%S" /usr/bin/jq -rs ' (.[1].message[0].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.tcp.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use | (.[0].message.exception_policy.tcp.ssn_memcap.drop_packet) as $dp | (.[0].message.exception_policy.tcp.ssn_memcap.drop_flow) as $df | "s: \($cap) \($use) \(($use / $cap * 10000 | round) / 100) \($dp) \($dp)", (.[1].message[1].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.tcp.reassembly_memuse / 1024 / 1024 * 10000 | round) / 10000) as $use | (.[0].message.exception_policy.tcp.reassembly.drop_packet) as $dp | (.[0].message.exception_policy.tcp.reassembly.drop_flow) as $df | "r: \($cap) \($use) \(($use / $cap * 10000 | round) / 100) \($dp) \($dp)", (.[1].message[2].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.flow.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use | (.[0].message.exception_policy.flow.memcap.drop_packet) as $dp | "f: \($cap) \($use) \(($use / $cap * 10000 | round) / 100) \($dp)", (.[1].message[5].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.defrag.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use | (.[0].message.exception_policy.defrag.memcap.drop_packet) as $dp | "d: \($cap) \($use) \(($use / $cap * 10000 | round) / 100) \($dp)", (.[1].message[4].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.http.byterange.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use | "h: \($cap) \($use) \(($use / $cap * 10000 | round) / 100)", (.[1].message[6].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.ippair.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use | "i: \($cap) \($use) \(($use / $cap * 10000 | round) / 100)", (.[1].message[7].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.host.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use | "h: \($cap) \($use) \(($use / $cap * 10000 | round) / 100)", "e: \(.[0].message.flow.emerg_mode_entered)"' /tmp/dump-counters /tmp/memcap-list /usr/bin/echo
Если все работает без проблем, то не забудьте удалить флаг 'bypass' из правил nftables/iptables пересылающих трафик suricata. Правило 2068224 ловит передачу телеметрии. Сделайте так, чтобы оно блокировало передачу телеметрии.-Источник
|