---
description: 'В FreeBSD поддерживается аудит событий безопасности, обеспечивающий надежное, детализированное и настраиваемое журналирование различных системных событий, связанных с безопасностью, включая входы в систему, изменения конфигурации, а также доступ к файлам и сети'
next: books/handbook/disks
params:
  path: /books/handbook/audit/
part: 'Часть III. Администрирование системы'
prev: books/handbook/mac
showBookMenu: true
tags: ["audit", "terms", "configuration", "guide", "audit trails"]
title: 'Глава 19. Аудит событий безопасности'
weight: 23
---

[[audit]]
= Аудит событий безопасности
:doctype: book
:toc: macro
:toclevels: 1
:icons: font
:sectnums:
:sectnumlevels: 6
:sectnumoffset: 19
:partnums:
:source-highlighter: rouge
:experimental:
:images-path: books/handbook/audit/

ifdef::env-beastie[]
ifdef::backend-html5[]
:imagesdir: ../../../../images/{images-path}
endif::[]
ifndef::book[]
include::shared/authors.adoc[]
include::shared/mirrors.adoc[]
include::shared/releases.adoc[]
include::shared/attributes/attributes-{{% lang %}}.adoc[]
include::shared/{{% lang %}}/teams.adoc[]
include::shared/{{% lang %}}/mailing-lists.adoc[]
include::shared/{{% lang %}}/urls.adoc[]
toc::[]
endif::[]
ifdef::backend-pdf,backend-epub3[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]
endif::[]

ifndef::env-beastie[]
toc::[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]

[[audit-synopsis]]
== Обзор

Операционная система FreeBSD включает поддержку аудита событий безопасности. Аудит событий обеспечивает надежное, детализированное и настраиваемое журналирование различных системных событий, связанных с безопасностью, включая входы в систему, изменения конфигурации, доступ к файлам и сети. Эти записи журнала могут быть неоценимыми для мониторинга системы в реальном времени, обнаружения вторжений и "посмертного" анализа после краха системы. FreeBSD реализует опубликованный Sun(TM) программный интерфейс Basic Security Module (BSM) и формат файлов, и также совместима с реализациями аудита Solaris(TM) и Mac OS(R) X.

Эта глава посвящена установке и настройке аудита событий. В ней объясняются политики аудита и приводится пример конфигурации аудита.

Прочитав эту главу, вы будете знать:

* Что такое аудит событий и как он работает.
* Как настроить аудит событий в FreeBSD для пользователей и процессов.
* Как просмотреть журнал аудита с использованием инструментов сокращения и просмотра аудита.

Прежде чем читать эту главу, вы должны:

* Понимать основы UNIX(R) и FreeBSD (crossref:basics[basics,Основы FreeBSD]).
* Быть знакомым с основами настройки и компиляции ядра (crossref:kernelconfig[kernelconfig,Настройка ядра FreeBSD]).
* Иметь некоторое представление о безопасности и о том, как она относится к FreeBSD (crossref:security[security,Безопасность]).

[WARNING]
====
У системы аудита есть несколько известных ограничений. Не все связанные с безопасностью системные события подлежат аудиту, а некоторые механизмы входа, такие как дисплейные менеджеры на основе Xorg и сторонние демоны, не настраивают аудит для сеансов пользовательского входа должным образом.

Система аудита событий безопасности способна создавать очень подробные журналы активности системы. На загруженной системе данные файлов журналов могут быть очень большими при настройке высокой детализации, в некоторых конфигурациях превышая гигабайты в неделю. Администраторы должны учитывать требования к дисковому пространству, связанные с конфигурациями аудита с высоким объемом данных. Например, может быть целесообразно выделить отдельную файловую систему для [.filename]#/var/audit#, чтобы другие файловые системы не пострадали, если файловая система аудита переполнится.
====

[[audit-inline-glossary]]
== Ключевые термины

Следующие термины связаны с аудитом событий безопасности:

