AUDITCTL

Июль 2021

ИМЯ

auditctl - инструмент, помогающий управлять системой аудита ядра

ОБЗОР

auditctl [параметры]

ОПИСАНИЕ

Инструмент auditctl используется для настройки параметров ядра, связанных с аудитом, для просмотра статуса конфигурации и для загрузки дискреционных правил аудита.

ПАРАМЕТРЫ КОНФИГУРАЦИИ

-b количество_бэклога

Установить максимально допустимое (предельное) количество буферов аудита, ожидающих обработки (бэклог, значение в ядре по умолчанию — 64). Если все буферы заняты, то ядром будет выставлен флаг сбоя для дальнейшей обработки.

--backlog_wait_time время_ожидания

Установить время ожидания ядром (значение в ядре по умолчанию — 60*HZ), когда будет достигнут предел бэклога (количества буферов аудита, которые ожидают обработки), прежде чем ставить в очередь дополнительные события аудита для передачи в auditd. Число должно быть больше или равно нулю и менее чем в 10 раз превышать значение по умолчанию.

--reset_backlog_wait_time_actual

Сбросить фактический счетчик времени ожидания бэклога (количества буферов аудита, которые ожидают обработки), показанный командой status.

-c

Продолжить загрузку правил, несмотря на ошибку. Суммирует результаты загрузки правил. Если какое-либо правило не загрузится, выводится код ошибки.

-D

Удалить все правила и наблюдения. Может также принимать параметр -k.

-e [0..2]

Установить флаг блокировки: 0 - отключить аудит, 1 - включить аудит, 2 - блокировать конфигурацию аудита от изменений. Для использования данной возможности необходимо ввести данную команду последней строкой в audit.rules(7). После ввода команды все попытки изменить конфигурацию будут проверены и отклонены с уведомлением в журналах аудита. В дальнейшем,для изменения конфигурации аудита, необходимо перезагрузить систему.

-f [0..2]

Установить способ обработки для флага сбоя: 0=silent, 1=printk, 2=panic. Позволяет определить, как ядро будет обрабатывать критические ошибки. Например, флаг сбоя выставляется при следующих условиях: ошибки передачи в пространство демона аудита; превышение лимита буферов, ожидающих обработки; выход за пределы памяти ядра; превышение предела скорости выдачи сообщений. Значение по умолчанию: 1. Для систем с повышенными требованиями к безопасности, значение 2 может быть более предпочтительно.

-h

Справка

-i

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

--loginuid-immutable

Указать ядру, что loginuid (идентификаторы входа в систему) должны быть неизменными после их установки. Для изменения loginuid требуется CAP_AUDIT_CONTROL. Поэтому непривилегированные пользователи не могут его изменить. Установка данного параметра защищает от взлома loginuid, но может вызвать проблемы в некоторых контейнерерах.

-q точка_монтирования,поддерево

При наличии точки наблюдения за каталогом и объединении или перемещении монтирования другого поддерева в наблюдаемое поддерево, необходимо указать ядру, сделать монтируемое поддерево эквивалентным просматриваемому каталогу. Если поддерево уже смонтировано во время создания точки наблюдения за каталогом, то поддерево автоматически помечается для просмотра. Эти два значения разделяет запятая. Отсутствие запятой приведет к ошибке.

-r частота

Установить ограничение скорости выдачи сообщений в секунду (0 - нет ограничения). Если данная частота ненулевая и она превышается в ходе аудита, то ядром выставляется флаг сбоя для выполнения соответствующего действия. Значение по умолчанию: 0.

--reset-lost

Сбросить счетчик потерянных записей, отображаемых параметром статуса -s.

-R файл

Читать правила из файла файл. Правила должны быть организованы следующим образом: располагаться по одному в строке и в том порядке, в котором должны исполняться. На файл накладываются следующие ограничения: только root должен быть владельцем файл, и иметь доступ на чтение файл; файл может содержать комментарии, начинающиеся с символа '#'; правила, считываемые из файла, идентичны правилам, вводимым в командной строке, за исключением того, что правилам из файла не предшествует 'auditctl' (так как auditctl - это тот, кто выполняет файл), и отсутствия экранирования символов подстановки (так как файл читает auditctl).

--signal сигнал

Отправить сигнал демону аудита. Для этого у вас должны быть привилегии. Поддерживаемые сигналы: TERM, HUP, USR1, USR2, CONT.

