Использование OpenBSM для аудита FreeBSD


Несколько слов о OpenBSM.

Одна из заявленных новинок в FreeBSD 6.2 - подсистема аудита OpenBSM, пришедшая к нам из проекта TrustedBSD. OpenBSM - это открытая
реализация стандарта BSM компании Sun, который описывает множество системных вызовов и интерфейсов, необходимых для управления аудитом системы, а также формат файлов аудита. OpenBSM была расширена по сравнению с Sun BSM для поддержки аудита специфических возможностей FreeBSD и MacOSX. Реализация OpenBSM была изначально выполнена компанией McAfee Research, по заказу Apple в 2004 году (для MacOSX), после чего исходники были переданы в проект TrustedBSD для адаптации в другие BSD системы.

Включение OpenBSM

Включённая в FreeBSD 6.2 поддержка OpenBSM имеет экспериментальный статус , и как показали тесты - не зря. Если вы хотите использовать OpenBSM я советую обновить вашу ОС до -STABLE, так как версия включённая в 6.2 у меня работала не совсем корректно. Для того, чтобы включить поддержку OpenBSM вам потребуется добавить "options AUDIT" в файл конфигурации ядра, пересобрать его и добавить в файл /etc/rc.conf команду auditd_enable='YES' и перезагрузить ОС с новым ядром. Насколько мне известно, в FreeBSD 7.0 опция AUDIT будет присутствовать в GENERIC ядре, так что компилировать ядро и перезагружаться не потребуется.

Конфигурация BSM.

В сети существует множество статей по использованию Solaris BSM, которые, вобщем-то, вполне подходят и для FreeBSD. Также достаточно
информации содержат соответствующие man файлы и handbook, так что я постараюсь лишь кратко описать принципы конфигурации OpenBSM.

Системные события, которые могут использоваться в системе аудита перечислены в файле /etc/security/audit_event.

Каждое событие аудита (audit event) может принадлежать классу или нескольким классам аудита (audit class). Это сделано для того, чтобы администратор мог легко работать с большим количеством событий.
Соответствие событий и классов также задаётся в файле audit_event. У каждого класса есть свой номер и флаг, которые задаются в файле audit_class. Также определён специальный класс "all", к которому относятся все события аудита и no, пустой класс.

По умолчанию в FreeBSD заданы такие классы аудита:

0x00000000:no: invalid class
0x00000001:fr:чтение файлов
0x00000002:fw:запись файлов
0x00000004:fa:доступ к атрибутам файлов
0x00000008:fm:модификация атрибутов
0x00000010:fc:создание файлов
0x00000020:fd:удаление файлов
0x00000040:cl:закрытие файлов
0x00000080:pc:процессы
0x00000100:nt:сетевая активность
0x00000200:ip:взаимодействие процессов (IPC)
0x00000400:na:прочее
0x00000800:ad:административные события
0x00001000:lo:login и logout
0x00004000:ap:приложения (пустой класс)
0x20000000:io:вызовы ioctl
0x40000000:ex:exec, exit и т.п.
0x80000000:ot:разное
0xffffffff:all:все события

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

# egrep '[:,]fa' /etc/security/audit_event

Флаги могут использоваться с префиксами +(успешное выполнение), -(сбой) и ^(кроме), а также ^+ (не записывать успешное выполнение) и ^-(кроме сбоев). Так +fr относится к успешным попыткам чтения файла, -lo - ошибка в событиях login/logout, а all,^ex обозначает все события, кроме
выполнения программ.

Настройки общесистемного аудита находятся в файле audit_control. Ниже приведён файл настроек по умолчанию:

dir:/var/audit
flags:lo
minfree:20
naflags:lo
policy:cnt
filesz:0

