linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Уроки
  • How it works
  • Симулятор
  • База знаний
  • Собеседование
Index
Categories
All entries
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
home/linux/kb/Безопасность/auditd

kb/security ── Безопасность ── advanced

auditd - syscall и file audit

auditd пишет события ядра в /var/log/audit/audit.log: file watches (-w), syscall rules (-a), exec'и. ausearch для поиска, aureport для отчётов. Основа compliance (PCI-DSS, HIPAA, ФЗ-152).

view as markdownaka: audit, auditctl, ausearch, aureport, linux-audit, audit-framework

Зачем 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.

Когда что-то пошло не так

  • 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-policySELinux policy - типы, домены, audit2allowSELinux: каждый процесс имеет домен, каждый объект - тип. Policy определяет какие домены могут что делать с какими типами. audit2allow генерит rules из AVC-denials, semanage тюнит, .pp - модули policy.
  • selinux-apparmorSELinux и AppArmor - Mandatory Access ControlSELinux и AppArmor - это MAC: дополнительный слой контроля поверх обычных permissions. Запрещают процессу делать что не входит в его профиль/тип.
  • ebpf-basicseBPF - программируемый kerneleBPF - запуск sandboxed-программ в kernel без kernel-modules. Прицепляются к hooks (kprobe, uprobe, tracepoint, perf, socket, XDP). Verifier гарантирует завершение и safety. JIT компилирует в native. bpftool/libbpf/BCC - userspace tooling.
  • pamPAM - Pluggable Authentication ModulesPAM - фреймворк аутентификации в Linux. Программы (sudo, login, sshd) не проверяют пароли сами, а вызывают PAM, который через стек модулей в `/etc/pam.d/<service>` решает: пускать или нет.
  • ssh-hardeningSSH hardening - закрытие сервераSSH hardening: ключи only (PasswordAuthentication no), отключить root-login, AllowUsers/AllowGroups, MaxAuthTries, fail2ban-jail на sshd. Опционально - нестандартный порт + Match-блоки для гостей.
  • secrets-managementУправление секретами - Vault, k8s Secrets, sealed-secretsСекреты не в git, не в env-vars в коде. Опции: HashiCorp Vault (универсал, dynamic creds), k8s Secrets (base64, нужен encryption- at-rest), sealed-secrets (commit-friendly), external-secrets (sync из cloud-vault).
  • loki-grafana-loggingLoki: label-based логи, LogQL, Promtail/Vector pipelineLoki - log aggregation с label-based индексом (не full-text как Elastic). Дёшево на S3-storage. Promtail/Vector как агенты. LogQL похож на PromQL: фильтр + parse + aggregation. Cardinality - враг.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки