Перейти к содержанию
Обсудить задачу →
Статьи и инструкции

Аудит Linux с auditd: правила, поиск событий и контроль потерь

Настройка auditd: ограниченные правила, ausearch, auid, постоянная загрузка, тесты, контроль lost и backlog, хранение и возврат.
Аудит Linux с auditd: правила, поиск событий и контроль потерь — техническая иллюстрация

auditd отвечает на вопрос «кто и каким процессом изменил объект», а не заменяет журнал приложения или мониторинг нагрузки. Для полезного аудита нужны точные правила, проверка события и контроль потерь. Ниже — процедура для Debian/Ubuntu на 64-битной системе: от лабораторного каталога до постоянных правил для конфигураций.

Аудит Linux: состояние ядра, ограниченные правила, тестовое событие, поиск по ключу и контроль потерь
Порядок проверки и настройки. Команды, ограничения и диагностика приведены в статье.

1. Определите задачу и доступные права

Архитектура: от syscall до расследования

Linux Audit — подсистема ядра и набор userspace-инструментов. Правила ядра выбирают интересующие операции; записи проходят через очередь и netlink в auditd; daemon сохраняет их в audit.log и может передавать плагинам. auditctl управляет runtime, augenrules собирает постоянные правила, ausearch реконструирует события, aureport строит отчёты. journald/syslog и audit.log не взаимозаменяемы: сообщение приложения и событие системного вызова фиксируют разные факты.

Правило файлового аудита сообщает о доступе/изменении объекта, но не хранит дифф его содержимого. FIM, backup, git для конфигураций и аудит дополняют друг друга. SIEM связывает событие с другими источниками, но не восстановит запись, потерянную до попадания в auditd. Поэтому полноценная настройка включает отбор, доставку, хранение, контроль потерь и процедуру поиска.

Модель угроз и стенд

Рецепты ниже рассчитаны на Debian 13 с systemd и x86_64, для b64-процессов. Для Ubuntu пути в целом сходны; RHEL/Alma/Rocky могут отличаться процедурой управления сервисом и расположением плагинов. На ARM не копируют автоматически b32-пары x86. Нужны sudo, консоль и отдельная тестовая VM. В immutable-режиме изменение возможно только через плановую перезагрузку с заранее подготовленной конфигурацией.

Сначала выберите расследуемые вопросы: кто изменил sudoers, какая login identity запустила root-команду, какой процесс поменял systemd unit, почему был отказ доступа. Затем для каждого вопроса определите событие, поля, ключ, допустимую нагрузку и срок хранения. Универсальный аудит каждого read/write всего сервера обычно даёт поток, который невозможно полезно разобрать.

Сохраните состояние без раскрытия содержимого секретов

sudo install -d -o root -g root -m 700 /root/avg-audit-backup
sudo cp -a /etc/audit /root/avg-audit-backup/audit-before
sudo sh -c 'auditctl -s > /root/avg-audit-backup/status-before.txt'
sudo sh -c 'auditctl -l > /root/avg-audit-backup/runtime-before.txt'
findmnt /var/log/audit
uname -r

Каталог backup должен быть новым либо содержать отдельно датированную копию; повторный cp поверх истории не заменяет версионирование. Сохраняем настройки и правила, не копируем /etc/shadow в публичный отчёт. Для расследования важны версия ядра, архитектура, boot и локальное время: event serial может повторяться после перезагрузки.

Выберите конкретные объекты: SSH-конфигурация, локальные учётные записи, sudoers или настройки важного сервиса. Правило «логировать все системные вызовы» создаёт огромный поток и затрудняет поиск. Для каждой группы событий задайте ключ, срок хранения и ответственного за разбор.

Аудит ядра хоста не равен запуску auditd внутри обычного контейнера. Контейнер может не иметь CAP_AUDIT_CONTROL и не управляет отдельным независимым ядром. Настройку выполняют на хосте; контейнерный процесс затем связывают с событиями доступными средствами среды.

Перед изменениями сохраните действующие /etc/audit и список runtime-правил в закрытый backup. Команда auditctl требует административных прав. В production сначала определите, кто управляет аудитом: вручную, конфигурационным менеджером, агентом защиты или централизованным профилем. Параллельные источники правил могут перезаписывать друг друга.