dir:/var/audit задаёт каталог для хранения журналов аудита. flags:lo означает, что мы хотим записывать login/logout события для всех пользователей системы. naflags содержит классы событий, которые мы хотим записывать в случае если событие не может быть отнесено к какому либо пользователю. minfree 20 - в случае, если свободного места на разделе audit`а осталось менее 20%, будет запущен скрипт для уведомления администратора. policy - специальные флаги, определяющие работу системы аудита. Например, cnt определяет, что процесс продолжит выполнение в случае если его события не могут быть записаны. Без этого флага процесс будет остановлен. И, наконец, filesz определяет максимальный размер (в байтах) файла аудита, после достижения которого журнал будет закрыт и открыт с другим именем (rotate). Важный момент - система аудита читает данные файлы при старте, поэтому в случае их изменения необходимо запустить команду 'audit -s', для того, чтобы изменения вступили в силу.

Также OpenBSM позволяет настраивать запись событий для выбранных пользователей. Для этого используется файл /etc/security/audit_user.

Настройки хранятся в виде:

имя_пользователя:классы_событий_для_аудита:классы_исключения
Например, строка

root:lo:no

обозначает что для пользователя root мы используем audit событий logon/logout, и не отключаем никаких дополнительных событий аудита.

samm:lo:+fr

обозначает, что несмотря на системные политики, мы всегда будем записывать login/logout события для пользователя samm и никогда не будем
записывать событие "успешное чтение файлов". Ещё несколько замечаний - в FreeBSD 6.2p5 данный файл обрабатывался некорректно, после обновления до 6-STABLE все заработало согласно документации. Кроме того, стоит учитывать, что файл audit_user используется системой во время входа пользователя, т.е. вы не можете изменять в audit_user политику для уже зарегистрированных в системе пользователей.

Просмотр журналов OpenBSM

OpenBSM сохраняет свои файлы в двоичном формате, в каталоге указанном в файле audit_control. По умолчанию это /var/audit. Имена файлов соответствуют маске YYYYMMDDHHmmss.YYYYMMDDHHmmss, которые указывают на время начала аудита и время окончания аудита. Активный (открытый auditd) файл аудита имеет окончание not_terminated, например 20070712092624.not_terminated. Запуск команды audit -n принудительно закрывает активный файл журнала и открывает новый. Для просмотра файлов журналов используется утилита praudit. Например:

root# praudit /var/audit/20070712092922.not_terminated

header,97,10,su(1),0,Thu Jul 12 12:30:58 2007, + 523 msec
subject,-1,root,samm,samm,samm,90190,90190,0,0.0.0.0
text,successful authentication
return,success,0
trailer,97

Также вы можете просматривать события аудита в реальном времени используя команду praudit /dev/auditpipe. Для того, чтобы предоставить
возможность выбора событий для отображения по заданным вами критериям, используется утилита auditreduce. Она позволяет задавать временной диапазон для выводимых событий, задавать классы для вывода, фильтровать
по uid/gid, пути файла и т.п. Также, читая статьи о Solaris BSM я наткнулся на утилиту bsmGUI.
Для её корректной работы в FreeBSD вам потребуется пропатчить auditreduce, см. PR bin/114534.
Тип лицензии утилиты - CDDL, что позволяет использовать её в
FreeBSD без каких либо проблем.

Замеченные проблемы и особенности работы

Утилита auditreduce корректно работает только с полным форматом даты.
Патч можно взять в PR bin/114534. если используется XDM, то все события попадают под subject "-1", т.е. система не может определить пользователя-владельца события.
Как я понял, требуется модификация XDM для решения данной проблемы.
Часть изменений требуют полного рестарта системы, login/logout, равно как и audit -s годится не для всех случаев. Уже запущенные процессы не
реагируют на изменеия политики аудита.

Заключение и некоторые рекомендации

Несомненно, OpenBSM это мощный и полезный инструмент, который может существенно увеличить безопасность вашей системы. Впрочем, стоит и соблюдать осторожность, например, с помощью OpenBSM можно легко создать "замкнутый круг", когда реакция на какое либо событие в реальном времени порождает другое событие для мониторинга, и ваша система будет тратить все процессорное время и место в журнале на подобные записи. Также стоит продумать политику хранения журналов. Многие источники советуют выделить для них отдельный раздел, думаю, что это оправданно. Также нельзя использовать newsyslog(8) для работы с OpenBSM лог файлами. Ну и помните, что в настоящее время подсистема ещё находится в экспериментальном (хоть и вполне работоспособном) состоянии, так что возможны разные неожиданности.

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

Alex Samorukov, samm@os2.kiev.ua

Обновлено: 12.03.2015