# auditd: логирование доступа к файлам и вызовам

Индекс LLMS: [llms.txt](/llms.txt)

---

Linux не пишет в syslog факт каждого обращения к `/etc/shadow` или вызова `unlink`. Для расследования инцидентов и compliance это критично. auditd решает эту задачу: подсистема ядра Linux Audit, которая фиксирует системные вызовы, доступ к файлам и не только.

## Установка и запуск

auditd входит в пакет `audit` и есть в любом дистрибутиве.

```bash
# Debian/Ubuntu
apt install auditd

# RHEL/CentOS/Alma
yum install audit

# Arch
pacman -S audit
```

После установки сервис запускается через systemd.

```bash
systemctl enable --now auditd
```

Проверка статуса и текущих правил:

```bash
systemctl status auditd
auditctl -l
```

> [!NOTE]
> В RHEL-дистрибутивах с включённым SELinux может потребоваться настройка политик для работы auditd с нестандартными путями. Обычно хватает стандартной установки.

## Мониторинг файлов: флаг -w

Флаг `-w` добавляет правило наблюдения за файлом. По умолчанию отслеживаются open, read, write, truncate, chmod, chown.

```bash
# Мониторим файл паролей
auditctl -w /etc/shadow -p rwxa -k shadow_access

# Мониторим директорию конфигов
auditctl -w /etc/nginx/ -p rwxa -k nginx_config
```

| Флаг | Значение |
|------|----------|
| `-w` | путь для наблюдения |
| `-p` | права: r(read), w(write), x(execute), a(append) |
| `-k` | ключевое слово для поиска в логах |

Проверить правила:

```bash
auditctl -l
```

Удалить правило по ключу:

```bash
auditctl -W /etc/shadow -p rwxa -k shadow_access
```

Правила, добавленные через `auditctl`, не сохраняются после перезагрузки. Для персистентности правила записывают в `/etc/audit/rules.d/`:

```bash
echo "-w /etc/shadow -p rwxa -k shadow_access" >> /etc/audit/rules.d/audit.rules
```

В RHEL правила загружаются из `/etc/audit/audit.rules` скриптом `augenrules`. В Debian/Ubuntu — тоже работает.

## Логирование системных вызовов: флаг -S

Флаг `-S` регистрирует указанный системный вызов для всех процессов или с фильтрами.

```bash
# Логируем удаление файлов
auditctl -S unlink -S unlinkat -k file_deletion

# Логируем создание сокетов
auditctl -S socket -k network_socket
```

Список доступных системных вызовов можно посмотреть через `ausyscall --dump`. Не все вызовы доступны на любой архитектуре — на x86_64 часть вызовов идёт через compat-слой.

> [!WARNING]
> Избыточный syscall-мониторинг генерирует огромный объём логов. На production-сервере ограничивайте правила фильтрами.

Комбинированное правило — syscall плюс путь:

```bash
# Только удаление из /var/log/
auditctl -S unlink -S unlinkat -w /var/log/ -p wa -k log_deletion
```

## Фильтрация по uid и исполняемому файлу

Без фильтров правила применяются глобально. Для точечного мониторинга добавляют условия.

```bash
# Только запуски rm от имени пользователя www-data
auditctl -S execve -a always,entry -F arch=b64 -F uid=33 -F exe=/usr/bin/rm -k rm_by_www

# Все access() к файлу от любого uid
auditctl -a always,entry -S access -F path=/etc/shadow -F perm=r -k shadow_read
```

Основные фильтры:

| Флаг | Описание | Пример |
|------|----------|--------|
| `-F` | поле для сравнения | `-F uid=1000` |
| `arch` | архитектура (b32/b64) | `-F arch=b64` |
| `uid` | реальный UID | `-F uid=33` |
| `euid` | эффективный UID | `-F euid=0` |
| `exe` | полный путь к исполняемому файлу | `-F exe=/bin/bash` |
| `perm` | права доступа | `-F perm=awx` |

Комбинация фильтров собирается в цепочку через `-a`:

```bash
auditctl -a always,entry -S openat -F dir=/etc -F perm=w -F uid=0 -k etc_write_root
```

## Чтение логов: ausearch

Логи хранятся в `/var/log/audit/audit.log`. Формат бинарный, читается утилитой `ausearch`.

```bash
# Поиск по ключевому слову
ausearch -k shadow_access

# Поиск по времени (сегодня, последний час)
ausearch -k shadow_access -ts today
ausearch -k shadow_access -ts recent

# Поиск по пользователю
ausearch -k shadow_access -ui 0

# Поиск по типу события
ausearch -m SYSCALL -k file_deletion

# Фильтр по результату (успех/неудача)
ausearch -k shadow_access -sv success
ausearch -k shadow_access -sv failed
```

Полезные форматы вывода:

```bash
# Сырой текст (по умолчанию)
ausearch -k shadow_access -i

# CSV для парсинга
ausearch -k shadow_access --format csv
```

> [!TIP]
> Для автоматизации используйте `-if` (input file) — читайте из дампа, а не из активного лога:
> ```bash
> ausearch -if /tmp/audit_events.dump -k shadow_access
> ```

## Чтение логов: aureport

aureport агрегирует логи в читаемые отчёты.

```bash
# Сводка по всем событиям
aureport

# Отчёт по системным вызовам
aureport -s

# Отчёт по файловым событиям
aureport -f

# Отчёт по пользователям
aureport -u

# Отчёт по времени (с какого момента что происходило)
aureport -t

# Только ошибки и отказы
aureport --failed
```

Типичный вывод `aureport -s`:

```
Syscall Report
============================================
UID        Syscall    Count
--------------------------------------------
0          unlink      12
0          openat      8
33         unlink      3
```

Комбинация для быстрого расследования — сводка и детали:

```bash
aureport -t -i | head -20
ausearch -k file_deletion -ts recent | less
```

Для отправки в SIEM или ELK логи конвертируют в JSON или текст:

```bash
ausearch -k shadow_access --format json > /var/log/audit/shadow_access.json
```

Auditd не требует сложной настройки, чтобы начать фиксировать критичные события. Достаточно установить пакет, добавить несколько правил с ключевыми словами и привыкнуть к ausearch и aureport для чтения логов.
