Хакер - Основы аудита. Настраиваем журналирование важных событий в Linux
hacker_frei
Андрей Балабанов
Подсистема аудита Linux позволяет на основе предварительно настроенных правил отслеживать значимую информацию о безопасности операционной системы, создает записи журнала для дальнейшего расследования нарушений политики. Сегодня мы посмотрим поближе на этот важный и для хакера, и для админа элемент системы безопасности.
С помощью аудита можно реализовать журналирование для следующих событий:
- доступ к объектам файловой системы;
- выполнение системных вызовов;
- запуск пользовательских команд;
- логины пользователей;
- действия с учетными записями и привилегиями.
В этой статье я расскажу, как устроена подсистема аудита, как ей управлять, а также как получить журнал аудита всех интересующих тебя событий.
Подсистема аудита в Linux состоит из двух групп компонентов: в пространстве ядра это kauditd, а в пользовательском — auditd.
В общем виде схема работы подсистемы аудита выглядит следующим образом.

Ядро, принимая системные вызовы из user space, пропускает их через фильтры user, task, filesystem , exclude и exit.
- Фильтр
userиспользуется для фильтрации (исключения) событий, происходящих в пользовательском пространстве до отправки в auditd. Практически никогда не используется. - Фильтр
taskприменяется для системных вызововfork()иclone(). - Фильтр
filesystemиспользуется для исключения событий для конкретной файловой системы. - Фильтр
excludeзадает исключения для событий. - Фильтр
exitпроходят все системные вызовы. Обычно настраивают именно этот фильтр.
Через netlink(7) сообщения отправляются из kauditd в auditd. При получении событий, демон auditd записывает их в лог (по умолчанию /var/log/audit/audit.log).
Настраивая фильтры с помощью утилиты auditctl, мы можем управлять потоком событий, который хотим получать. С помощью утилит ausearch, aureport, aulast удобно просматривать журнал аудита.
Давай теперь установим и настроим все подсистемы аудита. Установка крайне проста и не вызывает никаких сложностей:
$ sudo dnf install audit
$ sudo systemctl enable --now auditd
Статус работы подсистемы аудита можно получить так:
$ sudo auditctl -s
enabled 1
failure 1
pid 885
rate_limit 0
backlog_limit 8192
lost 0
backlog 0
backlog_wait_time 60000
loginuid_immutable 0 unlocked
Для теста есть возможность отправить текстовое сообщение в подсистему аудита и убедиться, что соответствующее событие попало в журнал аудита.
$ sudo auditctl -m helloaudit
$ sudo ausearch -m USER
----
type=USER msg=audit(08/31/2021 19:20:11.160:330699) : pid=305708 uid=root auid=andrey ses=5 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 msg='text=helloaudit exe=/usr/sbin/auditctl hostname=rhel.ipa.localdomain addr=? terminal=pts/0 res=success'
Настройки демона auditd представлены в файле /etc/audit/auditd.conf. Конфиг по умолчанию рабочий и не требует изменений, оставляем его как есть.
Разберемся теперь, как управлять фильтрами kauditd. Все настройки фильтров группируются в файлы правил. Формат правил аналогичен синтаксису консольной программы auditctl. Демон auditd загружает эти правила последовательно при старте системы либо вручную по команде пользователя.
INFO
Важный момент: чтобы наши правила применялись после перезагрузки, необходимо записать их в файл, в каталог /etc/audit/rules.d/.
Примеры правил ты можешь найти в каталоге /usr/share/audit/sample-rules/. Правила аудита бывают следующих типов:
- Управляющие правила настраивают систему аудита и поведение агента. Все возможные опции перечислены в мане
auditctl(8). - Правила файловой системы необходимы для наблюдения за файлом или каталогом, доступ к которым мы хотим контролировать. Формат правила следующий:
-w path-to-file -p permissions -k keyname- Ключ
-wуказывает на то, что это правило файловой системы. Далее следует путь к файлу или каталогу. - Ключ
-pможет содержать любые комбинации прав доступаr(чтение),w(запись),x(выполнение) иa(изменение атрибута). - Ключ
-kзадает имя правила, по которому впоследствии можно фильтровать логи. - Правила системных вызовов используются для мониторинга системных вызовов, выполняемых любым процессом или конкретным пользователем. Правило имеет следующий формат:
-a action,list -S syscall -F field=value -k keyname- Ключ
-aозначает append (добавление) правила в фильтр. - Действие
actionможет бытьalways(всегда создавать события) илиnever(никогда не создавать события). - Фильтр
listсодержит один из возможных вариантов:task,exit,user,filesystemилиexclude. -Sуказывает конкретный syscall (имя или номер); можно в одном правиле указывать сразу несколько syscall, каждый после своего ключа-S.-Fзадает фильтр по полям. Рекомендуется всегда указывать разрядность, добавляя в правила фильтр-F arch=b64.- Ключ
-k— имя правила. Как и в правиле файловой системы, используется для маркировки событий для последующей фильтрации лога.
Важно отметить, что правила системных вызовов значительно влияют на производительность системы в целом. Старайся сократить их количество и объединяй правила, где это возможно.
В качестве тренировки создадим правило аудита для регистрации изменения файла /etc/passwd.
Для начала убедимся, что у нас не применено ни одного правила.
$ sudo auditctl -l
No rules
Если ранее уже были заданы какие‑то правила, то смело удаляем их командой:
$ sudo auditctl -D
No rules
Применим правило:
$ sudo auditctl -w /etc/passwd -p wa -k passwd
Проверим, что правило активно:
$ sudo auditctl -l -w /etc/passwd -p wa -k passwd
Теперь просмотрим, как наше правило работает. Мы не просто отредактируем файл, а последовательно создадим и удалим пользователя:
$ sudo useradd testuser
$ sudo userdel -r testuser
Убедимся, что по нашему правилу сгенерировались события. Для этого построим отчет:
$ sudo aureport --summary -k
Key Summary Report
===========================
total key
===========================
6 passwd
Теперь посмотрим эти события.
$ sudo ausearch -i -k passwd
----
type=PROCTITLE msg=audit(08/31/2021 17:08:25.562:330349) : proctitle=/sbin/auditctl -R /etc/audit/audit.rules
type=SOCKADDR msg=audit(08/31/2021 17:08:25.562:330349) : saddr={ saddr_fam=netlink nlnk-fam=16 nlnk-pid=0 }
type=SYSCALL msg=audit(08/31/2021 17:08:25.562:330349) : arch=x86_64 syscall=sendto success=yes exit=1076 a0=0x3 a1=0x7ffd19279350 a2=0x434 a3=0x0 items=0 ppid=285156 pid=285166 auid=unset uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=(none) ses=unset comm=auditctl exe=/usr/sbin/auditctl subj=system_u:system_r:unconfined_service_t:s0 key=(null)
type=CONFIG_CHANGE msg=audit(08/31/2021 17:08:25.562:330349) : auid=unset ses=unset subj=system_u:system_r:unconfined_service_t:s0 op=remove_rule key=passwd list=exit res=yes
----
type=PROCTITLE msg=audit(08/31/2021 17:08:38.406:330366) : proctitle=auditctl -w /etc/passwd -p wa -k passwd
type=SYSCALL msg=audit(08/31/2021 17:08:38.406:330366) : arch=x86_64 syscall=sendto success=yes exit=1076 a0=0x4 a1=0x7ffdcd6fca80 a2=0x434 a3=0x0 items=0 ppid=285219 pid=285221 auid=andrey uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=pts0 ses=5 comm=auditctl exe=/usr/sbin/auditctl subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key=(null)
type=CONFIG_CHANGE msg=audit(08/31/2021 17:08:38.406:330366) : auid=andrey ses=5 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 op=add_rule key=passwd list=exit res=yes
...
Все записи в журнале обязательно начинаются с tуpe= — как легко догадаться, это тип события. Я привел только два из выведенных событий, но можно заметить, что подсистема аудита по нашему правилу группирует события разных типов в один блок. Это удобно для анализа.
Есть события, которые не промаркированы нашим правилом, много чего интересного собирается в автоматическом режиме. Общая картина видна из отчета:
$ sudo aureport
Summary Report
======================
Range of time in logs: 08/31/2021 17:08:25.540 - 08/31/2021 17:31:13.011
Selected time for report: 08/31/2021 17:08:25 - 08/31/2021 17:31:13.011
Number of changes in configuration: 5
Number of changes to accounts, groups, or roles: 8
Number of logins: 0
Number of failed logins: 0
Number of authentications: 3
Number of failed authentications: 0
Number of users: 2
Number of terminals: 6
Number of host names: 2
Number of executables: 8
Number of commands: 6
Number of files: 3
Number of AVC's: 0
Number of MAC events: 0
Number of failed syscalls: 0
Number of anomaly events: 0
Number of responses to anomaly events: 0
Number of crypto events: 0
Number of integrity events: 0
Number of virt events: 0
Number of keys: 1
Number of process IDs: 26
Number of events: 166
Все возможные типы регистрируемых событий можем узнать так (в реальности вывод гораздо длиннее, поскольку типов больше 170):
$ sudo ausearch -m
Argument is required for -m
Valid message types are: ALL USER LOGIN USER_AUTH USER_ACCT USER_MGMT CRED_ACQ CRED_DISP USER_START USER_END USER_AVC USER_CHAUTHTOK USER_ERR CRED_REFR USYS_CONFIG USER_LOGIN USER_LOGOUT ADD_USER DEL_USER ADD_GROUP DEL_GROUP...
WWW
- Описание всех типов и полей логов есть в документации.
К примеру, в результате наших действий по добавлению и удалению пользователей появились события других типов, которые не попали в правило. Но мы с легкостью можем их просмотреть.
$ sudo ausearch -i -m USER_MGMT,ADD_USER,DEL_USER,ADD_GROUP,DEL_GROUP
----
type=ADD_GROUP msg=audit(08/31/2021 17:08:53.317:330382) : pid=285290 uid=root auid=andrey ses=5 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 msg='op=add-group acct=testuser exe=/usr/sbin/useradd hostname=rhel.ipa.localdomain addr=? terminal=pts/0 res=success'
----
type=ADD_USER msg=audit(08/31/2021 17:08:53.322:330383) : pid=285290 uid=root auid=andrey ses=5 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 msg='op=add-user acct=testuser exe=/usr/sbin/useradd hostname=rhel.ipa.localdomain addr=? terminal=pts/0 res=success'
----
type=USER_MGMT msg=audit(08/31/2021 17:08:53.652:330385) : pid=285290 uid=root auid=andrey ses=5 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 msg='op=add-home-dir id=testuser exe=/usr/sbin/useradd hostname=rhel.ipa.localdomain addr=? terminal=pts/0 res=success'
...
Если мы хотим получить абсолютно все события аудита за день, выполняем команду sudo ausearch -i -ts today. Ответ будет очень длинным, поэтому не привожу его.
Если же нам по каким‑то причинам не интересны конкретные типы событий и мы хотим сократить размер логов, то можем полностью исключить регистрацию этих типов. Например, с помощью правил для фильтра exclude:
$ sudo auditctl -a always,exclude -F msgtype=CWD
$ sudo auditctl -a always,exclude -F msgtype=PATH
$ sudo auditctl -a always,exclude -F msgtype=CRYPTO_KEY_USER
ВЫВОД
Как мы убедились, настраивать аудит в Linux не так уж и сложно. Достаточно понять, как он работает, и набить руку в написании правил. Всем заинтересовавшимся советую обратить внимание на другие реализации агентов аудита: auditbeat и go-audit. Возможно, для твоих задач они подойдут лучше.
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei