Аудит событий безопасности Tom Rhodes Автор Robert Watson Денис Баров Перевод на русский язык: Владимир Романов Обновление перевода: Краткий обзор AUDIT Аудит событий безопасности MAC Операционная система &os; включает в себя поддержку аудита событий безопасности. Аудит событий дает надежный и точный способ для протоколирования различных событий, связанных с безопасностью, включая входы в систему, изменения конфигурации, доступ к файлам и сети. Эти записи могут быть незаменимы для мониторинга функционирующей системы, обнаружения вторжений и для анализа событий, приведших к краху системы. В &os; реализован опубликованный &sun; BSM API и формат файла, который совместим с реализациями аудита в &sun; &solaris; и &apple; &macos; X. В этой главе описывается, в основном, процесс установки и конфигурирования системы аудита. В том числе, приводится разъяснение политик аудита, а так же даются примеры конфигурационных файлов. После прочтения этой главы вы будете знать: Что такое система аудита и как она работает. Как настроить аудит во &os; для мониторинга пользователей и процессов. Как просматривать журнал аудита, использовать ограничения по размеру и специальные инструменты для его просмотра. Перед прочтением этой главы вы должны: Понимать основы &unix; и &os; (). Уметь конфигурировать и компилировать ядро (). Понимать основные принципы безопасности в применении к операционной системе &os; (). Реализация аудита имеет известные ограничения, например, не все события в настоящий момент протоколируемы. Например, некоторые механизмы входа в систему (Основанные на X11 оконные менеджеры, многое программное обеспечение от сторонних производителей) не сконфигурированы для протоколирования событий входа в систему через подсистему аудита. Использование системы аудита может привести к генерированию огромных журнальных файлов: их размер на сильно загруженных серверах в некоторых конфигурациях может достигать нескольких гигабайт в неделю. Администраторы должны принимать во внимание требования к дисковому пространству для нагруженных конфигураций системы аудита. Например, рекомендуется выделить отдельный раздел для файловой системы аудита /var/audit, чтобы переполнение раздела аудита не влияло на работоспособность всей остальной системы. Ключевые понятия в Данной Главе. Перед чтением этой главы необходимо определить несколько ключевых понятий. В русской версии документа приводятся близкий по смыслу перевод и в скобках указывается оригинальный английский термин. событие (event): Событие, которое может быть занесено в журнал. Примеры важных для безопасности системы событий включает: создание файла, инициализацию сетевого соединения, вход пользователя в систему. События разделяются на приписываемые (attributable) - те, которые могут быть отнесены к конкретному пользователю - и не-приписываемые (non-attributable), если их нельзя отнести к конкретному пользователю. Пример не-приписываемого события - любое событие, произошедшее до аутентификации пользователя, такое, например, такое, как неудачный вход пользователя в систему. Класс (class): Классы событий это именованные наборы однотипных событий, которые используются в выражениях выбора. Частоиспользуемые классы событий включают создание файла (fc), выполнение файла (ex) и события входа в систему и выхода из нее (lo). Запись (record): Запись - это единичная запись в журнале, описывающая то или иное событие. Запись обычно содержит информацию о типе события, информацию о субъекте события (пользователе), который выполнил некоторое действия, дату и время события, информацию об объектах и аргументах события, если они есть, а также информацию об успешности выполнения операции, породившей событие. Журнал (trail): журнал аудита, или лог-файл - содержит серию записей о системных событиях. Как правило, журнал содержит записи в строгом хронологическом порядке по времени завершения события. Только авторизованные процессы могут добавлять записи в журнал. выражение выбора (selection expression): Строка, содержащая список префиксов и имен классов, используемая для выбора группы событий. предварительный выбор (preselection): Процесс, с помощью которого система определяет, какие события имеют важность для администратора. Это необходимо для того, чтобы избежать протоколирования событий, не имеющих никакой значимости. Предварительный выбор использует ряд выражений выбора для того, чтобы определить, какие именно классы событий для какого пользователя необходимо вносить в журнал, а так же глобальные настройки, которые будут применяться как для авторизованных, так и для неавторизованных процессов. Фильтрация (reduction): Процесс, в результате которого записи из существующего журнала выделяются для хранения, распечатки или анализа. Также, это процесс, в результате которого нежелательные записи удаляются из журнала аудита. Используя фильтрацию, администраторы могут реализовывать различные политики хранения данных аудита. Например, детализированный журнал может храниться месяц, но после этого он должен быть сокращен чтобы хранить только информацию о входе в систему и выходе из нее для целей архивации. Установка системы аудита Пользовательская часть подсистемы аудита устанавливается как часть базовой системы &os;. Поддержка аудита событий со стороны ядра также компилируется по умолчанию, но поддержка данной возможности требует создания своего ядра, с добавлением следующей строки в конфигурационный файл ядра: options AUDIT Процесс сборки и установки ядра подробно описан в главе . Как только ядро с поддержкой аудита было собрано и установлено, а система была перезагружена, необходимо разрешить запуск демона аудита, добавив следующую строку в &man.rc.conf.5;: auditd_enable="YES" Затем нужно запустить поддержку аудита либо путем перезагрузки, либо вручную, запустив демон аудита: service auditd start Настройка системы аудита Все конфигурационные файлы системы аудита находятся в каталоге /etc/security. Перед запуском демона аудита там должны находиться следующие файлы: audit_class - Содержит определения классов аудита. audit_control - Параметры системы аудита: классы по умолчанию, минимальное дисковое пространство, которое должно оставаться на разделе журнала аудита, максимальный размер журнала аудита и другие. audit_event - Текстовые имена и описания событий аудита, а также список, определяющий соответствие классов и событий, которые находятся в данных классах. audit_user - Требования аудита, которые отличаются для отдельных пользователей. Они соединяются с глобальными настройками по умолчанию при входе пользователя в систему. audit_warn - Скрипт командного интерпретатора, используемый &man.auditd.8;, чтобы сгенерировать предупреждающие сообщения об исключительных ситуациях, например, когда заканчивается свободное дисковое пространство для записей журналов аудита, либо когда произошла ротация файла журнала аудита. Файлы конфигурации аудита должны редактироваться и изменяться с осторожностью, так как ошибки в конфигурации могут привести к неправильному логу событий Выражения выбора событий Выражения выбора используются в нескольких местах конфигурации аудита для определения того, какие события должны подвергаться аудиту. Выражения содержат список классов событий, с которыми интересующее нас событие будет сравниваться. Каждое выражение имеет префикс, показывающий, нужно ли принять или игнорировать найденное событие, и, возможно, показывающий, интересуют ли нас успешные или неуспешные операции. Выражения выбора рассматриваются слева направа, и два выражения объединяются простым добавлением второго выражения к концу первого. Следующий список содержит классы по умолчанию, присутствующие в файле audit_class: all - all - Соответствует всем классам событий. 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 - Аудит вызовов системной функции &man.ioctl.2;. ip - ipc - Аудит различных видов взаимодействия процессов, включая создание не-именованных каналов (POSIX pipe) и взаимодействие процессов в стиле System V IPC. lo - login_logout - Аудит событий &man.login.1; и &man.logout.1;, происходящих в системе. na - non attributable - Аудит не-приписываемых событий. no - invalid class - Не соответствует никаким событиям аудита. nt - network - Аудит событий, связанных с сетевыми подключениями, например &man.connect.2; и &man.accept.2;. ot - other - Аудит различных событий. pc - process - Аудит действий процессов, таких как &man.exec.3; и &man.exit.3;. Эти классы событий могут быть настроены изменением конфигурационных файлов audit_class и audit_event. Каждый класс аудита комбинируется с префиксом, показывающим, какие операции будут учитываться - удачные или неудачные, а также то, включает ли данная запись аудит для данного класса и типа, либо отключает его. [пустой префикс] - Аудит проводится как для успешного, так и для ошибочного события. + - Аудит только успешных событий в данном классе. - - Аудит только ошибочных событий в данном классе. ^ - Отключение аудита как успешных, так и ошибочных событий в данном классе. ^+ - Отключение аудита успешных событий в данном классе. ^- - Отключение аудита ошибочных событий в данном классе. Следующий пример выбирает успешные и не-успешные события входа в систему и выхода из нее, и только успешные события исполнения файла: lo,+ex Конфигурационные файлы В большинстве случаев администратору придётся вносить изменения только в два конфигурационных файла системы аудита: audit_control и audit_user. Первый из них содержит общие настройки системы аудита, второй может использоваться для более тонкой настройки аудита пользователем. Файл <filename>audit_control</filename> Некоторые настройки по умолчанию для подсистемы аудита содержатся в файле audit_control: dir:/var/audit flags:lo minfree:20 naflags:lo policy:cnt filesz:0 Запись используется для установки одного или более каталогов, в которых будет сохраняться журнал системы аудита. Если указан более чем один каталог, то указанные каталоги будут использоваться по очереди, по мере заполнения. Как правило, система аудита конфигурируется таким образом, что журнал аудита хранится на отдельном разделе, чтобы предотвратить пересечение подсистемы аудита и остальных подсистем в случае, если свободное месте на разделе системы аудита будет исчерпано. Запись используется для установки глобальной маски предварительного выбора для приписываемых событий. В примере выше, будут подвергаться аудиту как успешные, так и неудачные попытки входа в систему и выхода из нее для всех пользователей Запись определяет минимальное значение свободного дискового пространства на разделе, в который сохраняются файлы журналов аудита. Когда данная граница будет превышена, будет сгенерировано предупреждение. Вышеприведенный пример устанавливает минимальное свободное пространство в двадцать процентов. Запись определяет классы аудита для не-приписываемых событий, например, процессов входа в систему и системных демонов. Запись определяет список флагов политики, определяющей различные аспекты поведения аудита. Элементы списка отделяются друг от друга запятыми. По умолчанию, флаг cnt указывает, что система должна продолжать работать, несмотря на ошибки аудита (данный флаг очень сильно рекомендуется использовать). Другой частоиспользуемый флаг - argv, который заставляет подвергать аудиту аргументы командной строки при вызове системного вызова &man.execve.2;, как часть выполнения команды. Запись определяет максимальный размер в байтах, до которого может расти журнал событий аудита, прежде чем он будет автоматически закончен и подвергнут ротации. По умолчанию, значение 0 запрещает автоматическую ротацию логов. Если требуемый размер файла ненулевой, но ниже минимального значения в 512К, то он будет проигнорирован, и будет сгенерировано предупреждающее сообщение в логах. Файл <filename>audit_user</filename> Администратор может определить дополнительные требования к аудиту для конкретных пользователей в файле audit_user. Каждая строка конфигурирует аудит для пользователя с использованием двух полей: первое поле alwaysaudit, которое определяет набор событий, которые должны всегда подвергаться аудиту для данного пользователя, а второе - поле neveraudit, которое определяет набор событий, которые никогда не должны подвергаться аудиту для пользователя. Нижеследующий пример audit_user проводит аудит всех событий входа в систему и выхода из системы для пользователя root, а также проводит аудит всех событий, связанных с созданием файлов и успешным выполнением команд для пользователя www. При использовании с вышеприведенным примером файла audit_control, запись lo для root является лишней, кроме того, события входа в систему и выхода из системы будут подвергаться аудиту и для пользователя www. root:lo,+ex:no www:fc,+ex:no Администрирование подсистемы аудита Просмотр журнала аудита Журнал аудита хранится в бинарном формате BSM, поэтому для его изменения и конвертации в текстовый формат понадобятся специальные утилиты. Команда &man.praudit.1; преобразует журнал аудита в текстовый формат; команда &man.auditreduce.1; может быть использована для ротации и фильтрации журнала в целях анализа, архивирования или распечатки. Множество параметров выборки поддерживаются командой &man.auditreduce.1;, включая типы событий, классы событий, конкретного пользователя, дату и время событий,а также пути файлов, к которым относятся события. Например, утилита &man.praudit.1; выведет все содержимое журнала аудита в текстовом формате: &prompt.root; praudit /var/audit/AUDITFILE В данном примере AUDITFILE - журнал, который будет выведен в текстовом формате. Журнал аудита состоит из серии записей, которые, в свою очередь состоят из элементов, которые команда &man.praudit.1; выводит последовательно - по одному на строку. Каждый элемент имеет специфический тип, например заголовок (header) содержит заголовок записи, a путь (path) - путь к файлу, к которому относится запись. Следующий пример показывает запись для события execve: 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. В элементах записи есть и командная строка, которую оболочка передала ядру. Элемент путь (path) содержит путь к исполняемому файлу в представлении ядра. Элемент атрибут (attribute) описывает исполняемый файл, и, в частности, режим файла, что можно использовать для определения, использовало ли приложение setuid. Элемент субъект (subject) описывает процесс, вызвавший и сохраняет его в виде ряда значений, представляющих собой ID аудируемого пользователя, исполняющие (effective) UID и GID, реальные ID пользователя и группы, идентификатор процесса, идентификатор сессии, порт и адрес, с которого был осуществлен вход в систему. Обратите внимание - идентификатор аудируемого пользователя и реальный идентификатор пользователя отличаются: это значит, что пользователь robert повысил привилегии до пользователя root перед выполнением команды, но система аудита занесла его действия в журнал используя изначальный идентификатор. Наконец, элемент возврат (return) описывает успешное завершение операции с кодом завершения 0, а элемент trailer завершает запись. Данные в формате XML также можно вывести с помощью команды &man.praudit.1;, используя аргумент . Фильтрация журналов аудита Поскольку логи системы аудита могут иметь огромный размер, администратору, зачастую, необходимо выделить только часть записей. Например, записи, относящиеся к определенному пользователю: &prompt.root; auditreduce -u trhodes /var/audit/AUDITFILE | praudit Эта команда выделит все записи, относящиеся к trhodes, которые хранятся в AUDITFILE. Делегирование прав просмотра журнала Члены группы audit имеют доступ на чтение к журналу аудита, находящемуся в /var/audit; по умолчанию эта группа пуста, и только root имеет к ним доступ. Для того, что бы передать пользователю права на чтение журнала, его необходимо добавить в группу audit. Право на чтение журнала аудита позволяет получить множество информации о поведении пользователей и процессов, поэтому, рекомендуется делегировать права на чтение журнала аудита с большой осторожностью. Мониторинг системы в реальном времени с использованием потоков аудита Потоки системы аудита - клонированные псевдо-устройства в файловой системе устройств, используя которые, приложения могут получать информацию о системных событиях в реальном времени. В первую очередь, это должно заинтересовать авторов программ для мониторинга и определения вторжений в систему. Тем не менее, для администратора потоки системы аудита могут стать удобным инструментом для мониторинга в реальном времени без проблем, свзяанных с правами файла аудита, и возможностью процесса ротации, что приведет к обрыву потока событий. Для того, чтобы получить поток событий в реальном времени используйте следующую команду: &prompt.root; praudit /dev/auditpipe По умолчанию, потоки доступны только пользователю root. Чтобы сделать их доступными членам группы audit добавьте правило devfs в файл devfs.rules: add path 'auditpipe*' mode 0440 group audit Смотрите &man.devfs.rules.5; для более полной информации о настройке файловой системы devfs. При неосторожном использовании возможно возникновение бесконечных циклов событий. Например, если аудиту подвергаются все операции сетевого ввода-вывода, и команда &man.praudit.1; запущена во время SSH-сессии, то будет сгенерирован постоянный поток сообщений аудита, так как каждое событие вызовет еще ондо событие, и так до бесконечности. Разумнее будет запускать &man.praudit.1; на устройстве потока только из сессий, в которых нет большого аудита ввода-вывода, чтобы избежать такого поведения. Ротация журнальных файлов аудита Журнал аудита пишется только ядром и управляется только демоном аудита &man.auditd.8;. Администраторы не должны пытаться использовать &man.newsyslog.conf.5; или другие инструменты для прямой ротации логов. Вместо этого, для прекращения аудита, реконфигурации и ротации журнальных файлов должна использоваться команда &man.audit.8;. Следующая команда приведет к созданию нового журнального файла и даст команду ядру переключиться на запись в этот файл. Протоколирование в старый файл будет прекращено, а сам файл - переименован, в результате чего с ним можно будет работать администратору. &prompt.root; audit -n Если &man.auditd.8; не запущен, то эта команда окончится неудачей и будет выведено сообщение об ошибке. Добавление следующей строки в файл /etc/crontab приведет к принудительной ротации каждые двенадцать часов через &man.cron.8;: 0 */12 * * * root /usr/sbin/audit -n Изменения вступят в силу после сохранения файла /etc/crontab. Автоматическая ротация журнальных файлов на основании их размера возможна при использовании опции в файле &man.audit.control.5;, и описана в разделе "Формат конфигурационного файла" данной главы. Сжатие журнальных файлов Поскольку журнальные файлы могут достигать очень больших размеров, может возникнуть необходимость сжимать их в целях хранения сразу же после закрытия их демоном аудита. Для выполнения определенных пользователем действий, соответствующих разнообразным событиям системы аудита, включая нормальное завершение журналов аудита при их ротации, может быть использован скрипт audit_warn. Например, добавление следующих строк в файл audit_warn приведет к сжатию файла после его закрытия: # # Compress audit trail files on close. # if [ "$1" = closefile ]; then gzip -9 $2 fi Примерами других действий могут быть, например, копирование файлов аудита на централизованный сервер, удаление старых журнальных файлов, фильтрация журнальных файлов для удаления ненужных записей. Скрипт будет запущен только только при корректном закрытии журнала системой аудита и не запустится для журнальных файлов, запись в которые была прекращена в результате некорректного завершения.