2. Установите auditd и проверьте состояние

sudo apt-get update
sudo apt-get install auditd
systemctl status auditd --no-pager
sudo auditctl -s
sudo auditctl -l
uname -m

В auditctl -s важны enabled, pid, lost и backlog. enabled=1 означает включённый изменяемый аудит, enabled=2 — immutable; изменить правила до перезагрузки нельзя. pid=0 означает отсутствие работающего userspace daemon. lost — накопленный счётчик потерянных записей, backlog — текущая очередь.

Документация auditctl объясняет эти поля. Не обнуляйте lost перед фиксацией исходного состояния. Ненулевое историческое значение требует сравнения динамики; рост во время теста показывает актуальную потерю. Если встретилось правило never,task или другие исключения, сначала выясните их владельца и влияние — новое exit-правило может не дать ожидаемых событий.

Прочитайте состояние, прежде чем добавлять правила

enabled 1
failure 1
pid 742
rate_limit 0
backlog_limit 8192
lost 0
backlog 0

Это пример формата, не результат измерения вашего сервера. enabled=1 допускает изменение, 2 блокирует его до reboot, 0 означает отключенный аудит. failure задаёт поведение при сбоях подсистемы, pid относится к daemon. rate_limit=0 снимает ограничение скорости ядра, но не даёт бесконечной производительности записи. backlog_limit — предел очереди, backlog — её текущая занятость, lost — счётчик потерянных записей.

Если enabled=2, сначала согласуйте перезагрузку и изменение профиля, а не пробуйте многократную загрузку. Если pid=0, разберите журнал auditd и конфигурацию. Если lost увеличивается, успешный поиск одного события не подтверждает полноту аудита. Не сбрасывайте lost перед замером: значение до/после и время интервала дают диагностический смысл.

Найдите конфликтующие исключения

sudo auditctl -l
sudo grep -R -n -- 'never,task\|never,exit\|-e 2' /etc/audit/rules.d
systemctl cat auditd

never,task может отключать syscall-аудит для новых tasks; более ранние never-правила влияют на результат отбора. Разберитесь, какой профиль создал исключение. Если владелец подтверждает удаление именно default -a never,task в пилоте, точное runtime-действие — sudo auditctl -d never,task; соответствующую постоянную строку меняют отдельной управляемой правкой. Не используйте глобальный -D ради того, чтобы увидеть тестовый event. Существующие процессы и особенности среды требуют повторной проверки после изменения.

3. Создайте минимальное лабораторное правило

Пример ниже предназначен для 64-битных процессов и каталога /srv/audit-lab, который создаётся специально для теста. Сначала убедитесь, что он не используется приложением. Используется syscall-фильтр dir/perm; старый краткий синтаксис -w поддерживается, но для новых конфигураций предпочтителен более явный фильтр.

sudo install -d -m 700 /srv/audit-lab
sudo auditctl -a always,exit -F arch=b64 -F dir=/srv/audit-lab -F perm=wa -F key=avg_lab
sudo auditctl -l -k avg_lab
sudo touch /srv/audit-lab/probe.txt
sudo chmod 600 /srv/audit-lab/probe.txt
sudo ausearch -k avg_lab -ts recent -i

perm=w отслеживает записи, perm=a — изменения атрибутов. Ключ объединяет события по назначению. Каталог должен существовать при загрузке правила. Фильтр не следует считать автоматическим охватом любых будущих файловых систем, смонтированных под ним: переходы и bind mounts проверяют отдельно.

Если событий нет, проверьте runtime-правило, исключения, immutable, реальный путь и архитектуру процесса. Для 32-битных программ на поддерживающем их x86_64-хосте потребуется отдельное arch=b32 правило. Не копируйте его без проверки поддержки на любой ARM-сервер.

Разберите правило по полям

-a always,exit добавляет правило в список проверки выхода из syscall. -F arch=b64 выбирает таблицу системных вызовов нужной архитектуры. dir ограничивает дерево каталога, perm=wa — запись и изменение атрибутов, key помечает событие для поиска. В таком файловом фильтре auditctl подбирает нужные syscalls по perm; arch указывают раньше их выбора. Для отдельного syscall -S пишут после arch.

