# auditd - syscall и file audit _Безопасность · LinuxLab Knowledge Base_ **TL;DR:** auditd пишет события ядра в /var/log/audit/audit.log: file watches (-w), syscall rules (-a), exec'и. ausearch для поиска, aureport для отчётов. Основа compliance (PCI-DSS, HIPAA, ФЗ-152). ## Зачем 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` (молча). ## Установка ```bash apt install auditd # Debian/Ubuntu dnf install audit # RHEL systemctl enable --now auditd ``` Конфиг, `/etc/audit/auditd.conf`: ```ini 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` ```bash 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`, read - `w`, write - `x`, execute - `a`, attribute change (chmod, chown, setxattr) `-k KEY`, метка для поиска через ausearch. ### Syscall rules `-a` ```bash # Любой 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 ``` ```bash augenrules --load # загрузить все *.rules auditctl -l # текущие активные ``` `-e 2` (immutable), последняя строка. После неё **только перезагрузка** меняет правила. Безопасность от tampering. ## ausearch, поиск событий ```bash # Все по ключу 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` для агрегации: ```bash ausearch -m USER_LOGIN -ts today | aureport --login -i ``` ## aureport, отчёты ```bash 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`: ```bash auditctl -w /etc/shadow -p r -k shadow-read ``` Через час: ```bash 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`: ```bash ausearch -m AVC -ts recent ``` → видно, что именно сработало. Дальше, `audit2allow`: ```bash ausearch -m AVC -ts recent | audit2allow -M my-fix semodule -i my-fix.pp # загрузить policy module ``` Подробнее в [selinux-policy](/kb/selinux-policy.md). ## Когда что-то пошло не так - **`auditctl -l` пуст**, правила не загружены. `augenrules --load` или `systemctl restart auditd`. - **Не работает `auditctl -e 2`**, kernel-config `CONFIG_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 = ENRICHED` UID, числа, без resolve. Обнови `audit` пакет. ## Альтернативы - **eBPF + bpftrace**, для дебага без правил, не для compliance - **fapolicyd / fanotify**, file-access policy, дополняет auditd - **Falco / sysdig**, userspace tracing для контейнеров - **OSSEC / Wazuh**, file integrity monitoring + alerting сверх auditd ## Команды ```bash auditctl -l ``` Все активные audit-правила в данный момент ```bash auditctl -w /etc/sudoers -p wa -k sudoers-changes ``` Watch на изменение sudoers - классический compliance-rule ```bash ausearch -k sudoers-changes -ts today -i ``` Найти все события по ключу за сегодня с интерпретацией ```bash aureport --executable -i | head ``` Топ исполняемых файлов в системе - кто что запускал ```bash ausearch -m AVC -ts recent | head ``` Все недавние SELinux denials - источник для audit2allow ```bash augenrules --load ``` Перезагрузить правила из /etc/audit/rules.d/*.rules - постоянные ```bash ausearch -ua alice -ts yesterday -te now -i | grep EXECVE ``` Все exec'и юзера alice за последние сутки - audit trail ## См. также - [SELinux policy - типы, домены, audit2allow](/kb/selinux-policy.md) - [SELinux и AppArmor - Mandatory Access Control](/kb/selinux-apparmor.md) - [eBPF - программируемый kernel](/kb/ebpf-basics.md) - [PAM - Pluggable Authentication Modules](/kb/pam.md) - [SSH hardening - закрытие сервера](/kb/ssh-hardening.md) - [Управление секретами - Vault, k8s Secrets, sealed-secrets](/kb/secrets-management.md) - [Loki: label-based логи, LogQL, Promtail/Vector pipeline](/kb/loki-grafana-logging.md)