В первой части мы подняли single-node Wazuh и получили dashboard с ровно одним источником событий — самим manager, агентом с ID 000. Без агентов SIEM слеп: он не увидит ни правку /etc/sudoers, ни новый ключ автозапуска в реестре Windows, ни то, что на сервере кто-то пересобрал sshd. Вторая часть цикла — про глаза: регистрируем агентов на Ubuntu и Windows, включаем File Integrity Monitoring (FIM) через syscheck, подключаем rootcheck и SCA по CIS Benchmark — и разбираемся, почему из коробки это чаще генератор шума, а не сигнал.
Содержание
Открыть содержание
- Почему агент, а не syslog
- Enrollment: разовая регистрация, потом только ключи
- Что нужно, чтобы подключить Ubuntu-сервер
- Windows без кликов
- syscheck: FIM, который можно читать
- rootcheck и SCA: разные вопросы
- Группы агентов: конфиг из одной точки
- Шум против сигнала
- Как проверить, что всё работает
- Итог
Почему агент, а не syslog
Доставить логи до manager можно и без агента: wazuh-remoted умеет принимать syslog. Но всё интересное в Wazuh живёт только на агенте — чтобы посчитать хэш файла, прогнать CIS-проверку или снять inventory пакетов, нужно исполнять код на самом хосте. Агент — это один демон (wazuh-agent, systemd-юнит), который локально собирает события и держит постоянное шифрованное соединение с manager. Ему нужны два порта, и оба — исходящие:
- 1514 — поток событий и keepalive, шифруется ключом агента;
- 1515 — разовая регистрация (enrollment), нужна только в момент добавления хоста.
Агент всегда инициирует соединение сам: на наблюдаемом хосте не нужно открывать входящие порты, и это снимает половину возражений безопасности.
Enrollment: разовая регистрация, потом только ключи
Прежде чем слать события, агент должен представиться — и быть принятым. Для этого существует enrollment:
На manager по умолчанию поднят сервис wazuh-authd, слушающий 1515. Включаем пароль:
<!-- /var/ossec/etc/ossec.conf на manager -->
<auth>
<use_password>yes</use_password>
<port>1515</port>
</auth>
echo 'S0meEnr0llPass' > /var/ossec/etc/authd.pass
chmod 640 /var/ossec/etc/authd.pass
systemctl restart wazuh-manager # Docker из части 1: docker restart wazuh.manager
Пароль один на всех агентов и участвует один раз — при регистрации. После неё каждая сторона хранит в /var/ossec/etc/client.keys симметричный ключ конкретного агента, и весь трафик идёт на 1514 уже по нему. Важно понять это сразу: authd-пароль — не «пароль от событий», а ключ от шлагбаума.
Ручной путь — утилита manage_agents на обеих сторонах: на manager добавляете агента (Add) и выгружаете ключ (Extract), на агенте импортируете его (Import). На Windows то же самое делает manage_agents.exe в каталоге установки. Ручной путь нужен, когда 1515 закрыт сегментацией сети или политика не разрешает автрегистрацию.
И держите в голове горизонт: в Wazuh 5.0 протокол общения агент-сервер переписывается с нуля (release notes). Детали enrollment в 5.x могут измениться, но модель «разовая регистрация → ключ → поток событий» переживёт и его — учите её, а не кнопки.
Что нужно, чтобы подключить Ubuntu-сервер
Нужны root на агенте, сеть до manager по 1514/1515 и минута времени:
# репозиторий
apt-get update && apt-get install -y curl gnupg
curl -s https://packages.wazuh.com/key/GPG-KEY-WAZUH | \
gpg --dearmor -o /usr/share/keyrings/wazuh.gpg
echo "deb [signed-by=/usr/share/keyrings/wazuh.gpg] https://packages.wazuh.com/4.x/apt/ stable main" \
> /etc/apt/sources.list.d/wazuh.list
apt-get update
# установка и регистрация одним махом
WAZUH_MANAGER="10.0.0.5" \
WAZUH_REGISTRATION_SERVER="10.0.0.5" \
WAZUH_REGISTRATION_PASSWORD="S0meEnr0llPass" \
apt-get install -y wazuh-agent
systemctl enable --now wazuh-agent
Переменные подхватывает postinst-скрипт пакета: он прописывает адрес manager в /var/ossec/etc/ossec.conf и тут же ходит на authd за ключом. Если агент уже установлен без регистрации — то же самое вручную:
/var/ossec/bin/agent-auth -m 10.0.0.5 -P 'S0meEnr0llPass'
# и проверьте <address> внутри <client> → <server> в ossec.conf
systemctl restart wazuh-agent
Windows без кликов
MSI-пакет ставится silently и принимает те же переменные:
msiexec.exe /i wazuh-agent-4.14.7-1.msi /q `
WAZUH_MANAGER="10.0.0.5" `
WAZUH_REGISTRATION_SERVER="10.0.0.5" `
WAZUH_REGISTRATION_PASSWORD="S0meEnr0llPass"
NET START WazuhSvc
Конфиг — C:\Program Files (x86)\ossec-agent\ossec.conf, тот же XML, что и на Linux. Служба называется WazuhSvc, перезапуск — Restart-Service WazuhSvc. Дальше разницы между платформами почти нет: одни и те же секции, разные пути.
syscheck: FIM, который можно читать
Главный модуль агента — syscheck, он и есть File Integrity Monitoring. Логика: при первом запуске syscheck обходит настроенные пути и строит baseline — хэши (MD5/SHA1/SHA256), размер, права, владельца, время модификации. Дальше три режима слежения:
- периодический скан — раз в
<frequency>секунд: дёшево, но с окном слепоты на часы; - realtime — на Linux через inotify, на Windows через ReadDirectoryChangesW: событие приходит за секунды;
- whodata — realtime плюс ответ на «кто это сделал»: на Linux метаданные даёт auditd, на Windows — SACL-аудит в security log.
Практический блок для Ubuntu-агента — критичные пути, realtime, diff в алерте и whodata на самом важном:
<syscheck>
<disabled>no</disabled>
<frequency>43200</frequency>
<scan_on_start>yes</scan_on_start>
<!-- критичные пути: realtime + diff прямо в алерте -->
<directories check_all="yes" realtime="yes" report_changes="yes">/etc,/root,/bin,/sbin</directories>
<directories check_all="yes" realtime="yes" report_changes="yes">/usr/bin,/usr/sbin</directories>
<!-- самое важное: ещё и «кто изменил» через auditd -->
<directories check_all="yes" whodata="yes" report_changes="yes">/etc/ssh,/etc/sudoers.d</directories>
<!-- вечный шум выключаем -->
<ignore>/etc/mtab</ignore>
<ignore type="sregex">^/etc/apparmor.d/cache</ignore>
<!-- содержимое секретов не должно уезжать в алерты -->
<nodiff>/etc/shadow,/etc/gshadow</nodiff>
</syscheck>
По элементам:
- check_all — хэши и все атрибуты; можно сузить до
check_sumи избранных атрибутов, но начать стоит с полного; - report_changes — в алерт попадает diff изменённого файла; то, ради чего FIM вообще заводят;
- whodata=“yes” — вместо простого realtime; на Linux требует auditd (audit-правила syscheck добавит сам), на Windows — включённой политики аудита Object Access;
- ignore и nodiff — первый полностью выключает мониторинг пути, второй оставляет событие, но прячет diff.
На Windows к директориям добавляется реестр — классика persistence-механиков:
<windows_registry check_all="yes" realtime="yes" report_changes="yes" whodata="yes">HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run</windows_registry>
<windows_registry check_all="yes" realtime="yes" report_changes="yes">HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services</windows_registry>
Изменённый файл опознает правило 550, удалённый — 551, новый — 553; у реестра своя линейка правил. Всё это видно в dashboard → Modules → Integrity monitoring — с diff и «до/после».
rootcheck и SCA: разные вопросы
rootcheck — старый, но дешёвый детектор аномалий системы: скрытые процессы и файлы (расхождение вывода ps с /proc), странные записи в /dev, подписи руткитов и троянов из поставляемых списков. Современный APT-инструментарий он не перехитрит, но стоит копейки и на Linux-агентах просто живёт в конфиге:
<rootcheck>
<disabled>no</disabled>
</rootcheck>
SCA (Security Configuration Assessment) отвечает на другой вопрос: «соответствует ли хост формальному стандарту?». Политики — YAML-файлы с проверками из CIS Benchmark: параметры ядра, права на файлы, службы, на Windows — реестр. Результат — pass/fail по каждому пункту. Это не детект вторжений, а контроль дрейфа конфигурации: сервер, который «вдруг» перестал соответствовать базовой линии, — событие само по себе.
Для Ubuntu-агента подключаем готовую политику CIS:
<sca>
<enabled>yes</enabled>
<scan_on_start>yes</scan_on_start>
<interval>12h</interval>
<policies>
<policy>cis_ubuntu22.04.yml</policy>
</policies>
</sca>
Файлы политик лежат в /var/ossec/ruleset/sca/ на агенте. Подбирайте политику под дистрибутив: cis_ubuntu22.04 на Debian даст поток ложных fail ещё до того, как вы что-то сломаете сами.
Группы агентов: конфиг из одной точки
Когда агентов больше трёх, править ossec.conf на каждом невозможно. Группы решают это: manager хранит для каждой группы общий конфиг и раздаёт его участникам.
/var/ossec/bin/agent_groups -a -g prod-linux -q # создать группу
/var/ossec/bin/agent_groups -a -d 002 -g prod-linux -q # добавить агента (ID из agent_control -ls)
/var/ossec/bin/agent_groups -l -g prod-linux # проверить состав
Конфиг группы — /var/ossec/etc/shared/prod-linux/agent.conf:
<agent_config>
<syscheck>
<directories check_all="yes" realtime="yes" report_changes="yes">/etc,/root,/bin,/sbin,/usr/bin,/usr/sbin</directories>
<ignore>/etc/mtab</ignore>
<nodiff>/etc/shadow,/etc/gshadow</nodiff>
</syscheck>
</agent_config>
Секции из agent.conf имеют приоритет над локальным ossec.conf агента — держите настройку одного модуля в одном месте, иначе через месяц не разберёте, чья директива выиграла.
Шум против сигнала
Одна и та же функция syscheck в зависимости от путей даёт противоположные результаты:
| Параметр | Дефолтный syscheck | Настроенный FIM |
|---|---|---|
| Пути | широкий набор «на всякий случай» | только критичные директории |
| Режим | в основном периодический скан | realtime, на критичном — whodata |
| Кто изменил | неизвестно | user и исполняемый процесс |
| Diff | нет | report_changes + nodiff для секретов |
| SCA | что нашлось само | CIS-политика под конкретный дистрибутив |
| Что в алертах | поток событий о легитимном | единицы сигналов на реальные изменения |
Типичные ошибки, из-за которых FIM выключают через неделю:
/var,/home,/tmpцеликом — логи и кэши меняются каждую секунду, алерты о них не читает никто;- realtime на тысячи файлов — упираетесь в лимиты inotify (
fs.inotify.max_user_watches), и realtime тихо деградирует; - забытый
nodiff— содержимое/etc/shadowуезжает в алерты, а алерты читают и люди, и боты; - whodata без auditd (или без политики аудита на Windows) — метаданных «кто» просто не будет, событие останется слепым;
- SCA-политика не под дистрибутив — false fail по каждому пункту, отчёты перестают открывать.
Как проверить, что всё работает
На manager (в Docker-варианте из части 1 — через docker exec -ti wazuh.manager):
/var/ossec/bin/agent_control -ls
Агент должен быть в статусе Active. Дальше smoke-тест FIM — на агенте:
echo '# fim smoke test' | sudo tee /etc/ssh/sshd_config.d/99-fim-test.conf
Через секунды событие придёт: tail -f /var/ossec/logs/alerts/alerts.json | grep fim-test покажет алерт с правилом 553, а в dashboard → Modules → Integrity monitoring появится запись с diff. Результаты SCA смотрим в Endpoints Summary → агент → SCA — там score по политике CIS. Убираем тестовый файл, дожидаемся правила 551 — контур замкнулся.
Итог
Агенты — это глаза Wazuh, и подключаются они за минуты: репозиторий, env-переменные, ключ. Реальная работа — не «включить FIM», а вырезать из него шум: короткие списки путей, ignore для вечных изменщиков, nodiff для секретов, whodata на горстке действительно критичных каталогов, SCA под ваш дистрибутив. Час настройки отделяет бесконечный поток алертов о безобидных изменениях файлов от единиц событий, на которые хочется реагировать. В следующей части — кастомные правила и декодеры: что делать, когда стандартные 550 и 553 говорят «файл изменился», а вам нужно «кто-то получил права root».