Фильтрация path/dir эффективнее бесконтрольного аудита всего openat. Каталог должен существовать. При bind mount, отдельной смонтированной файловой системе и контейнерном mount namespace фактическое покрытие подтверждают экспериментом. Аудит дерева не означает автоматическое покрытие всего содержимого любого будущего mount под этим путём. Семантика правил — в документации проекта Linux Audit.

Сравните syscall и файловую операцию

Один touch может выполнить несколько системных вызовов; chmod может породить другое событие с тем же key. Количество строк audit.log не равно количеству действий пользователя. Для теста разделите создание и изменение атрибутов, отметьте время и ищите полные события, а не только PATH. Ошибка Operation not permitted при auditctl может быть следствием immutable или отсутствия CAP_AUDIT_CONTROL, а не неверного каталога.

4. Прочитайте событие как связанную группу записей

Одно действие может породить SYSCALL, PATH, CWD и PROCTITLE с общим event id. Отдельная строка PATH без остальных записей не показывает всю операцию. ausearch связывает их по событию; -i преобразует часть числовых значений в удобные имена.

Обращайте внимание на success, exit, syscall, exe, pid, uid/euid и auid. uid/euid показывают текущие права процесса, auid — исходную login identity, если она назначена. После sudo текущий euid может быть root, а auid сохранять личность вошедшего пользователя. Для сервисов auid может быть unset: не приписывайте их запуск конкретному сотруднику автоматически.

sudo ausearch -k avg_lab -ts recent --raw
sudo ausearch -k avg_lab -ts recent -i
sudo aureport -f --summary -i

События фиксируют метаданные операции, не обязательно прежнее и новое содержимое файла. Для восстановления текста нужен backup или управление конфигурацией. В PROCTITLE и аргументах процессов могут быть чувствительные данные; пароли не передают в командной строке, а доступ к аудиту ограничивают.

Пример события с разбором каждого поля

type=SYSCALL msg=audit(1791691200.123:812): arch=c000003e syscall=257 success=yes exit=3 ppid=1700 pid=1701 auid=1000 uid=0 gid=0 euid=0 tty=pts0 exe="/usr/bin/touch" key="avg_lab"
type=CWD msg=audit(1791691200.123:812): cwd="/home/admin"
type=PATH msg=audit(1791691200.123:812): item=0 name="/srv/audit-lab/probe.txt" inode=12345 nametype=CREATE

Вывод иллюстративный, часть полей опущена. Общие timestamp и serial 812 связывают записи. arch=c000003e соответствует x86_64; syscall=257 в этой таблице — openat. При success=yes exit=3 означает возвращённый дескриптор, а не код ошибки 3. При неудаче exit может быть отрицательным errno, например -13/EACCES. ausearch -i интерпретирует значения, но исходные --raw сохраняют для доказательств.

uid/euid=0 означает текущий root-контекст, auid=1000 — исходную login identity, сохранённую после sudo при правильной настройке входа. Поле unset не обозначает «анонимного злоумышленника»: так могут работать штатные daemon. exe — исполняемый файл процесса, comm — короткое имя, PROCTITLE/EXECVE — аргументы. Ни одно отдельное поле не устанавливает личность человека без сопоставления с SSH/PAM, временем и источником подключения.

sudo ausearch -a 812 -ts today --raw
sudo ausearch -k avg_lab -ts today -m SYSCALL -i
sudo aureport --login --summary -i
sudo aureport --executable --summary -i

812 заменяют serial конкретного теста. Ищите в ограниченном интервале и с известного хоста/boot: serial не является глобальным UUID. -m фильтрует типы, поэтому для сохранения полного события после нахождения serial повторите поиск без такого ограничения. Отчёт --executable показывает частоту исполняемых файлов, а не автоматически вердикт вредоносности.

Чего не видно в событиях

Audit не гарантирует запись содержимого файла, вывода программы и всех данных сетевой сессии. Аргументы shell-команды могут раскрывать секреты, поэтому даже без TTY-аудита журнал требует ограничений доступа. Не передавайте API-токен через curl -H в общей командной строке, если этот exec собирается централизованно. Для разбора сохраняют оригинал в закрытый архив, наружу предоставляют редактированную копию.

5. Подготовьте постоянные правила для конфигураций