-t

Обрезать поддеревья после команды монтирования.

ПАРАМЕТРЫ СОСТОЯНИЯ

-l

Вывести список всех правил по одному в строке. Вывод возможен в двух вариантах: либо указать либо ключ фильтрации через -k для вывода списка правил, соответствующих ключу; либо через параметр -i, интерпретирующий значения полей от a0 до a3, для корректного определения значений аргументов системных вызовов.

-m текст

Послать в систему аудита текст пользовательского сообщения. Это может быть сделано только если у пользователя есть привилегия CAP_AUDIT_WRITE (обычно есть у пользователя root). Результирующее событие будет типом USER.

-s

Вывести статус аудита. Будут показаны значения, которые можно установить с помощью опций -e, -f, -r и -b. Значение pid - это номер процесса демона аудита. Значение pid 0 указывает, что демон аудита не работает. Поле lost сообщает, сколько записей событий аудита было отброшено из-за переполнения буфера аудита. Поле backlog показывает, сколько записей событий аудита находится в очереди, ожидая, когда auditd прочитает их. С этим параметром можно использовать опцию -i для интерпретации значений некоторых полей.

-v

Вывести версию auditctl.

ПАРАМЕТРЫ ПРАВИЛ

-a [список,действие|действие,список]

Добавить правило с указанным действием в конец списка. Значения действия и списка разделяются запятой. Отсутствие запятой вызовет ошибку. Поля могут быть указаны в любом порядке. Ниже описаны имена доступных списков:

task

Добавить правило в список, отвечающий за процессы. Этот список правил используется только во время создания процесса - когда родительский процесс вызывает fork() или clone(). При использовании данного списка, использовать только те поля, которые известны во время создания процесса: uid, gid и т.д.

exit

Добавить правило в список, отвечающий за за точки выхода из системных вызовов. Данный список применяется, в случае необходимости создать событие для аудита, привязанное к точкам выхода из системных вызовов.

user

Добавить правило в список фильтров пользовательских сообщений. Этот список используется ядром для фильтрации событий, происходящих в пользовательском пространстве, перед передачей их демону аудита. Следует отметить, что допустимыми являются только следующие поля: uid, auid, gid, pid, subj_user, subj_role, subj_type, subj_sen, subj_clr, msgtype и имя исполняемого файла. Все остальные поля будут рассматриваться как несоответствующие. Следует понимать, что любое событие, исходящее из пользовательского пространства из процесса, у которого есть привилегия CAP_AUDIT_WRITE, будет записано в журнал аудита. Это означает, что наиболее вероятным использованием этого фильтра являются правила, действие которых равно "never", поскольку ничего не нужно делать, чтобы разрешить запись событий.

exclude

Добавить правило в список фильтров исключения типов событий. Этот список используется для фильтрации событий, которые вы не хотите видеть. Например, если вы не хотите видеть какие-либо сообщения avc, вы могли бы использовать этот список для записи этого. События могут быть исключены по идентификатору процесса, идентификатору пользователя, идентификатору группы, идентификатору пользователя для входа в систему, типу сообщения, контексту темы или имени исполняемого файла. Действие игнорируется и по умолчанию используется значение "никогда".

filesystem

Добавить правило, которое будет применяться ко всей файловой системе. Файловая система должна быть идентифицирована с помощью поля fstype. Обычно этот фильтр используется для исключения любых событий для всей файловой системы, таких как tracefs или debugfs.

Ниже описаны допустимые действия для правила:

never

Записи аудита генерироваться не будут. Может быть использовано для подавления генерации событий. Обычно необходимо подавлять генерацию в начале списка, а не в конце, так как событие инициируется на первом совпавшем правиле.

always

Установить контекст аудита. Всегда заполнять его во время входа в системный вызов и всегда генерировать запись во время выхода из системного вызова.

-A список,действие

Добавить правило с указанным действием в начало списка.

-C [f=f | f!=f]

Создать правило сравнения полей: поле, операция, поле. Можно передавать несколько сравнений в одной командной строке. Каждое из них должно начинаться с -C. Каждое правило сравнения добавляется друг к другу, а также к правилам начинающимся с -F для инициирования записи аудита. Поддерживаются 2 оператора - равно и не равно. Допустимые поля:

auid, uid, euid, suid, fsuid, obj_uid; and gid, egid, sgid, fsgid, obj_gid

Две группы uid и gid не могут быть смешаны. Внутри группы может быть сделано любое сравнение. Поля obj_uid/gid собираются из объекта события, такого как файл или каталог.

-d список,действие

Удалить правило с указанным действием из списка. Правило удаляется только в том случае, если совпали и имя системного вызова, и все значения полей.

-F [n=v | n!=v | n<v | n>v | n<=v | n>=v | n&v | n&=v]

Создать поле правила: имя, операция, значение. В одной командной строке может передаваться до 64 полей. Каждое поле должно начинаться с -F. Каждое уравнение поля сопоставляется друг с другом (а также с уравнениями, начинающимися с -C), чтобы запустить запись аудита. Поддерживается 8 операторов - равно, не равно, меньше , больше, меньше или равно, больше или равно, битовая маска (n&v) и битовая проверка (n&=v) соответственно. Битовая маска просто выполняет операцию "and" над значениями. Битовая проверка выполняет операцию "and" над значениями и проверяет, что они равны. Поля, Поля, принимающие идентификатор пользователя, вместо этого могут содержать имя пользователя — программа преобразует имя в идентификатор пользователя. То же самое верно для имен групп. Допустимыми полями являются:

a0, a1, a2, a3

Четыре первых аргумента, переданных системному вызову соответственно. Строковые аргументы не поддерживаются. Это связано с тем, что ядро должно получать указатель на строку, а проверка поля по значению адреса указателя нежелательна. Таким образом, необходимо использовать только цифровые значения. Это, скорее всего, будет использоваться на платформах, которые мультиплексируют операции с сокетами или IPC.

arch

Архитектура процессора, на котором выполняется системный вызов. Для определения архитектуры необходимо использовать команду 'uname -m'. В случае если архитектура машины неизвестна, однако необходимо использовать таблицу 32-битных системных вызовов, и машина поддерживает 32 бита, можно использовать b32. Аналогичным образом применяется таблица системных вызовов b64. Можно написать правила, которые в некоторой степени не зависят от архитектуры, потому что тип будет определяться автоматически. Однако системные вызовы могут зависеть от архитектуры, и то, что доступно на x86_64, может быть недоступно на PPC. Директива arch должна предшествовать параметру -S, чтобы auditctl знал, какую внутреннюю таблицу использовать для поиска номеров системных вызовов.

auid

Оригинальный идентификатор, с которым пользователь вошел в систему. Это аббревиатура audit uid. Иногда его называют loginuid. Можно использовать либо имя пользователя, либо идентификатор пользователя.

devmajor

Главный номер устройства (Device Major Number)

devminor

Вспомогательный номер устройства (Device Minor Number)

dir

Полный путь к каталогу для просмотра. Это приведет к рекурсивному просмотру каталога и всего его поддерева. Можно использовать только в списке exit. См. "-w".

egid

Эффективный идентификатор группы. Может быть числом или именем группы.

euid

Эффективный идентификатор пользователя. Может быть числом или именем учетной записи пользователя.

exe

Абсолютный путь к приложению, к которому будет применяться это правило при выполнении. Поддерживает операторы = и !=. Обратите внимание, что вы можете использовать это только один раз для каждого правила.

exit

Значение выхода из системного вызова. Если код выхода является ошибкой, вы также можете использовать текстовое представление.

fsgid

Идентификатор группы, применяемый к файловой системе. Может быть числом или именем группы.

fsuid

Идентификатор пользователя, применяемый к файловой системе. Может быть числом или именем пользователя.

filetype

Тип целевого файла: файл, каталог, сокет, ссылка, символ, блок или FIFO.

gid

Идентификатор группы. Может быть числом или именем группы.

inode

Номер inode

key

Альтернативный способ установить ключ фильтрации. См. выше описание параметра -k .

msgtype

Используется для соответствия типу записи события. Его следует использовать только в списках фильтров exclude или user.

obj_uid

UID объекта

obj_gid

GID объекта

obj_user

Имя пользователя-владельца ресурса (в контексте SE Linux)

obj_role

Роль ресурса (в контексте SE Linux)

obj_type

Тип ресурса (в контексте SE Linux)

obj_lev_low

Нижний уровень ресурса (в контексте SE Linux)

obj_lev_high

Верхний уровень ресурса (в контексте SE Linux)

