Введение
Детектор команды отмечает каждый POST к collector.example.test/collect. Часть — разрешённые публичные демонстрации. Нужно сосредоточить тревоги на внутренних документах, сохранив разрешённые обмены.
Независимая среда содержит broad.rules, прежний детектор маршрута, и полные синтетические TCP/HTTP-захваты. Команды вводите на вкладке Analyst, а для просмотра записанных запросов выберите вкладку Traffic Reference; страница открывается сразу. Те же примеры находятся в traffic/requests.txt. Файлы предыдущей VM не нужны. Анализ тела относится к открытому HTTP, не к зашифрованному HTTPS.
Найдите контекст чувствительного документа
На этом шаге выясните, почему признак в теле полезен, но недостаточен сам по себе. classification=internal — синтетическое бизнес-поле категории обработки документа, а не отметка завершения.
Чтобы начать этот шаг, выберите вкладку Analyst в интерфейсе лабораторной работы.
Перейдите на вкладку Traffic Reference, сравните тела запросов, затем вернитесь на вкладку Analyst. Прочитайте справку и воспроизведите трафик с предоставленным детектором. Параметры прежние: только заданные правила через -S, входной PCAP через -r и каталог вывода через -l.

Перед выполнением следующей команды перейдите на вкладку Analyst.
cat traffic/requests.txt
mkdir -p broad-output
suricata --runmode single -c suricata.yaml -S broad.rules -r traffic/core.pcap -l broad-output --init-errors-fatal
python3 /opt/c09/read-alerts.py broad-output/eve.json
Ожидаются четыре тревоги, включая два публичных документа. classification=public означает содержимое, допустимое для публичной демонстрации на этом маршруте. Политика объединяет метод, назначение, маршрут и внутреннюю классификацию.
Попробуйте детектор только тела для нового буфера. После http.request_body следующий content проверяет восстановленное тело, даже если байты разделены пакетами TCP. Сборку выполняет движок; поиск по отдельным пакетам не эквивалентен. Границы целого буфера не нужны: классификация — поле внутри более длинного тела.
Снова используйте буквальный многострочный ввод: > заменяет файл, а конечный RULE занимает отдельную строку.
cat > body.rules <<'RULE'
alert http any any -> any any (msg:"Review document upload"; flow:established,to_server; http.request_body; content:"classification=internal"; sid:1000001; rev:1;)
RULE
mkdir -p body-output
suricata --runmode single -c suricata.yaml -S body.rules -r traffic/core.pcap -l body-output --init-errors-fatal
python3 /opt/c09/read-alerts.py body-output/eve.json
Ожидается Alerts: 9. Теперь тревоги вызывают и внутренние документы одобренным получателям, PUT и другие маршруты сборщика. Поиск чувствительного слова где угодно слишком широк. Сохраните результат как эксперимент, не как конечный детектор политики.
python3 /opt/c09/check.py body.rules body
Оба набора должны дать девять обменов с этим телом. Синтаксическую ошибку можно исправить: перепишите блок и повторите в новом каталоге, чтобы добавленные события не исказили число.
Объедините условия и проверьте баланс
На этом шаге объедините четыре изученных HTTP-поля. Сохраните POST, точный хост и точный маршрут сборщика; добавьте внутреннюю классификацию.
Чтобы начать этот шаг, выберите вкладку Analyst в интерфейсе лабораторной работы.
Создайте итоговый файл local.rules. Условия разных буферов соединяются через AND: транзакция должна выполнить все. sid:1000001 остаётся уникальным локальным идентификатором; достаточно одного активного правила.
Перед выполнением следующей команды перейдите на вкладку Analyst.
cat > local.rules <<'RULE'
alert http any any -> any any (msg:"Review document upload"; flow:established,to_server; http.method; content:"POST"; startswith; endswith; http.host; content:"collector.example.test"; startswith; endswith; http.uri; content:"/collect"; startswith; endswith; http.request_body; content:"classification=internal"; sid:1000001; rev:1;)
RULE
Перед воспроизведением проверьте синтаксис с -T. Каталог и -l дают записываемый вывод и этой проверке. Конфигурация и правила загружаются без чтения пакетов. Успех синтаксиса не доказывает качество детектора.
mkdir -p syntax-output
suricata -T -c suricata.yaml -S local.rules -l syntax-output --init-errors-fatal
mkdir -p final-output
suricata --runmode single -c suricata.yaml -S local.rules -r traffic/core.pcap -l final-output --init-errors-fatal
python3 /opt/c09/read-alerts.py final-output/eve.json
Ожидается Alerts: 2 для 41002 и 41007: внутренний документ отправляется POST на неразрешённый маршрут. Публичные примеры, одобренные загрузки, проверки состояния, другие методы и маршруты остаются тихими. Тревоги всё ещё показывают action: allowed: офлайн-анализ наблюдает, а не предотвращает загрузку.
Запустите сбалансированную регрессионную проверку. После изменения она повторяет известные обязательные и запрещённые совпадения. В чистом выводе воспроизводятся видимый набор и дополнительные примеры с другими именами и портами. Проверяется правило, а не прежнее число событий.
python3 /opt/c09/check.py local.rules final
Обе строки должны дать два нужных обмена и отсутствие тревог на сравнениях. Повторите: результат и захват не должны измениться. Пропуски указывают на слишком узкие условия или неверный буфер; лишние тревоги — на отсутствующее либо широкое условие. Перепишите local.rules и повторите. Не отключайте движок и не удаляйте легитимные сравнения.
Это ограниченный детектор политики, не универсальное обнаружение утечек. Большие тела, шифрование, кодировки и другие протоколы требуют отдельного проектирования и тестов. Задание изменяет факты политики, сохраняя те же четыре буфера.
Резюме
Вы сравнили детектор только маршрута с экспериментом только тела, затем объединили четыре HTTP-поля. Вы проверили правило на сбалансированных наборах в чистых каталогах и явно обозначили границы видимости.



