auditctl(8)
| AUDITCTL:(8) | Системное администрирование | AUDITCTL:(8) |
ИМЯ
auditctl - инструмент для управления аудитом, предоставляемого Linux ядром.
ОБЗОР
auditctl [опции]
ОПИСАНИЕ
auditctl используется для настройки параметров ядра, связанных с аудитом, для просмотра конфигурации аудита и для добавления/удаления правил аудита.
ОПЦИИ КОНФИГУРАЦИИ
- -b количество
- Установить максимальное количество буферов аудита (значение в ядре по умолчанию - 64). Если все буферы заполнены, то флаг сбоя будет выставлен ядром для его дальнейшей обработки.
- --backlog_wait_time время_ожидания
- Установить время ожидания для ядра достижения значения backlog_limit (значение в ядре по умолчанию - 60*HZ), прежде, чем ставить в очередь дополнительные события аудита для их передачи аудиту. Число должно быть больше или равно нулю, но меньше, чем десятикратное значение по умолчанию.
- -c
- Продолжать загружать правила, несмотря на ошибку. Суммирует результат загрузки правил. Код завершения будет ошибочным, если какое-либо правило не будет загружено.
- -D
- Удалить все правила и точки наблюдения. Может также принимать параметр -k.
- -e [0..2]
- Установить флаг блокировки. 0 - отключить аудит, 1 - включить аудит, 2 - защитить конфигурацию аудита от изменений. Для использования данной возможности необходимо внести данную команду последней строкой в audit.rules. После этой команды все попытки изменить конфигурацию будут отвергнуты с уведомлением в журналах аудита. В дальнейшем, чтобы задействовать новую конфигурацию аудита, необходимо перезагрузить систему.
- -f [0..2]
- Установить способ обработки для флага сбоя: 0=silent 1=printk 2=panic. Позволяет определить каким образом ядро будет обрабатывать критические ошибки. Например, флаг сбоя выставляется при следующих условиях: ошибки передачи в пространство службы аудита, превышение лимита буферов, ожидающих обработки, выход за пределы памяти ядра, превышение лимита скорости выдачи сообщений. Значение по умолчанию: 1. Для систем с повышенными требованиями к безопасности, может быть более предпочтительно значение 2.
- -h
- Краткая помощь по аргументам командной строки.
- -i
- Игнорировать ошибки при чтении правил из файла. В этом случае auditctl будет всегда возвращать успешный код завершения. Если этот параметр передан в качестве аргумента -s то привести, если это возможно, числа к удобочитаемому виду.
- --loginuid-immutable
- Сделать login UID неизменяемым сразу после его установки. Для изменения login UID требуется CAP_AUDIT_CONTROL, поэтому непривилигированный пользователь не может его изменить. Установка этого параметра может вызвать проблемы в некоторых контейнерах.
- -q точка-монтирования,поддерево
- При наличии точки наблюдения за каталогом и объединении или перемещении монтирования другого поддерева в наблюдаемое поддерево, необходимо указать ядру, сделать монтируемое поддерево эквивалентным просматриваемому каталогу. Если поддерево уже смонтировано во время создания точки наблюдения за каталогом, поддерево автоматически помечается для просмотра. Эти два значения разделяет запятая, отсутствие запятой приведет к ошибке.
- -r частота
- Установить ограничение скорости выдачи сообщений в секунду (0 - нет ограничения). Если эта частота не нулевая и она превышается в ходе аудита, ядром выставляется флаг сбоя для выполнения соответствующего действия. Значение по умолчанию: 0.
- --reset-lost
- Сбросить счетчик потерянных записей, отображаемых командой статуса.
- -R файл
- Читать правила из файла. Правила должны быть организованы следующим образом: располагаться по одному в строке и в том порядке, в каком должны исполняться. На файл накладываются следующие ограничения: владельцем должен быть root и доступ на чтение должен быть только у него; файл может содержать комментарии, начинающиеся с символа '#'; правила, расположенные в файле, идентичны тем, что набираются в командной строке, без указания 'auditctl' (так как auditctl - это тот, кто выполняет файл), и без экранирования символов подстановки (так как файл читает auditctl).
- -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 [список,действие|действие,список]
- Добавить правило с указанным действием к концу списка. Необходимо учитывать, что значения fIдействие и список разделены запятой, и ее отсутствие вызовет ошибку. Поля могут быть указаны в любом порядке. Ниже описаны имена доступных списков:
- 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, будет записано в аудит. Это означает, что наиболее вероятно использование этого фильтра с правилами, которые имеют действие "никогда", так как ничего не нужно делать, чтобы события были записаны.
- exclude
- Добавить правило к списку, отвечающего за фильтрацию событий определенного типа. Этот список используется, чтобы отфильтровывать ненужные события. Например, если вы не хотите видеть avc сообщения, вы должны использовать этот список. События могут быть исключены по идентификатору процесса, идентификатору пользователя, идентификатору группы, идентификатору логина пользователя, типу сообщения или контексту объекта. Действие игнорируется и по умолчанию используется значение "never" ("никогда").
Ниже описаны доступные действия для правил:
- never
- Аудит не будет генерировать никаких записей. Может быть использовано для подавления генерации событий. Обычно необходимо подавлять генерацию вверху списка, а не внизу, поскольку событие инициируется на первом совпавшем правиле.
- always
- Установить контекст аудита. Всегда заполнять его во время входа в системный вызов, и всегда генерировать запись во время выхода из системного вызова.
- -A список,действие
- Добавить правило с указанным действием в начало списка.
- -C [f=f | f!=f]
- Создать правило сравнения между полями: поле, операция, поле. Можно передавать несколько сравнений в одной командной строке. Каждое из них должно начинаться с -C. Каждое правило сравнения добавляется друг к другу, а также к правилам начинающимся с -F для инициирования записи аудита. Поддерживаются 2 оператора - равно и не равно. Допустимые поля:
- auid, uid, euid, suid, fsuid, obj_uid; и gid, egid, sgid, fsgid, obj_gid
- -d список,действие
- Удалить правило с указанным действием из списка. Правило удаляется только в том случае, если полностью совпали и имя системного вызова и поля сравнения.
- -F [n=v | n!=v | n<v | n>v | n<=v | n>=v | n&v | n&=v]
- Задать поле сравнения для правила. Атрибуты поля следующие: объект, операция, значение. В одной команде допускается задавать до 64 полей сравнения. Каждое новое поле должн начинаться с -F. Аудит будет генерировать запись, если произошло совпадение по всем полями сравнения. Допустимо использование одного из следующих 8 операторов: равно, не равно, меньше, больше, меньше либо равно, больше либо равно, битовая маска (n&v) и битовая проверка (n&=v). Битовая проверка выполняет операцию 'and' над значениями и проверяет, равны ли они. Битовая маска просто выполняет операцию 'and'. Поля, оперирующие с идентификатором пользователя, могут также работать с именем пользователя - программа автоматически получит идентификатор пользователя из его имени. То же самое можно сказать и про имя группы. Поля сравнения могут быть заданы для следующих объектов:
- a0, a1, a2, a3
- Четыре первых аргумента, переданных системному вызову. Строковые аргументы не поддерживаются. Это связано с тем, что ядро должно получать указатель на строку, а проверка поля по значению адреса указателя не желательна. Таким образом, необходимо использовать только цифровые значения.
- arch
- Архитектура процессора, на котором выполняется системный вызов. Для определения архитектуры необходимо использовать команду 'uname -m'. В случае если архитектура машины неизвестна, однако необходимо использовать таблицу 32-х битных системных вызовов, и машина поддерживает 32 бита, можно использовать b32. Аналогичным образом применяется таблица системных вызовов b64. Можно написать правила, которые в некоторой степени не зависят от архитектуры, потому что тип будет определяться автоматически. Однако системные вызовы могут зависеть от архитектуры, и то, что доступно на x86_64, может быть недоступно на PPC. Директива arch должна предшествовать опции -S, чтобы auditctl знал, какую внутреннюю таблицу использовать для поиска номеров системных вызовов.
- auid
- Оригинальный идентификатор, с которым пользователь вошел в систему. Это аббревиатура: audit uid. Можно использовать либо имя пользователя, либо идентификатор пользователя.
- devmajor
- Главный номер устройства (Device Major Number).
- devminor
- Вспомогательный номер устройства (Device Minor Number).
- dir
- Полный путь к каталогу для создания точки наблюдения. Помещает точку наблюдения в каталог и рекурсивно во все его поддерево. Можно использовать только в списке exit. См. описание опции "-w".
- egid
- Действительный идентификатор группы. Можно использовать либо идентификатор, либо имя группы.
- euid
- Действительный идентификатор пользователя. Можно использовать либо идентификатор, либо имя пользователя.
- exe
- Абсолютный путь к приложению, к которому будет применяться это правило. Можно использовать только в списке exit.
- exit
- Значение, возвращаемое системным вызовом при выходе. Если кодом выхода является errno, можно также использовать текстовое представление.
- fsgid
- Идентификатор группы, применяемый к файловой системе. Можно использовать либо идентификатор, либо имя группы.
- fsuid
- Идентификатор пользователя, применяемый к файловой системе. Можно использовать либо идентификатор, либо имя пользователя.
- filetype
- Тип целевого файла: файл, каталог, сокет, ссылка, символ, блок или FIFO.
- gid
- Идентификатор группы. Можно использовать либо идентификатор, либо имя группы.
- inode
- Номер inode.
- key
- Альтернативный способ установить ключ фильтрации. См. выше описание опции -k.
- msgtype
- Используется для проверки совпадения с числом, описывающим тип сообщения. Может быть использован только в списках exclude и user.
- obj_uid
- UID объекта.
- obj_gid
- GID объекта.
- obj_user
- Имя пользователя-владельца ресурса (в контексте SELinux).
- obj_role
- Роль ресурса (в контексте SELinux).
- obj_type
- Тип ресурса (в контексте SELinux).
- obj_lev_low
- Нижний уровень ресурса (в контексте SELinux).
- obj_lev_high
- Верхний уровень ресурса (в контексте SELinux).
- path
- Полный путь к файлу для точки наблюдения. Может быть использован только в списке exit.
- perm
- Фильтр прав доступа для файловых операций. См. описание опции "-p". Может быть использован только в списке exit. Можно использовать без указания системного вызова, при этом ядро выберет системные вызовы, которые удовлетворяют запрашиваемым разрешениям.
- pers
- Персональный номер операционной системы.
- pid
- Идентификатор процесса.
- ppid
- Идентификатор родительского процесса.
- sessionid
- Идентификатор сеанса пользователя.
- subj_user
- Имя пользователя-владельца процесса (в контексте SELinux).
- subj_role
- Роль процесса (в контексте SELinux).
- subj_type
- Тип процесса (в контексте SELinux).
- subj_sen
- Чувствительность процесса (в контексте SELinux).
- subj_clr
- Допуск процесса (в контексте SELinux).
- sgid
- Установленный идентификатор группы. Подробнее об этом в руководстве getresgid(2).
- success
- Если значение, возвращаемое системным вызовом, больше либо равно 0, данный объект будет равен "true/yes", иначе "false/no". При создании правила следует использовать 1 вместо "true/yes" и 0 вместо "false/no".
- suid
- Установленный идентификатор пользователя. Подробнее об этом в руководстве getresuid(2).
- uid
- Идентификатор пользователя. Можно использовать либо идентификатор, либо имя пользователя.
- -k ключ
- Установить на правило ключ фильтрации. Ключ фильтрации - это произвольная текстовая строка длиной не больше 31 символа. Ключ помогает уникально идентифицировать записи, генерируемые в хода аудита за точкой наблюдения. Поиск значения ключа можно выполнить с помощью команды ausearch, чтобы независимо от того, какое правило вызвало событие, можно было найти его результаты. Ключ также можно использовать для удаления всех правил (-D), или правил с определенным ключом (-l). В правиле можно использовать несколько ключей, если необходимо иметь возможность поиска зарегистрированных событий несколькими способами или если применяется плагин audispd, который в своем анализе использует ключ.
- -p [r|w|x|a]
- Установить фильтр прав доступа для точки наблюдения. r=чтение, w=запись, x=исполнение, a=изменение атрибута. Не путайте эти права доступа с обычными правами доступа к файлу - они определяют типы системных вызовов, которые выполняют данные действия. Заметьте, что системные вызовы read и write не включены в этот набор, поскольку логи аудита были бы перегружены информацией о работе этих вызовов.
- -S [Имя или номер системного вызова|all]
- Любой номер или имя системного вызова может быть использован. Также возможно использование ключевого слова all. Если какой-либо процесс выполняет указанный системный вызов, то аудит генерирует соответствующую запись. В случае если значения полей сравнения заданы, а системный вызов не указан, правило будет применяться ко всем системным вызовам. В одном правиле может быть задано несколько системных вызовов (используя несколько параметров -S в одном правиле) - это положительно сказывается на производительности, поскольку заменяет обработку нескольких правил. Кроме того, список системных вызовов может быть передан через запятую. При работе в двухархитектурной системе, например x86_64, необходимо помнить, что auditctl просто берет текст, ищет его для собственной архитектуры и отправляет это правило в ядро. Если никаких дополнительных директив по архитектуре нет, правило БУДЕТ ПРИМЕНЯТЬСЯ К 32 И 64 БИТОВЫМ СИСТЕМНЫМ ВЫЗОВАМ. Это может иметь нежелательные последствия, поскольку нет гарантии того, что любой системный вызов имеет одинаковый номер на 32- и 64-разрядных интерфейсах. Следует написать 2 правила: одно для 32-битной архитектуры (b32), другое для 64-битной (b64), чтобы убедиться, что ядро находит все ожидаемые события. Для получения дополнительной информации см. описание поля arch.
- -w путь
- Добавить точку наблюдения за файловым объектом, находящемуся по указанному пути. Добавление точки наблюдения к каталогу верхнего уровня запрещено ядром. Групповые символы (wildcards) также не могут быть использованы, попытки их использования будут генерировать предупреждающее сообщение. Внутренне точки наблюдения реализованы как слежение за inode. Установка точки наблюдения за файлом аналогична использованию параметра path в правиле системного вызова -F. Установка точки наблюдения за каталогом аналогична использованию параметра dir в правиле системного вызова -F. Форма -w предназначена для обратной совместимости, а форма на основе системного вызова более выразительна. В противоположность к правилам аудита системных вызовов, точки наблюдения не оказывают влияния на производительность, связанную с количеством правил посылаемых в ядро. Единственными допустимыми параметрами при использовании точек наблюдения являются -p и -k. Если необходим аудит чего-то необычного, например определенного пользователя обращающегося к файлу, следует использовать аудит системных вызовов с полями path или dir. В разделе ПРИМЕРЫ приведен пример преобразования одной формы в другую.
- -W путь
- Удалить точку наблюдения за файловым объектом, находящемуся по указанному пути. Правило должно точно совпадать. Для получения дополнительной информации см. описание параметра -d.
СОВЕТЫ ПО ИСПОЛЬЗОВАНИЮ
Правила системных вызовов оцениваются для каждого системного вызова каждой программы. При наличии 10 правил системных вызовов, каждая программа в системе будет задержана во время системного вызова, пока система аудита оценивает каждое правило. Большое количество системных вызовов негативно отразиться на производительности. Можно объединять правила если фильтр, действие, ключ и поля совпадают. Например:
auditctl -a always,exit -S openat -F success=0
auditctl -a always,exit -S truncate -F success=0
может быть переписано как одно правило:
auditctl -a always,exit -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
При этом производительность будет выше, так как ядро не будет оценивать каждый системный вызов. Он будет обрабатываться аудитом файловой системы и будет проверяться только в системных вызовах, связанных с файловой системой.
ПРИМЕРЫ
Чтобы увидеть все системные вызовы, используемые определенным процессом:
auditctl -a always,exit -S all -F pid=1005
Чтобы увидеть все файлы, открытые определенным пользователем:
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
Чтобы отслеживать попытки администратора получить доступ к файлам других пользователей:
auditctl -a always,exit -F dir=/home/ -F uid=0 -C auid!=obj_uid
ФАЙЛЫ
- /etc/audit/audit.rules
СМ. ТАКЖЕ
АВТОР
Стив Граб (Steve Grubb)
ПЕРЕВОД
Перевод с английского Alexander Kolotov (alexandr.kolotov@gmail.com) 2007
Перевод с английского Елена Мишина <lepata@altlinux.org> 2019
| Январь 2017 | Red Hat |
