Зачем auditd
Когда нужен ответ "кто/когда/что прочитал/изменил" с криминалистической точностью, Linux audit subsystem (kauditd в ядре + auditd в userspace). Сценарии:
- Compliance (PCI-DSS, HIPAA, GDPR, ФЗ-152): обязательное логирование доступа к чувствительным файлам
- Forensics после взлома: что именно изменил атакующий
- Insider threat: кто из админов читал кадровую базу
- Дебаг "файл вдруг исчез": какой процесс его удалил
- SELinux AVC denials: связан с audit.log
Не для общего логирования, для точечного targeted-watch'а. Без правил auditd по дефолту записывает только login-события.
Архитектура
┌──────────────┐
│ userspace │
│ ┌────────┐ │
│ │auditd │ │ ←─── netlink ───┐
│ └────────┘ │ │
│ │ │ │
└───────┼──────┘ │
│ /var/log/audit/audit.log │
│
┌───────▼──────────────────────────┴────┐
│ kernel │
│ ┌──────────┐ ┌──────────────┐ │
│ │ kauditd │◄───│ audit_filter │◄── syscall enter/exit
│ └──────────┘ └──────────────┘ │
│ │
└───────────────────────────────────────┘
- Ядро на каждый syscall проверяет audit-rule. Если match → событие в очередь к kauditd.
- kauditd (kernel-thread) шлёт по netlink в userspace.
- auditd (PID-1-launched, единственный читатель netlink-сокета)
форматирует и пишет в
/var/log/audit/audit.log. - При падении auditd, failure mode:
panic(kernel panic),printk(в dmesg),silent(молча).
Установка
apt install auditd # Debian/Ubuntu
dnf install audit # RHEL
systemctl enable --now auditd
Конфиг, /etc/audit/auditd.conf:
log_file = /var/log/audit/audit.log
log_format = ENRICHED # включает имена UID, ports, etc
max_log_file = 100 # MB
num_logs = 10 # ротация
space_left = 1000 # MB free
space_left_action = email
admin_space_left_action = halt # halt сервера если совсем нет места
disp_qos = lossy # при overload, дропать (vs lossless = блокировать syscall)
Production: space_left_action = email или syslog. Никогда halt
если не понимаешь зачем.
auditctl, правила в runtime
Два типа правил:
File watches -w
auditctl -w /etc/passwd -p wa -k passwd-changes
auditctl -w /etc/shadow -p rwa -k shadow-access
auditctl -w /etc/sudoers -p wa -k sudoers-changes
auditctl -w /etc/ssh/sshd_config -p wa -k sshd-config-changes
auditctl -w /var/log/audit/ -p wa -k audit-log-access
Permissions:
r, readw, writex, executea, attribute change (chmod, chown, setxattr)
-k KEY, метка для поиска через ausearch.
Syscall rules -a
# Любой exec
auditctl -a always,exit -F arch=b64 -S execve -k exec-events
# Любой chmod/chown
auditctl -a always,exit -F arch=b64 -S chmod -S fchmod -S fchmodat -k perm-changes
# Удаление файлов выходящих юзером
auditctl -a always,exit -F arch=b64 -S unlink -S unlinkat -F auid>=1000 -F auid!=4294967295 -k user-deletes
always,exit, логировать на возврате из syscall (есть exit-code)arch=b64, для 64-битных syscall'ов (у 32-битных,b32)-S, конкретный syscall-F, фильтр по полю (auid, uid, pid, и т.д.)auid, audit UID (изначальный, не подменяется sudo)
Постоянные правила
Runtime-правила теряются при перезагрузке. Постоянные, в
/etc/audit/rules.d/*.rules:
# /etc/audit/rules.d/audit.rules
-D # очистить все
-b 8192 # buffer size
-f 1 # failure mode: 1=printk
# File watches
-w /etc/passwd -p wa -k identity
-w /etc/group -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/sudoers -p wa -k identity
-w /etc/sudoers.d/ -p wa -k identity
-w /etc/ssh/sshd_config -p wa -k sshd
# Critical syscalls
-a always,exit -F arch=b64 -S execve -F auid>=1000 -F auid!=-1 -k user-exec
-a always,exit -F arch=b64 -S adjtimex -S settimeofday -k time-change
# Network config
-w /etc/sysconfig/network-scripts/ -p wa -k network-config
-w /etc/hosts -p wa -k network-config
# Make immutable: после загрузки правил никто не сможет их изменить
-e 2
augenrules --load # загрузить все *.rules
auditctl -l # текущие активные
-e 2 (immutable), последняя строка. После неё только перезагрузка
меняет правила. Безопасность от tampering.
ausearch, поиск событий
# Все по ключу
ausearch -k passwd-changes
# Конкретный юзер
ausearch -ua alice
ausearch -ui 1001 # по UID
# За промежуток времени
ausearch -ts today # сегодня
ausearch -ts yesterday -te now
ausearch -ts 06/01/2026 12:00:00
# По типу события
ausearch -m USER_LOGIN # USER_LOGIN, USER_AUTH, EXECVE, CWD, PATH, AVC...
ausearch -m AVC # SELinux denials
# По файлу
ausearch -f /etc/passwd
# PID
ausearch -p 12345
# Сводка
ausearch -k passwd-changes --interpret # человекочитаемые UID, syscall name
Pipe в aureport для агрегации:
ausearch -m USER_LOGIN -ts today | aureport --login -i
aureport, отчёты
aureport # сводка
aureport --login # успешные/неуспешные логины
aureport --auth # auth-события
aureport --executable # топ исполняемых
aureport --file --summary -i # топ accessed files
aureport --user # активность по UID
aureport --pid # активность по PID
aureport --auth --failed --interpret # все failed-auth
Пример: insider-threat detection
Хочешь логировать кого читает /etc/shadow:
auditctl -w /etc/shadow -p r -k shadow-read
Через час:
ausearch -k shadow-read -i | grep -A2 SYSCALL | grep -oP 'auid=\d+ uid=\d+'
Если кто-то открыл shadow без явной причины, есть запись.
Производительность
Audit добавляет overhead на каждый matched-syscall. Правила должны быть точечными:
| Правило | Overhead |
|---|---|
-w /etc/passwd -p wa | минимальный (write/attr - редко) |
-a always,exit -S execve -F auid>=1000 | низкий (exec'и редко) |
-a always,exit -S read (без фильтров) | убийственный (read = бешено часто) |
-a always,exit -S openat -F dir=/var | средний (зависит от нагрузки) |
Не пиши открытые правила без -F фильтров. Тестируй на dev-окружении.
SELinux AVC и audit
Когда [[selinux-apparmor|SELinux]] что-то запрещает, событие пишется
в audit.log как AVC denial:
ausearch -m AVC -ts recent
→ видно, что именно сработало. Дальше, audit2allow:
ausearch -m AVC -ts recent | audit2allow -M my-fix
semodule -i my-fix.pp # загрузить policy module
Подробнее в selinux-policy.
Когда что-то пошло не так
auditctl -lпуст, правила не загружены.augenrules --loadилиsystemctl restart auditd.- Не работает
auditctl -e 2, kernel-configCONFIG_AUDITSYSCALL=yотсутствует. Проверьcat /proc/sys/kernel/audit_enabled. - audit.log распух за день, слишком открытое правило.
aureport --summaryпокажет топ событий, рефактори правила. auditctl: failed to set rule, правила immutable (-e 2уже был). Только reboot позволит изменить.ausearch: no matches, события вообще не пишутся. Проверьauditdзапущен и/var/log/audit/audit.logрастёт. Если файла нет, права 600/dir 700, owner root.- Перформанс упал после auditd, глобальный read-rule. Удалить.
- Нет ENRICHED, старая версия. Без
log_format = ENRICHEDUID, числа, без resolve. Обновиauditпакет.
Альтернативы
- eBPF + bpftrace, для дебага без правил, не для compliance
- fapolicyd / fanotify, file-access policy, дополняет auditd
- Falco / sysdig, userspace tracing для контейнеров
- OSSEC / Wazuh, file integrity monitoring + alerting сверх auditd