После успешного лабораторного теста создайте отдельный root-owned файл /etc/audit/rules.d/50-avg-config.rules. До записи проверьте наличие всех путей. Для Debian/Ubuntu можно использовать следующий профиль 64-битных процессов:

-a always,exit -F arch=b64 -F path=/etc/passwd -F perm=wa -F key=avg_accounts
-a always,exit -F arch=b64 -F path=/etc/group -F perm=wa -F key=avg_accounts
-a always,exit -F arch=b64 -F path=/etc/shadow -F perm=wa -F key=avg_accounts
-a always,exit -F arch=b64 -F path=/etc/gshadow -F perm=wa -F key=avg_accounts
-a always,exit -F arch=b64 -F path=/etc/sudoers -F perm=wa -F key=avg_privileges
-a always,exit -F arch=b64 -F dir=/etc/sudoers.d -F perm=wa -F key=avg_privileges
-a always,exit -F arch=b64 -F dir=/etc/ssh -F perm=wa -F key=avg_ssh

Профиль намеренно не исключает uid=0 и auid=unset: изменение конфигураций сервисом или root тоже важно. Это не глобальный аудит исполнения всех команд. Проверка только чтения shadow в данный профиль не входит; добавление perm=r резко меняет объём и требует отдельной оценки.

Изменяемый файл базы учётных записей может быть заменён новым inode при штатной операции. Поэтому после реального изменения и обновления пакетов проверяйте фактическое событие, а не только наличие текстовой строки правила. Ключи avg_* помогают отличить ваш профиль от чужого.

Добавьте контролируемый аудит привилегированных действий

Следующие строки — отдельный расширенный профиль x86_64, дополняющий наблюдение конфигураций. UID_MIN сначала получите через awk '$1=="UID_MIN" {print $2}' /etc/login.defs; в примере он 1000. Для SSSD/AD диапазон и фактический auid проверяют отдельно.

-a always,exit -F arch=b64 -S execve,execveat -F euid=0 -F auid>=1000 -F auid!=unset -F key=avg_root_exec
-a always,exit -F arch=b64 -F dir=/etc/systemd/system -F perm=wa -F key=avg_systemd
-a always,exit -F arch=b64 -F dir=/etc/cron.d -F perm=wa -F key=avg_cron
-a always,exit -F arch=b64 -F path=/etc/crontab -F perm=wa -F key=avg_cron

Exec-правило ловит root-execution из пользовательской login session. Оно не охватывает прямой вход root с auid=0 и сервисы с unset: это сознательный отбор, который надо отразить в модели угроз. Для прямого root-входа нужен дополнительный профиль, а лучше исключить такой вход организационно. Оно фиксирует аргументы, поэтому перед массовым включением оцените чувствительность и объём событий. Повседневный sudo -l может дать события, но не подтверждает выполнение разрешённого задания.

Для отслеживания cron spool на Debian отдельно проверяют путь /var/spool/cron/crontabs и существование каталога. Unit может быть установлен в /usr/lib/systemd/system, а runtime-создание — в /run/systemd/system: только /etc недостаточно для полного вопроса о persistence. Дополнительные директории выбирают по вашей ОС, не считают приведённые четыре строки исчерпывающими.

Отслеживайте отказ доступа в узкой области

-a always,exit -F arch=b64 -S openat -F dir=/srv/audit-lab -F exit=-EACCES -F key=avg_denied
-a always,exit -F arch=b64 -S openat -F dir=/srv/audit-lab -F exit=-EPERM -F key=avg_denied

Эти правила ограничены тестовым деревом. Они не поймают любой отказ любого syscall: программу, использующую openat2 или другой способ доступа, проверяют отдельно по поддерживаемой таблице syscalls. EACCES и EPERM не взаимозаменяемы. Для глобального расследования можно временно расширить отбор, но сначала замеряют поток; постоянный аудит всех неуспешных openat на нагруженном сервере может оказаться дорогим.

Почему нужны b32-пары и когда они лишние

На x86_64 32-битный процесс использует другую таблицу syscall numbers. Если приложение реально использует compat ABI, добавьте соответствующие b32-строки после проверки поддержки. Пара b64+b32 не нужна только потому, что процесс «старый»: проверьте бинарник через file и реальное событие. На архитектуре без этого ABI неподдерживаемая строка может сорвать загрузку профиля.