* _событие (event)_: аудируемое событие — это любое событие, которое может быть зарегистрировано с помощью подсистемы аудита. Примерами событий, связанных с безопасностью, являются создание файла, установка сетевого соединения или вход пользователя в систему. События могут быть "приписываемые", то есть их можно отследить до аутентифицированного пользователя, или "неприписываемые". Примерами неприписываемых событий являются любые события, происходящие до аутентификации в процессе входа в систему, например, неудачные попытки ввода пароля.
* _класс (class)_: именованный набор связанных событий, используемых в выражениях выбора. Распространённые классы событий включают "создание файла" (fc), "выполнение" (ex) и "вход/выход" (lo).
* _запись (record)_: запись в журнале аудита, описывающая событие безопасности. Записи содержат тип события, информацию о субъекте (пользователе), выполняющем действие, данные о дате и времени, информацию об объектах или аргументах, а также указание на успешность или неудачу выполнения.
* _журнал (trail)_: файл журнала, состоящий из серии записей аудита, описывающих события безопасности. Записи в журнале расположены в приблизительном хронологическом порядке относительно времени завершения событий. Только авторизованные процессы имеют право добавлять записи в журнал аудита.
* _выражение выбора (selection expression)_: строка, содержащая список префиксов и имен классов событий аудита, используемых для сопоставления событий.
* _предварительный выбор (preselection)_: процесс, в ходе которого система определяет, какие события представляют интерес для администратора. Конфигурация предварительного отбора использует ряд выражений выбора для определения классов событий, подлежащих аудиту для конкретных пользователей, а также глобальные настройки, применяемые как к авторизованным, так и к неавторизованным процессам.
* _фильтрация (reduction)_: процесс выбора записей из существующих журналов аудита для сохранения, печати или анализа. Аналогично, процесс удаления нежелательных записей аудита из журнала. Используя сокращение, администраторы могут реализовать политики сохранения данных аудита. Например, детальные журналы аудита могут храниться в течение одного месяца, но после этого они могут быть сокращены, чтобы сохранить только информацию о входах в систему для архивных целей.

[[audit-config]]
== Настройка аудита

Поддержка аудита событий в пользовательском пространстве устанавливается как часть базовой операционной системы FreeBSD. Поддержка на уровне ядра доступна в ядре [.filename]#GENERIC# по умолчанию, и man:auditd[8] может быть включен добавлением следующей строки в [.filename]#/etc/rc.conf#:

[.programlisting]
....
auditd_enable="YES"
....

Затем запустите демон аудита:

[source, shell]
....
# service auditd start
....

Пользователи, предпочитающие компилировать собственное ядро, должны включить следующую строку в файл конфигурации своего ядра:

[.programlisting]
....
options	AUDIT
....

=== Выражения выбора событий

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

crossref:audit[event-selection,Классы событий аудита по умолчанию] содержит сводку классов событий аудита по умолчанию:

[[event-selection]]
.Классы событий аудита по умолчанию
[cols="1,1,1", frame="none", options="header"]
|===
| Имя класса
| Описание
| Действие

|all
|all
|Совпадает со всеми классами событий.

|aa
|authentication and authorization
| 

|ad
|administrative
|Административные действия, выполняемые с системой в целом.

|ap
|application
|Определенное приложением действие.

|cl
|file close
|Аудит вызовов системного вызова `close`.

|ex
|exec
|Аудит выполнения программ. Аудит аргументов командной строки и переменных окружения контролируется через man:audit_control[5] с использованием параметров `argv` и `envv` в настройке `policy`.

|fa
|file attribute access
|Аудит доступа к атрибутам объектов, таким как man:stat[1] и man:pathconf[2].

|fc
|file create
|События аудита, в результате которых создается файл.

|fd
|file delete
|Аудит событий, в которых происходит удаление файлов.

|fm
|file attribute modify
|События аудита, связанные с изменением атрибутов файлов, например, с помощью man:chown[8], man:chflags[1] и man:flock[2].

|fr
|file read
|События аудита, в которых данные читаются или файлы открываются для чтения.

|fw
|file write
|События аудита, в которых данные записываются или файлы создаются либо изменяются.

|io
|ioctl
|Контроль использования системного вызова `ioctl`.

|ip
|ipc
|Аудит различных форм межпроцессного взаимодействия, включая POSIX-каналы и операции System V IPC.

|lo
|login_logout
|Audit man:login[1] и man:logout[1] события.

|na
|non attributable
|Аудит неприписываемых событий.

|no
|ошибочный класс
|Не соответствует ни одному событию аудита.

|nt
|network
|События аудита, связанные с сетевыми действиями, такими как man:connect[2] и man:accept[2].

|ot
|other
|Аудит различных событий.

|pc
|process
|Аудит операций процессов, таких как man:exec[3] и man:exit[3].
|===

Эти классы событий аудита могут быть настроены путем изменения конфигурационных файлов [.filename]#audit_class# и [.filename]#audit_event#.

Каждый класс событий аудита может быть объединен с префиксом, указывающим, соответствуют ли успешные/неудачные операции, и добавляется или удаляется запись для соответствия классу и типу. В crossref:audit[event-prefixes,Префиксы для классов событий аудита] приведены доступные префиксы:

[[event-prefixes]]
.Префиксы для классов событий аудита
[cols="1,1", frame="none", options="header"]
|===
| Префикс
| Действие

|+
|Аудит успешных событий в этом классе.

|-
|Аудит неудачных событий в этом классе.

|^
|Не аудировать ни успешные, ни неудачные события в этом классе.

|^+
|Не аудировать успешные события в данном классе.

|^-
|Не аудировать неудачные события в этом классе.
|===

Если префикс отсутствует, будут аудироваться как успешные, так и неудачные экземпляры события.

Следующая строка выбора выбирает как успешные, так и неудачные события входа/выхода, но только успешные события выполнения:

[.programlisting]
....
lo,+ex
....

=== Файлы конфигурации

В каталоге [.filename]#/etc/security# находятся следующие файлы конфигурации для аудита событий безопасности:

* [.filename]#audit_class#: содержит определения классов аудита.
* [.filename]#audit_control#: управляет аспектами подсистемы аудита, такими как классы аудита по умолчанию, минимальное свободное место на томе с журналом аудита и максимальный размер журнала аудита.
* [.filename]#audit_event#: текстовые названия и описания системных событий аудита, а также список классов, к которым относится каждое событие.
* [.filename]#audit_user#: пользовательские требования аудита, которые объединяются с глобальными настройками по умолчанию при входе в систему.
* [.filename]#audit_warn#: настраиваемый сценарий оболочки, используемый man:auditd[8] для генерации предупреждающих сообщений в исключительных ситуациях, например, когда заканчивается место для записей аудита или когда файл журнала аудита был перезаписан.

[WARNING]
====
Файлы конфигурации аудита следует редактировать и поддерживать тщательно, так как ошибки в конфигурации могут привести к некорректной записи событий.
====

В большинстве случаев администраторам потребуется изменить только файлы [.filename]#audit_control# и [.filename]#audit_user#. Первый файл управляет системными настройками и политиками аудита, а второй может использоваться для тонкой настройки аудита по пользователям.

[[audit-auditcontrol]]
==== Файл [.filename]#audit_control#

Некоторые параметры подсистемы аудита по умолчанию указаны в файле [.filename]#audit_control#:

[.programlisting]
....
dir:/var/audit
dist:off
flags:lo,aa
minfree:5
naflags:lo,aa
policy:cnt,argv
filesz:2M
expire-after:10M
....

Запись `dir` используется для указания одного или нескольких каталогов, в которых будут храниться журналы аудита. Если указано несколько каталогов, они будут использоваться по очереди по мере заполнения. Обычно настраивают аудит так, чтобы журналы хранились на выделенной файловой системе — это предотвращает конфликты между подсистемой аудита и другими подсистемами при заполнении файловой системы.

Если поле `dist` установлено в `on` или `yes`, жесткие ссылки будут созданы для всех файлов журнала в [.filename]#/var/audit/dist#.

Поле `flags` устанавливает системную маску предварительного выбора по умолчанию для учитываемых событий. В приведённом примере аудиту подлежат успешные и неудачные события входа/выхода, а также аутентификация и авторизация для всех пользователей.

Запись `minfree` определяет минимальный процент свободного места в файловой системе, где хранится журнал аудита.

Запись `naflags` определяет классы аудита для событий без атрибутов, таких как процесс входа/выхода, аутентификация и авторизация.

Запись `policy` определяет список флагов политики, разделённых запятыми, которые контролируют различные аспекты поведения аудита. Флаг `cnt` указывает, что система должна продолжать работу, несмотря на сбой аудита (этот флаг настоятельно рекомендуется). Другой флаг, `argv`, приводит к аудиту аргументов командной строки системного вызова man:execve[2] как части выполнения команды.

`filesz` указывает максимальный размер файла аудита перед автоматическим завершением и ротацией файла. Значение `0` отключает автоматическую ротацию логов. Если запрашиваемый размер файла меньше минимального значения в 512k, он будет проигнорирован, и будет сгенерировано сообщение в логе.

Поле `expire-after` указывает, когда файлы журналов аудита устареют и будут удалены.

[[audit-audituser]]
==== Файл [.filename]#audit_user#

Администратор может указать дополнительные требования аудита для конкретных пользователей в файле [.filename]#audit_user#. Каждая строка настраивает аудит для пользователя с помощью двух полей: поле `alwaysaudit` определяет набор событий, которые всегда должны аудироваться для пользователя, а поле `neveraudit` определяет набор событий, которые никогда не должны аудироваться для пользователя.

Следующие примеры записей аудита фиксируют события входа/выхода и успешного выполнения команд для пользователя `root`, а также создание файлов и успешное выполнение команд для пользователя `www`. Если используется файл [.filename]#audit_control# по умолчанию, запись `lo` для `root` избыточна, и события входа/выхода также будут фиксироваться для `www`.

[.programlisting]
....
root:lo,+ex:no
www:fc,+ex:no
....

[[audit-administration]]
== Работа с журналами аудита

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

Например, чтобы вывести всё содержимое указанного журнала аудита в виде обычного текста:

[source, shell]
....
# praudit /var/audit/AUDITFILE
....

Где _AUDITFILE_ — файл журнала аудита для дампа.

Журналы аудита состоят из последовательности записей аудита, сформированных из токенов, которые `praudit` выводит последовательно, по одному на строку. Каждый токен имеет определённый тип, например, `header` (заголовок записи аудита) или `path` (путь к файлу из поиска по имени). Ниже приведён пример события `execve`:

[.programlisting]
....
header,133,10,execve(2),0,Mon Sep 25 15:58:03 2006, + 384 msec
exec arg,finger,doug
path,/usr/bin/finger
attribute,555,root,wheel,90,24918,104944
subject,robert,root,wheel,root,wheel,38439,38032,42086,128.232.9.100
return,success,0
trailer,133
....

Этот аудит представляет успешный вызов `execve`, в котором была выполнена команда `finger doug`. Токен `exec arg` содержит обработанную командную строку, переданную оболочкой ядру. Токен `path` содержит путь к исполняемому файлу, найденный ядром. Токен `attribute` описывает бинарный файл и включает режим файла. Токен `subject` хранит аудитный идентификатор пользователя, эффективные идентификаторы пользователя и группы, реальные идентификаторы пользователя и группы, идентификатор процесса, идентификатор сессии, идентификатор порта и адрес входа. Обратите внимание, что аудитный идентификатор пользователя и реальный идентификатор пользователя различаются, так как пользователь `robert` переключился на учетную запись `root` перед выполнением этой команды, но аудит ведется с использованием исходного аутентифицированного пользователя. Токен `return` указывает на успешное выполнение, а `trailer` завершает запись.

Также поддерживается формат вывода XML, и он может быть выбран добавлением опции `-x`.

