Введение

Snort — это мощная система обнаружения сетевых вторжений (NIDS) с открытым исходным кодом. Одной из её ключевых особенностей является гибкий язык правил, который позволяет специалистам по безопасности создавать сигнатуры для выявления вредоносной сетевой активности.

Правила — это мост между теорией и обнаружением. Идея безопасности, например «сканирование портов подозрительно», становится практически полезной только тогда, когда она выражена в форме, которую движок может сопоставить с реальным трафиком. Таким образом, изучение синтаксиса правил учит не только самому Snort, но и тому, как защитники переводят поведение в машиночитаемую логику.

В этой лабораторной работе вы изучите основной синтаксис и структуру пользовательских правил Snort. Вы напишете базовые правила, определяющие действия, протоколы, IP-адреса, порты и опции для обнаружения и оповещения о целевых ICMP-пингах и аномальных шаблонах TCP-трафика. К концу работы вы поймете, как создавать, тестировать и проверять собственные правила Snort.

Понимание синтаксиса и заголовка правила

На этом этапе вы изучите базовую структуру правила Snort и создадите файл для хранения ваших пользовательских правил.

Заголовок — это, по сути, определение области действия. Он решает, какой трафик вообще стоит анализировать дальше. Это важно, так как эффективное обнаружение начинается с максимально возможного сужения набора проверяемого трафика до применения глубокого анализа содержимого. Широкие заголовки писать проще, но они могут создавать больше «шума».

Правило Snort делится на две основные логические части: Заголовок правила (Rule Header) и Опции правила (Rule Options).

Заголовок правила содержит действие, протокол, IP-адреса источника и назначения, а также порты источника и назначения. Он определяет, кто с кем общается и какой протокол использует. Базовый синтаксис выглядит так:

[Action] [Protocol] [Source IP] [Source Port] -> [Destination IP] [Destination Port] (Options)

Разбор компонентов заголовка:

  • Action (Действие): Что должен сделать Snort при обнаружении пакета, соответствующего критериям правила (например, alert, log, drop).
  • Protocol (Протокол): Протокол трафика (например, tcp, udp, icmp, ip).
  • IP Addresses (IP-адреса): IP-адреса источника и назначения. Можно использовать any для соответствия всем IP-адресам.
  • Ports (Порты): Сетевые порты источника и назначения. Можно использовать any для соответствия всем портам.
  • Direction Operator (Оператор направления): Символ -> указывает направление трафика (от источника к назначению). Также можно использовать <> для двунаправленного трафика.

Чтобы начать писать собственные правила, нам нужен отдельный файл. Убедитесь, что вы находитесь в рабочей директории по умолчанию (~/project), и создайте новый файл с именем local.rules.

Используйте команду touch для создания пустого файла:

touch ~/project/local.rules

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

ls -l ~/project/local.rules

Вы должны увидеть вывод, похожий на этот, подтверждающий, что файл существует и в данный момент пуст:

-rw-r--r-- 1 labex labex 0 Jul 25 10:00 /home/labex/project/local.rules

Написание правила обнаружения ICMP

На этом этапе вы напишете свое первое правило Snort для обнаружения ICMP-трафика. ICMP (Internet Control Message Protocol) часто используется сетевыми утилитами, такими как ping, для проверки соединения.

ICMP — хороший пример для обучения, так как он прост и легко распознается, но он также иллюстрирует важный операционный момент: не каждое обнаружение означает атаку. Многие сети легитимно используют ping. Задача аналитика — объединить то, что обнаружило правило, с контекстом среды, прежде чем решать, является ли событие доброкачественным или подозрительным.

Мы напишем правило, которое вызывает оповещение всякий раз, когда любой ICMP-пакет передается от любого источника к любому назначению.

Откройте файл local.rules с помощью текстового редактора nano:

nano ~/project/local.rules

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

alert icmp any any -> any any (msg:"ICMP Ping Detected"; sid:1000001; rev:1;)

Разберем, что означает это правило:

  • alert: Действие, которое нужно выполнить. Snort сгенерирует оповещение.
  • icmp: Протокол, который мы отслеживаем.
  • any any -> any any: Трафик может исходить с любого IP и любого порта и направляться на любой IP и любой порт.
  • (msg:"ICMP Ping Detected"; sid:1000001; rev:1;): Это опции правила. msg — сообщение оповещения, sid — уникальный идентификатор Snort (пользовательские правила должны иметь ID 1 000 000 или выше), а rev — номер версии правила.

После ввода правила сохраните файл и выйдите из nano, нажав Ctrl+O, Enter для подтверждения имени файла, а затем Ctrl+X для выхода.

Теперь проверим, понимает ли Snort наш файл правил. У Snort есть тестовый режим (-T), который проверяет конфигурацию и правила на наличие синтаксических ошибок без фактического запуска движка обнаружения.

Выполните следующую команду для проверки файла правил:

sudo snort -T -c ~/project/local.rules