6. Загрузите правила и проверьте постоянство

Сохраните копию прежнего файла, если он уже существовал, и установите владельца root:root, режим 600. augenrules собирает несколько .rules в общий набор. Его справка описывает порядок обработки; директивы -D и -e могут влиять на итоговую загрузку.

sudo chown root:root /etc/audit/rules.d/50-avg-config.rules
sudo chmod 600 /etc/audit/rules.d/50-avg-config.rules
sudo augenrules --check
sudo auditctl -s
sudo augenrules --load
sudo auditctl -l

Перед --load изучите действующий общий профиль и исключения. Не вставляйте в свой файл -D: это удалит чужие правила. Не добавляйте -e 2 на этапе пилота: immutable потребует перезагрузки для дальнейших изменений. Загрузка при immutable будет отвергнута; обходить это отключением защиты нельзя.

После согласованной перезагрузки стенда повторите auditctl -l и лабораторный тест. Runtime-правило, добавленное вручную, исчезает после перезапуска; постоянный .rules должен восстановиться штатной загрузкой. Для систем, использующих иной загрузчик, следуют именно его процедуре, не создают второй независимый механизм.

Проверьте сборку правил, а не только свой файл

sudo augenrules --check
sudo sed -n '1,220p' /etc/audit/audit.rules
sudo auditctl -s
sudo augenrules --load
sudo auditctl -l -k avg_accounts
sudo auditctl -l -k avg_root_exec

augenrules собирает .rules в установленном порядке и специально обрабатывает управляющие директивы. --check показывает различие конфигурации, но не является полноценным dry-run всех syscalls ядра. После --load обязательно смотрят код возврата, журнал и runtime. Ошибка «path does not exist» требует исправить путь или подготовить выбранный объект; нельзя игнорировать последующую неполную загрузку.

Если действующий полный профиль содержит -D, его очередная загрузка может очистить runtime и восстановить только собранные файлы. Это допустимо лишь как процедура владельца всего профиля, не как незаметный побочный эффект добавления одной статьи. Сравните сохранённые runtime-before с новым списком и убедитесь, что чужие правила не исчезли.

Immutable -e 2 включают последним после приёмки и подготовки следующего окна изменения. Он затрудняет изменение правил из работающей системы, но не делает root-компрометацию невозможной и не защищает диск от offline-изменения. Kernel audit=1 помогает охвату ранней загрузки; изменение cmdline, audit_backlog_limit и reboot относится к отдельной подготовке хоста, не к повседневной загрузке .rules.

7. Выполните позитивный и негативный тест

Для лаборатории проверьте запись и chmod внутри наблюдаемого каталога, затем запись в отдельный необслуживаемый каталог. Под ключом avg_lab должно появляться первое действие; второе не должно порождать событие именно этого ключа. Иные действующие правила могут его зарегистрировать — это нормально.

Для production-конфигураций тест проводится штатным согласованным изменением, например через управляемую настройку сервиса. Не меняйте shadow ради «проверки логирования» и не создавайте случайный sudoers-файл. Проверяйте время, exe, результат и идентичность инициатора; события успеха и отказа не смешивайте.

Если аудит не охватывает 32-битный клиент, добавьте необходимую b32-пару только на поддерживаемой архитектуре и повторите тест. Если пользователь приходит через SSSD/LDAP, локальный /etc/passwd не отражает изменения каталога: аудит хоста и аудит AD решают разные задачи.

Воспроизводимый позитивный и негативный сценарий

sudo touch /srv/audit-lab/avg-positive.txt
sudo chmod 640 /srv/audit-lab/avg-positive.txt
sudo install -d -m 700 /srv/audit-outside
sudo touch /srv/audit-outside/avg-negative.txt
sudo ausearch -k avg_lab -ts recent -i
sudo auditctl -s

В avg_lab ожидаются positive и chmod, но не negative. Проверяйте полное имя PATH и exe, а не только количество событий: во время теста могут происходить другие операции. Запись negative может появиться под иным ключом действующего профиля — это не ошибка лабораторного фильтра. Поток должен иметь связные группы записей, success=yes и ожидаемый путь.

