Сигнатурные правила для Snort и Suricata
Написание и чтение сетевых правил
«Сигнатурные правила для Snort и Suricata» — бесплатный урок Cyber Security Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Cyber Security Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Cyber Security Academy содержит 4 уроков всего.
Snort и Suricata
Snort и Suricata — два ведущих механизма IDS/IPS с открытым исходным кодом. Они используют в основном совместимый язык правил, поэтому правило, написанное для одного механизма, обычно работает и в другом.
Suricata добавляет многопоточность, встроенные анализаторы протоколов, извлечение файлов и подробное журналирование (EVE JSON); Snort 3 аналогично модернизировал собственный механизм. Освоив синтаксис правил один раз, вы сможете эффективно работать с обоими механизмами.
Структура правила
У каждого правила есть две части: заголовок и заключённое в скобки тело с параметрами. Заголовок задаёт действие, протокол и направление трафика, а тело определяет, что сопоставлять и как формировать отчёт.
alert tcp $EXTERNAL_NET any -> $HOME_NET 80 ( \
msg:"WEB suspicious request"; \
content:"/admin.php"; http_uri; \
sid:1000001; rev:1; )Поля заголовка
Заголовок читается слева направо:
- действие — оповещение, отбрасывание, отклонение, разрешение
- протокол — tcp, udp, icmp, ip (или протоколы приложений в Suricata: http, dns, tls)
- исходный IP/порт и IP/порт назначения
- направление —
->одностороннее или<>двустороннее
Переменные вроде $HOME_NET и $EXTERNAL_NET берутся из конфигурации, поэтому правила остаются переносимыми между разными сетями.
drop tcp any any -> $HOME_NET 22 ( msg:"SSH blocked"; sid:1000002; rev:1; )Действия: оповещение и отбрасывание
Действие определяет, будет ли это правило работать в режиме IDS или IPS:
alert— вести журнал и отправлять уведомление, но не останавливать трафик (IDS)drop— молча отбрасывать пакет (IPS, только во встроенном режиме)reject— отбрасывать пакет и отправлять сброс TCP-соединения или сообщение ICMP о недоступностиpass— явно разрешать трафик, пропуская последующие правила
Один и тот же движок работает как IDS или IPS в зависимости от того, развёрнут ли он во встроенном режиме и какие действия используются.
Сопоставление содержимого
Ключевое слово content сопоставляет последовательность байтов с полезной нагрузкой. Текст заключают в кавычки, а двоичные данные записывают в вертикальных чертах в шестнадцатеричном виде.
Ключевые слова привязки уточняют сопоставление: offset, depth, distance и within ограничивают место появления последовательности, что повышает точность и производительность.
alert tcp any any -> $HOME_NET any ( \
msg:"Malware magic bytes"; \
content:"|4D 5A|"; offset:0; depth:2; \
sid:1000003; rev:1; )Буферы с фиксацией
Современные правила сопоставляют данные с буферами с учётом протокола, а не с необработанным потоком. После ключевого слова буфера последующие сопоставления content применяются к соответствующей части разобранного протокола.
http_uri— URI запросаhttp_header— заголовки запроса и ответаhttp_user_agent— агент пользователяtls_sni/dns_query— имя сервера TLS / запрос DNS
Это гораздо надёжнее, чем искать подстроку во всём пакете.
alert http any any -> any any ( \
msg:"Suspicious user agent"; \
http.user_agent; content:"sqlmap"; nocase; \
sid:1000004; rev:1; )PCRE и нечувствительность к регистру
Если фиксированных строк недостаточно, pcre добавляет регулярные выражения, совместимые с Perl. Сочетайте недорогой предварительный фильтр content с pcre, чтобы регулярное выражение запускалось только для подходящих пакетов и не снижало производительность.
Модификатор nocase делает сопоставление содержимого нечувствительным к регистру. Это важно для заголовков и полей, управляемых пользователем и изменяемых злоумышленниками.
alert http any any -> $HOME_NET any ( \
msg:"SQLi attempt in URI"; \
http.uri; content:"select"; nocase; \
pcre:"/union\s+select/i"; \
sid:1000005; rev:1; )Ключевые слова потока и состояния
Параметр flow ограничивает область действия правила состоянием и направлением соединения, уменьшая число ложных срабатываний и затраты ресурсов.
established— только для завершённых TCP-сеансовto_server/to_client— направление запроса или ответа
Сопоставление ответов сервера только для установленных соединений и направления к клиенту предотвращает срабатывания на случайных или поддельных пакетах.
alert tcp $HOME_NET any -> $EXTERNAL_NET any ( \
msg:"Beacon response"; \
flow:established,to_client; \
content:"|00 01 02 03|"; \
sid:1000006; rev:1; )Метаданные: идентификатор, ревизия, сообщение, ссылка
Служебные параметры помогают поддерживать правила в рабочем состоянии:
sid— уникальный ID сигнатуры (для локальных правил используйте значения от 1000000)rev— номер ревизии, увеличиваемый после каждого измененияmsg— текст оповещения, который видят аналитикиclasstype— категория, определяющая приоритетreference— ссылка на CVE или рекомендацию по безопасности
Стабильные идентификаторы и возрастающие номера ревизий позволяют отслеживать и обновлять правила, не нарушая работу панелей мониторинга и исключений.
alert tcp any any -> $HOME_NET 445 ( \
msg:"EternalBlue exploit attempt"; \
flow:to_server,established; content:"|FF|SMB"; \
classtype:attempted-admin; \
reference:cve,2017-0144; sid:1000007; rev:2; )Различия между Snort и Suricata
Хотя правила этих движков совместимы, их возможности различаются:
- Suricata поддерживает многопоточность, самостоятельно разбирает протоколы приложений, извлекает файлы, вычисляет JA3 и формирует данные EVE в формате JSON
- Snort 3 переписал свой движок для повышения производительности и добавил модульную систему подключаемых компонентов
Некоторые ключевые слова зависят от конкретного движка. Suricata добавляет ключевые слова уровня приложений (tls.sni, dns.query, http.method), а также возможности работы с наборами данных и битами состояния потока. При совместном использовании правил ориентируйтесь на минимальный общий набор возможностей или поддерживайте отдельные наборы правил для каждого движка.
Фильтрация по частоте и пороги
Чтобы правило не переполняло консоль, применяйте пороги. detection_filter срабатывает только после N событий за заданный интервал, а threshold с limit ограничивает количество оповещений.
Это особенно важно для обнаружения перебора паролей и сканирования, где одно событие ничего не значит, а сигналом является всплеск активности.
alert tcp any any -> $HOME_NET 22 ( \
msg:"SSH brute force"; flow:to_server; \
detection_filter:track by_src, count 5, seconds 60; \
sid:1000008; rev:1; )Быстрая проверка
Прочитайте правило и спрогнозируйте его поведение.
Повторение
Теперь Вы умеете читать и создавать сигнатуры Snort/Suricata:
- Правило = заголовок (действие, протокол, источник и назначение, направление) + параметры тела
- Действие определяет режим IDS или IPS:
alert,drop,reject,pass contentс ограничениями смещения и глубины сопоставляет байты полезной нагрузки, в том числе в шестнадцатеричном виде- Буферы с фиксацией (http.uri, tls.sni, dns.query) сопоставляют разобранные поля протокола
pcreиnocaseобрабатывают переменные последовательностиflowограничивает область действия состоянием и направлениемsid/rev/msg/referenceупрощают сопровождение правил- Пороги уменьшают шум от перебора и сканирования
Далее: обнаружение угроз без каких-либо сигнатур.
Часто задаваемые вопросы
Урок «Сигнатурные правила для Snort и Suricata» бесплатный?
Да — полный текст урока «Сигнатурные правила для Snort и Suricata» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Cyber Security Academy, подпишись на CoddyKit PRO. Курс Cyber Security Academy содержит 4 уроков всего.
Чему я научусь в уроке «Сигнатурные правила для Snort и Suricata»?
Написание и чтение сетевых правил Ты практикуешь Cyber Security Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Cyber Security Academy?
Предыдущий опыт не требуется. Cyber Security Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Сигнатурные правила для Snort и Suricata»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Cyber Security Academy?
Да. Каждый урок Cyber Security Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Понятия IDS и IPS
- Сигнатурные правила для Snort и Suricata
- Обнаружение аномалий и поведения
- Настройка и развёртывание