С помощью аудита можно реализовать журналирование для следующих событий:
- доступ к объектам файловой системы;
- выполнение системных вызовов;
- запуск пользовательских команд;
- логины пользователей;
- действия с учетными записями и привилегиями.
В этой статье я расскажу, как устроена подсистема аудита, как ей управлять, а также как получить журнал аудита всех интересующих тебя событий.
Подсистема аудита в Linux состоит из двух групп компонентов: в пространстве ядра это kauditd, а в пользовательском — auditd.
В общем виде схема работы подсистемы аудита выглядит следующим образом.
Ядро, принимая системные вызовы из user space, пропускает их через фильтры user
, task
, filesystem
, exclude
и exit
.
- Фильтр
user
используется для фильтрации (исключения) событий, происходящих в пользовательском пространстве до отправки в auditd. Практически никогда не используется. - Фильтр
task
применяется для системных вызововfork(
и) clone(
.) - Фильтр
filesystem
используется для исключения событий для конкретной файловой системы. - Фильтр
exclude
задает исключения для событий. - Фильтр
exit
проходят все системные вызовы. Обычно настраивают именно этот фильтр.
Через netlink(
сообщения отправляются из kauditd в auditd. При получении событий, демон auditd записывает их в лог (по умолчанию /
).
Настраивая фильтры с помощью утилиты auditctl, мы можем управлять потоком событий, который хотим получать. С помощью утилит ausearch, aureport, aulast удобно просматривать журнал аудита.
Давай теперь установим и настроим все подсистемы аудита. Установка крайне проста и не вызывает никаких сложностей:
$ sudo dnf install audit
$ sudo systemctl enable --now auditd
Статус работы подсистемы аудита можно получить так:
$
enabled 1
failure 1
pid 885
rate_limit 0
backlog_limit 8192
lost 0
backlog 0
backlog_wait_time 60000
loginuid_immutable 0 unlocked
Для теста есть возможность отправить текстовое сообщение в подсистему аудита и убедиться, что соответствующее событие попало в журнал аудита.
$
$
----
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 представлены в файле /
. Конфиг по умолчанию рабочий и не требует изменений, оставляем его как есть.
Разберемся теперь, как управлять фильтрами kauditd. Все настройки фильтров группируются в файлы правил. Формат правил аналогичен синтаксису консольной программы auditctl. Демон auditd загружает эти правила последовательно при старте системы либо вручную по команде пользователя.
info
Важный момент: чтобы наши правила применялись после перезагрузки, необходимо записать их в файл, в каталог /
.
Примеры правил ты можешь найти в каталоге /
. Правила аудита бывают следующих типов:
-
Управляющие правила настраивают систему аудита и поведение агента. Все возможные опции перечислены в мане
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
— имя правила. Как и в правиле файловой системы, используется для маркировки событий для последующей фильтрации лога.
Важно отметить, что правила системных вызовов значительно влияют на производительность системы в целом. Старайся сократить их количество и объединяй правила, где это возможно.
В качестве тренировки создадим правило аудита для регистрации изменения файла /
.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»