Для проверки auid зайдите на VM по SSH личным тестовым пользователем и выполните через sudo безвредный touch в лаборатории. В событии ожидаются euid=0 и auid этого пользователя. Запуск из cron или root-консоли не воспроизводит этот путь. Негативный тест denied требует закрытого каталога и чтения из непривилегированного контекста; делайте его на отдельном каталоге, не лишайте прав приложение.

После теста снимите lost/backlog повторно, сравните с исходным состоянием и убедитесь в доставке на collector. Вывод no matches может означать неверный временной фильтр/ключ, отсутствие события или неработающий аудит; он сам по себе не говорит, какой из вариантов верен.

8. Настройте хранение и контроль заполнения

В /etc/audit/auditd.conf оцените log_file, max_log_file, num_logs, max_log_file_action и действия при нехватке места. Политика ROTATE оставляет ограниченное число файлов, KEEP_LOGS может заполнить раздел, а остановка/перевод системы в аварийный режим влияет на доступность. Справка auditd.conf нужна для осознанного выбора.

Не задавайте универсально disk_full_action=HALT или kernel failure mode=panic для обычного файлового сервера. Это проектное решение по модели угроз и доступности, а не обязательный флаг каждого аудита. Уведомления о заполнении и потерях должны приходить до критической стадии.

df -h /var/log/audit
sudo du -sh /var/log/audit
sudo auditctl -s
sudo journalctl -u auditd --since '-1 hour' --no-pager

Контролируйте рост lost между измерениями, backlog в нагрузке, свободное место и возраст последнего события. Зелёный service auditd не доказывает отсутствие потерь. Оповещение только о заполнении диска пропускает переполнение очереди ядра.

Рассчитайте хранение и настройте действия при заполнении

Сначала замерьте суточный объём под типичной нагрузкой и при обновлениях. Если поток 50 MiB/час, сутки дадут примерно 1,2 GiB; семь суток — 8,4 GiB без запаса. Число строк в минуту не заменяет байтовый объём: одно exec может иметь длинные аргументы. Выделите отдельную ёмкость, запас для недоступного collector и пороги оповещения.

Пример лабораторного, ограниченного хранением профиля для отдельного раздела не менее нескольких GiB:

log_file = /var/log/audit/audit.log
log_format = RAW
flush = INCREMENTAL_ASYNC
freq = 50
max_log_file = 128
num_logs = 8
max_log_file_action = ROTATE
space_left = 1024
space_left_action = SYSLOG
admin_space_left = 512
admin_space_left_action = SYSLOG
disk_full_action = SUSPEND
disk_error_action = SYSLOG

Значения размеров — MiB по документации выбранной версии. Восемь файлов по 128 MiB дают примерно 1 GiB локального бюджета, не семь суток для приведённого потока. SYSLOG лишь сообщает; если оповещения не собираются, политика фактически молчит. SUSPEND при полном диске останавливает запись аудита, поэтому это явный компромисс лаборатории; production определяет, допустимо ли продолжить обслуживание без аудита или требуется аварийная остановка. Документация параметров — auditd.conf.

После изменения перечитайте настройки поддерживаемым способом вашей версии (sudo auditctl --signal reload, если эта опция присутствует в локальной man-странице), проверьте журнал и состояние. В некоторых дистрибутивах auditd запрещает обычный systemctl restart и требуется штатный service wrapper. Не выключайте защиту сервиса для обхода этой процедуры.

Контролируйте очередь и потери

Снимайте auditctl -s при нормальной и пиковой нагрузке. Рост backlog показывает задержку обработки; рост lost — уже потерянные записи. Увеличение backlog_limit даёт буфер, но не ускоряет диск и collector. Rate limit может ограничить нагрузку ценой потерь. Failure mode panic влияет на доступность всего хоста и выбирается только осознанно, а не как обязательный «hardcore» флаг.

9. Передавайте события и сохраняйте проверяемость

Централизованный сбор уменьшает зависимость расследования от скомпрометированного хоста. Используйте поддерживаемый вашей системой агент или audisp-плагин с проверенным транспортом и аутентификацией. Локальная копия должна сохраняться в соответствии с политикой даже при недоступном collector.

Сквозной тест: создать известное лабораторное событие, найти его локально, затем на collector по хосту, ключу, времени и event id. Проверьте часовой пояс и синхронизацию времени. Склейка отдельных строк без общего event id может исказить контекст.