path

Полный путь к файлу для точки наблюдения. Может быть использован только в списке exit.

perm

Фильтр прав доступа для файловых операций. См. описание параметра "-p". Может быть использован только в списке exit. Можно использовать без указания системного вызова, при этом ядро выберет системные вызовы, которые удовлетворяют запрашиваемым разрешениям.

pers

Персональный номер операционной системы

pid

Идентификатор процесса

ppid

Идентификатор родительского процесса

saddr_fam

Номер семейства адресов, указанный в /usr/include/bits/socket.h. Например, IPv4 — 2, а IPv6 — 10.

sessionid

Идентификатор сессии пользователя

subj_user

Имя пользователя-владельца процесса (в контексте SE Linux)

subj_role

Роль процесса (в контексте SE Linux)

subj_type

Тип процесса (в контексте SE Linux)

subj_sen

Чувствительность процесса (в контексте SE Linux)

subj_clr

Допуск процесса (в контексте SE Linux)

sgid

Установленный идентификатор группы. Подробности см. в getresgid(2).

success

Если возвращаемое значение >= 0 — это true/yes, в противном случае — это false/no. При создании правила следует использовать 1 для true/yes и 0 для false/no

suid

Установленный идентификатор пользователя. Подробности см. в getresuid(2).

uid

Идентификатор пользователя. Может быть числом или именем учетной записи пользователя.

-k ключ

Установить ключ фильтра для правила аудита. Ключ фильтра представляет собой произвольную текстовую строку длиной до 31 байта. Он может однозначно идентифицировать записи аудита, созданные правилом. Обычно используется, когда у вас есть несколько правил, которые вместе удовлетворяют требованиям безопасности. Значение ключа можно найти с помощью ausearch, так что независимо от того, какое правило вызвало событие, вы сможете найти его результаты. Ключ также можно использовать для удаления всех (-D) и списка правил (-l), чтобы выбрать правила с определенным ключом. У вас может быть более одного ключа в правиле, если вы хотите иметь возможность выполнять поиск по зарегистрированным событиям несколькими способами или если у вас есть плагин auditd, который использует ключ для облегчения его анализа.

-p [r|w|x|a]

Описать тип разрешения доступа, при котором будет запущен просмотр файловой системы. r — чтение, w — запись, x — выполнение, a — изменение атрибута. Эти разрешения не являются стандартными разрешениями для файлов, а скорее типом системного вызова, который мог бы выполнять такого рода действия. Системные вызовы на чтение и запись исключены из этого набора, поскольку они перегружали бы журналы. Но скорее для чтения или записи просматриваются флаги open, чтобы увидеть, какое разрешение было запрошено.

-S [имя_системного_вызова| номер_системного_вызова|all]

Может использоваться любое имя_системного_вызова или номер_системного_вызова. Также может использоваться слово 'all' . Если данный системный вызов выполняется программой, то запустить запись аудита. Если задано правило поля и системный вызов не указан, по умолчанию будут использоваться все системные вызовы. Вы также можете указать несколько системных вызовов в одном правиле, используя несколько параметров -S в одном правиле. Это повышает производительность, поскольку требуется вычислять меньшее количество правил. В качестве альтернативы вы можете передать список имен системных вызовов, разделенных запятыми. Если вы работаете в системе с двумя arch, такой как x86_64, вы должны знать, что auditctl просто берет текст, ищет в нем собственный arch (в данном случае b64) и отправляет это правило ядру. Если нет дополнительных директив arch, ОНИ БУДУТ ПРИМЕНЯТЬСЯ КАК К 32, ТАК и К 64-РАЗРЯДНЫМ системным вызовам. Это может иметь нежелательные последствия, поскольку нет гарантии, что любой системный вызов имеет одинаковый номер как на 32, так и на 64-разрядных интерфейсах. Вы, вероятно, захотите контролировать это и написать 2 правила, одно с arch равным b32, а другое с b64, чтобы убедиться, что ядро находит события, которые вы намереваетесь. Для получения дополнительной информации см. описание поля arch.

-w путь