Вы увидите много текста при инициализации Snort. В нижней части вывода найдите сообщение об успехе, указывающее на то, что Snort успешно проверил конфигурацию:

Snort successfully validated the configuration!
Snort exiting

Если вы видите это сообщение, ваше ICMP-правило синтаксически верно.

Написание правила оповещения о TCP-порте

На этом этапе вы напишете правило для обнаружения специфического TCP-трафика. В то время как ICMP не использует порты, TCP и UDP их используют. Это позволяет нам писать правила, нацеленные на конкретные службы, такие как HTTP (порт 80) или SSH (порт 22).

Порты дают примерный контекст приложения. Они не рассказывают всю историю, но часто являются первым приближением, которое используют защитники для разделения типов служб. Правило, ориентированное на порт назначения 80, по сути говорит: «Меня интересует трафик, который, вероятно, направлен на веб-службу».

Мы напишем правило, которое будет оповещать нас всякий раз, когда кто-то пытается подключиться к веб-серверу на порту 80.

Снова откройте файл local.rules с помощью nano:

nano ~/project/local.rules

Добавьте новую строку под вашим существующим ICMP-правилом и введите следующее TCP-правило:

alert tcp any any -> any 80 (msg:"HTTP Traffic to Port 80 Detected"; sid:1000002; rev:1;)

Проанализируем заголовок этого нового правила:

  • alert tcp: Мы генерируем оповещение для протокола TCP.
  • any any: Источником может быть любой IP-адрес и любой порт.
  • ->: Трафик направляется к месту назначения.
  • any 80: Назначением может быть любой IP-адрес, но порт назначения должен быть 80.

Обратите внимание, что мы увеличили sid до 1000002. Каждое правило Snort должно иметь уникальный ID.

Сохраните файл (Ctrl+O, Enter) и выйдите из nano (Ctrl+X).

Как и прежде, хорошей практикой является проверка синтаксиса правила, чтобы убедиться в отсутствии опечаток. Выполните команду тестирования Snort:

sudo snort -T -c ~/project/local.rules

Прокрутите вывод до конца, чтобы подтвердить, что Snort успешно проверил конфигурацию. Теперь у вас успешно загружены два правила.

Включение опций правила (Msg, SID, Rev)

На этом этапе мы углубимся в раздел Опции правила (Rule Options). Раздел опций заключается в круглые скобки () и содержит пары «ключ/значение», разделенные точками с запятой ;.

Опции правила — это то, где грубая категория трафика превращается в осмысленное оповещение. Понятное сообщение msg помогает человеку понять событие. Уникальный sid позволяет системам отслеживать, какое правило сработало. Значение rev позволяет командам управлять контентом обнаружения с течением времени. Эти поля поддерживают операционную деятельность, а не только синтаксис.

Вы уже использовали три самые фундаментальные опции. Первая — msg, это сообщение, которое будет напечатано в журналах оповещений и должно быть описательным. Вторая — sid, что означает Snort ID; правила, написанные пользователями, должны иметь SID больше 1 000 000. Третья — rev, представляющая номер версии; каждый раз, когда вы изменяете правило, вы должны увеличивать это число, чтобы отслеживать версии.

Давайте напишем правило для обнаружения попыток SSH-подключения (порт 22), чтобы попрактиковаться в использовании этих опций.

Откройте файл local.rules:

nano ~/project/local.rules

Добавьте следующее правило в конец файла:

alert tcp any any -> any 22 (msg:"SSH Connection Attempt"; sid:1000003; rev:1;)

В этом правиле мы установили базовое сообщение msg и присвоили ему новый уникальный SID (1000003).

Предположим, позже мы решим обновить сообщение этого правила, чтобы сделать его более конкретным. Мы изменим msg и увеличим rev до 2. Давайте сделаем это сейчас. Измените SSH-правило, которое вы только что написали в конце файла, чтобы оно выглядело так:

alert tcp any any -> any 22 (msg:"Possible SSH Brute Force Attempt"; sid:1000003; rev:2;)

Сохраните файл (Ctrl+O, Enter) и выйдите из nano (Ctrl+X).

Наконец, выполните проверку синтаксиса еще раз, чтобы убедиться, что все три ваших правила отформатированы идеально:

sudo snort -T -c ~/project/local.rules

Найдите сообщение об успешной проверке. Теперь вы успешно написали и структурировали несколько пользовательских правил Snort, используя заголовки и опции.

Резюме

В этой лабораторной работе вы освоили базовые навыки, необходимые для написания пользовательских правил Snort. Вы изучили структуру правила, разделив его на заголовок и опции. Вы успешно написали правила для обнаружения общего ICMP-трафика и специфического TCP-трафика на портах. Кроме того, вы научились использовать важные опции правил, такие как msg, sid и rev, чтобы сделать ваши оповещения описательными и уникально идентифицируемыми. Эти навыки формируют основу для создания продвинутых сигнатур обнаружения сетевых вторжений.