Шифрование сети не делает архив неизменяемым. Для важных журналов отдельно проектируют права, срок хранения и защиту удаления на сервере сбора. Не включайте запись TTY «для полноты» без оценки: она может захватывать ввод, который не должен попасть в общий журнал.

Пример центрального сбора существующим Wazuh-agent

Если на стенде уже установлен и зарегистрирован Wazuh-agent, проверьте, нет ли такого источника в ossec.conf или центральной конфигурации. Внутри существующего ossec_config добавьте один localfile:

<localfile>
  <log_format>audit</log_format>
  <location>/var/log/audit/audit.log</location>
</localfile>

Формат audit предназначен для этого журнала; описание — справочник Wazuh localfile. После проверки XML и backup конфигурации перезапустите только агент и изучите /var/ossec/logs/ossec.log. Это дополнение к уже действующему сбору, не полный мастер установки SIEM. Доступ агента к журналу должен быть предусмотрен его моделью прав; chmod 777 audit.log не является решением.

sudo systemctl restart wazuh-agent
sudo systemctl status wazuh-agent --no-pager
sudo tail -n 40 /var/ossec/logs/ossec.log
sudo touch /srv/audit-lab/avg-collector-test.txt
sudo ausearch -k avg_lab -ts recent --raw

На collector найдите event по hostname/agent, key, времени и serial, сопоставьте PATH и SYSCALL. Не каждый полученный event становится alert: правила корреляции и хранение всех событий на менеджере настраиваются отдельно. Отсутствие предупреждения в dashboard не доказывает отсутствие доставки. Для проверки разбора используют существующую процедуру logtest менеджера и исходный sample без секретов.

Испытайте недоступность collector

На отдельном стенде временно оборвите только канал агента, создайте несколько маркеров, восстановите канал и проверьте, какие события дошли и как изменились локальные очереди. Не предполагается бесконечная offline-буферизация. Локальная ротация может удалить исходные события раньше восстановления. audisp-remote — альтернативный путь со своей очередью, аутентификацией и транспортом; его параметры не взаимозаменяемы с Wazuh.

Для защищённого архива нужны отдельные права удаления, сроки хранения, резервная копия и проверка целостности. Один SHA256 фиксирует текущее содержимое, но не доказывает, что до его вычисления журнал не меняли. Доверие к доказательству строится на цепочке получения и хранении вне контролируемого подозреваемым хоста.

10. Возврат правил и приёмка

Для удаления лабораторного runtime-правила используйте точное обратное действие, сохранив все параметры:

sudo auditctl -d always,exit -F arch=b64 -F dir=/srv/audit-lab -F perm=wa -F key=avg_lab
sudo auditctl -l -k avg_lab

Для постоянного профиля восстановите исходный принадлежащий вам файл и согласованно перезагрузите правила. Не используйте auditctl -D без ограничения и анализа полного профиля: это затронет весь аудит. В immutable-режиме планируют допустимую перезагрузку; конфигурацию нельзя изменить незаметным обходом.

Приёмка включает сохранение правил после reboot, правильное тестовое событие, отсутствие роста lost, проверку заполнения и доставку на collector. В результате должен получиться управляемый журнал действий, а не просто установленный пакет auditd.

Приёмка и безопасное сопровождение

Сохраните таблицу покрытия: вопрос → правило → положительный тест → отрицательный тест → ключ → срок хранения. Для root execution отдельно запишите исключения auid=0/unset и compat ABI. Для файлового аудита отметьте отдельные mounts и пути. После обновления auditd/ядра повторите несколько контрольных сценариев: парсер, поддержка syscall и загрузчик правил могут измениться.

Возврат собственного постоянного файла не всегда удаляет его уже загруженные runtime-правила. Поэтому сначала фиксируют текущий профиль, удаляют точные принадлежащие пилоту правила обратными -d-командами либо используют согласованную загрузку владельца полного профиля. В immutable готовят файлы и плановую перезагрузку. Нельзя просто удалить .rules и объявить аудит возвращённым.

Результат качественной настройки — объяснимое событие с корректной login identity и путём, сохранённое локально и централизованно, измеренный поток без роста lost и воспроизводимая процедура изменения. Установленный пакет, зелёный service и большой набор правил отдельно не дают этой гарантии.