Добавить точку наблюдения за файловым объектом, находящемуся по указанному пути. Вы не можете вставить точку наблюдения в каталог верхнего уровня — это запрещено ядром. Подстановочные знаки также не поддерживаются и будут генерировать предупреждение. Способ работы точки наблюдения заключается в отслеживании inode внутри. Если вы устанавливаете наблюдение за файлом, это то же самое, что использовать параметр правил -F path на системный вызо. Если вы устанавливаете наблюдение за каталогом, это то же самое, что использовать параметр правил -F dir на системный вызов. Форма записи наблюдений -w предназначена для обратной совместимости, а форма, основанная на системном вызове, более выразительна. В отличие от большинства правил аудита системных вызовов, наблюдение не влияет на производительность в зависимости от количества правил, отправленных ядру. Единственными допустимыми параметрами при использовании наблюдения являются -p и -k. Если вам нужно сделать что-нибудь необычное, например, провести аудит доступа конкретного пользователя к файлу, тогда используйте форму аудита системного вызова с полями path или dir. Смотрите раздел ПРИМЕРОВ для примера преобразования одной формы в другую.

-W путь

Удалить точку наблюдения за файловым объектом, находящемуся по указанному пути. Правило должно точно совпадать. Для получения дополнительной информации см. описание параметра -d.

СОВЕТЫ ПО ПРОИЗВОДИТЕЛЬНОСТИ

Правила системных вызовов оцениваются для каждого системного вызова каждой программы. При наличии 10 правил системных вызовов, каждая программа в системе будет задержана во время системного вызова, пока система аудита оценивает каждое правило. Большое количество системных вызовов негативно отразится на производительности. Можно объединять правила если фильтр, действие, ключ и поля совпадают. Например два правила:

auditctl -a always,exit -F arch=b64 -S openat -F success=0
auditctl -a always,exit -F arch=b64 -S truncate -F success=0

могут быть переписано как одно правило:

auditctl -a always,exit -F arch=b64 -S openat -S truncate -F success=0

Кроме того, следует стараться использовать аудит файловой системы везде, где это возможно. Это улучшает производительность. Например, для того, чтобы захватывать все неудачные вызовы openat и truncate, как в примере выше, но только для файлов в каталоге /etc и не заботиться о файлах в /usr или /sbin, можно использовать правило:

auditctl -a always,exit -S openat -S truncate -F dir=/etc -F success=0

Это повысит производительность, так как ядро не будет оценивать каждый системный вызов. Это будет обрабатываться аудитом файловой системы и будет проверяться только в системных вызовах, связанных с файловой системой.

ПРИМЕРЫ

Вывести все системные вызовы, используемые определенным процессом:

# По pid:
auditctl -a always,exit -S all -F pid=1005
# По пути к исполняемому файлу
auditctl -a always,exit -S all -F exe=/usr/bin/ls

Вывести все файлы, открытые определенным пользователем:

auditctl -a always,exit -S openat -F auid=510

Вывести неудачные попытки вызова openat:

auditctl -a always,exit -S openat -F success=0

Отслеживать изменения файла (2 способа):

auditctl -w /etc/shadow -p wa
auditctl -a always,exit -F path=/etc/shadow -F perm=wa

Отслеживать изменения в каталогах рекурсивно (2 способа):

auditctl -w /etc/ -p wa
auditctl -a always,exit -F dir=/etc/ -F perm=wa

Вывести попытки администратора получить доступ к файлам других пользователей:

auditctl -a always,exit -F dir=/home/ -F uid=0 -C auid!=obj_uid

ОТКЛЮЧЕНО ПО УМОЛЧАНИЮ

Во многих системах auditd настроен на установку правила -a never,task по умолчанию. Это правило приводит к тому, что каждый новый процесс пропускает всю обработку правил аудита. Обычно это делается для того, чтобы избежать небольших затрат на производительность, связанных с аудитом системных вызовов. Если вы хотите использовать auditd, вам нужно удалить это правило, удалив файл 10-no-audit.rules и добавив файл 10-base-config.rules в каталог правил аудита.

Если вы определили правила аудита, которые не совпадают, когда они должны совпадать, проверьте auditctl -l, чтобы убедиться, что там нет правила never,task.

ФАЙЛЫ

/etc/audit/audit.rules, /etc/audit/audit-stop.rules

СМОТРИТЕ ТАКЖЕ

audit.rules(7), ausearch(8), aureport(8), auditd(8).

АВТОР

Стив Граб (Steve Grubb)

ПЕРЕВОД

Русский перевод этой страницы руководства: Александра Богданова <support@astralinux.ru>

Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .