Режим работы

Поведение по умолчанию (RHEL-based)

Параметр audit=1 в kernel cmdline отсутствует, сервис auditd.service включен.

При старте ОС, до запуска userspace-процесса auditd:

  1. Ядро выполняет инициализацию фреймворка аудита, без его включения;

  2. Фреймворк отправляет события аудита от ядра (тип записи KERN) в кольцевой буфер ядра (kmsg);

  3. Фреймворк отбрасывает события аудита из пространства пользователя (тип записи USER).

[0.651960] audit: initializing netlink socket (disabled)
[0.651970] type=2000 audit(1596687367.023:1): initialized
[2.869850] type=1404 audit(1596687369.640:2): enforcing=1 old_enforcing=0 auid=4294967295 ses=4294967295
[2.948695] type=1403 audit(1596687369.719:3): policy loaded auid=4294967295 ses=4294967295

После запуска процесса auditd:

  1. auditd включает фреймворк аудита в ядре;

  2. Фреймворк начинает назначать каждому новому userspace-процессу контекст аудита;

  3. Фреймворк начинает принимать события из пространства пользователя;

  4. Фреймворк начинает отправлять все события процессу auditd.

После завершения процесса auditd:

  1. Фреймворк прекращает отправлять события процессу auditd;

  2. Фреймворк начинает отправлять все события аудита в кольцевой буфер ядра (kmsg);

В этом режиме работы возможна ситуация, при которой процессы не получают контекст аудита из-за того, что запускаются раньше чем включается фреймворк аудита.

Расширенная настройка

Параметры audit=1 и audit_backlog_limit=8192 в kernel cmdline присутствуют, сервис auditd.service включен.

Рекомендуемый режим работы.

При старте ОС, до запуска userspace-процесса auditd:

  1. Ядро выполняет инициализацию фреймворка аудита и сразу включает его;

  2. Фреймворк назначает каждому новому процессу контекст аудита;

  3. Фреймворк отправляет все события (как от ядра, так и от пространства пользователя), в кольцевой буфер ядра (kmsg), дополнительно помещает их в  очередь, ожидая запуска userspace-процесса auditd.

[0.000000] audit: enabled (after initialization)
[0.394588] audit: initializing netlink socket (enabled)
[0.394598] type=2000 audit(1572612829.600:1): initialized

После запуска процесса auditd:

  1. Фреймворк начинает отправлять события процессу auditd.

После завершения процесса auditd:
. Фреймворк прекращает отправлять события процессу auditd;
. Фреймворк отправляет все события (как от ядра, так и из пространства пользователя), в кольцевой буфер ядра (kmsg), дополнительно помещает их в свою очередь, ожидая запуска userspace-процесса auditd.

События, которые не удалось разместить в очереди из-за её переполнения, не попадут в журнал аудита и будут полностью утеряны.

Для данного режима работы необходимо добавить audit=1 в cmdline ядра.

При инициализации фреймворка очередь событий по умолчанию вмещает 64 сообщения. Такой размер был приемлем в ОС, использующих систему инициализации SysV Init (RHEL ⇐ 6), но с переходом на systemd (>= RHEL 7) количество событий аудита, поступающих во фреймворк до старта процесса auditd, превышает 64, что приводит к потере событий из-за переполнения очереди (при просмотре состояния системы аудита с помощью команды auditctl -s -i сразу после загрузки ОС значение поля lost больше нуля). Эта проблема была решена в mainline-ядре версии >= 3.14rc1 путём ввода параметра ядра audit_backlog_limit, патч бекпортирован в RHEL 7.8.

Для RHEL >=7.8 необходимо дополнительно добавить в cmdline ядра к приведённому ранее параметру audit=1 параметр audit_backlog_limit=8192.

Аудит отключен

Параметр audit=0 в kernel cmdline присутствует, сервис auditd.service включен.

Cистема аудита отключена.

При старте ОС:

  1. Ядро не выполняет инициализацию фреймворка аудита;

  2. systemd не запускает auditd так как в юните auditd.service есть проверка на наличие параметра audit=0 в cmdline ядра.

[0.000000] audit: disabled (until reboot)

Для данного режима работы необходимо добавить audit=0 в cmdline ядра.

Warning
Нельзя указывать данный параметр ядра если в настройках PAM включены PAM-модули, взаимодействующие с системой аудита и для которых в PAM-стеке прописан режим контроля required - это приведёт к блокировке локального и удалённого входа в ОС так как PAM не сможет связаться с фреймворком аудита по NETLINK-сокету.

Запуск auditd

Во время запуска сервиса auditd.service bash-скрипт /usr/sbin/augenrules объединяет все файлы с расширением .rules из каталога /etc/audit/rules.d/ в один файл и передаёт его утилите auditctl для загрузки во фреймворк.

Завершение auditd

auditd следует выключать через команду service (SysV init-скрипты для auditd расположены в /usr/libexec/initscripts/legacy-actions/auditd/).

В systemd-юните auditd.service команды завершения auditd как таковой нет, более того, в юните задан параметр RefuseManualStop=yes:

From: Steve Grubb <sgrubb@redhat.com>
To: linux-audit@redhat.com
Subject: Re: Rational behind RefuseManualStop=yes in auditd.service
Date: Tue, 30 Jul 2013 16:25:06 -0400
> Hi,
>
> I would like to know the rational behind RefuseManualStop=yes in
> auditd.service file.

Common Criteria requires that we have the identity of the user altering any
audit settings such as whether its running or not. Systemctl uses dbus to talk
to systemd. It in turn sends the signal to auditd. Auditd asks the kernel who
did it and gets -1 for the answer because that’s the auid of systemd. This
was reported as bz 881057.

The short term "fix" is to force admins to use the service command which loads
legacy helper scripts which are pulled from the old SysV init script. It sends
signals in the user’s context so that the auid is correct.

The long term fix is to put part of dbus in the kernel so that we can tell the
kernel to transfer credentials from one process to another so that auditing is
correct.

Завершение процесса auditd через service audit stop отключает приём событий из очереди ядерного фреймворка. В случае наличия загруженных правил аудита, фреймворк в ядре продолжит следить за ними, занимая ресурсы CPU.

Команда полной остановки системы аудита: service auditd stop && auditctl -e 0 && auditctl -D.

Для RHEL >= 7.3 можно переопределить systemd-юнит auditd.service, включив параметр ExecStopPost=, который выключит систему аудита и очистит правила во фреймворке сразу после остановки демона auditd.

cat << EOF > /etc/systemd/system/auditd.service
.include /usr/lib/systemd/system/auditd.service
[Service]
ExecStopPost=/sbin/auditctl -R /etc/audit/audit-stop.rules
EOF

systemctl daemon-reload