Поскольку журналы аудита могут быть очень большими, можно выбрать подмножество записей с помощью `auditreduce`. В этом примере выбираются все записи аудита, созданные для пользователя `trhodes`, хранящиеся в [.filename]#AUDITFILE#:

[source, shell]
....
# auditreduce -u trhodes /var/audit/AUDITFILE | praudit
....

Участники группы `audit` имеют право читать журналы аудита в [.filename]#/var/audit#. По умолчанию эта группа пуста, поэтому только пользователь `root` может читать журналы аудита. Пользователи могут быть добавлены в группу `audit` для делегирования прав просмотра аудита. Поскольку возможность отслеживать содержимое журналов аудита дает значительное представление о поведении пользователей и процессов, рекомендуется делегировать права просмотра аудита с осторожностью.

=== Мониторинг в реальном времени с использованием потоков аудита

Потоки аудитные (audit pipes) являются клонируемыми псевдоустройствами, которые позволяют приложениям получать доступ к потоку записей аудита в реальном времени. В первую очередь это интересно разработчикам систем обнаружения вторжений и мониторинга. Однако аудитное канальное устройство — это удобный способ для администратора организовать мониторинг в реальном времени без проблем с правами владения файлами аудита или прерывания потока событий из-за ротации логов. Для отслеживания живого потока событий аудита:

[source, shell]
....
# praudit /dev/auditpipe
....

По умолчанию узлы устройств потоков аудита доступны только пользователю `root`. Чтобы сделать их доступными для членов группы `audit`, добавьте правило `devfs` в [.filename]#/etc/devfs.rules#:

[.programlisting]
....
add path 'auditpipe*' mode 0440 group audit
....

За дополнительной информацией о настройке файловой системы devfs см. man:devfs.rules[5].

[WARNING]
====
Легко создать циклы обратной связи с событиями аудита, когда просмотр каждого события аудита приводит к генерации новых событий аудита. Например, если аудируется весь сетевой ввод-вывод, и `praudit` запускается из сессии SSH, будет создаваться непрерывный поток событий аудита с высокой скоростью, так как каждое выводимое событие будет генерировать новое событие. По этой причине рекомендуется запускать `praudit` на устройстве аудит-канала из сеансов без детального аудита ввода-вывода.
====

=== Ротация и сжатие файлов журнала аудита

Журналы аудита создаются ядром и управляются демоном аудита man:auditd[8]. Администраторам не следует пытаться использовать man:newsyslog.conf[5] или другие инструменты для непосредственной ротации журналов аудита. Вместо этого следует использовать `audit` для остановки аудита, переконфигурации системы аудита и выполнения ротации журналов. Следующая команда заставляет демон аудита создать новый журнал аудита и передать ядру сигнал о переходе на использование нового журнала. Старый журнал будет завершен и переименован, после чего администратор может выполнить с ним необходимые действия:

[source, shell]
....
# audit -n
....

Если man:auditd[8] в данный момент не запущен, эта команда завершится ошибкой и будет выведено сообщение об ошибке.

Добавление следующей строки в [.filename]#/etc/crontab# позволит выполнять эту ротацию каждые двенадцать часов:

[.programlisting]
....
0     */12       *       *       *       root    /usr/sbin/audit -n
....

Изменение вступит в силу после сохранения файла [.filename]#/etc/crontab#.

Автоматическая ротация файла журнала аудита на основе размера файла возможна с использованием `filesz` в [.filename]#audit_control#, как описано в crossref:audit[audit-auditcontrol,Файл audit_control].

Поскольку файлы журналов аудита могут становиться очень большими, часто возникает необходимость сжимать или архивировать их после закрытия демоном аудита. Скрипт [.filename]#audit_warn# можно использовать для выполнения пользовательских операций при различных событиях, связанных с аудитом, включая корректное завершение журналов при их ротации. Например, следующее можно добавить в [.filename]#/etc/security/audit_warn# для сжатия журналов аудита после закрытия:

[.programlisting]
....
#
# Compress audit trail files on close.
#
if [ "$1" = closefile ]; then
        gzip -9 $2
fi
....

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