- Мониторинг файловых операций с помощью демона auditd
- Пользовательские правила отслеживания событий
- Мониторинг изменений отдельных файлов
- Правила, используемые на постоянной основе
- Это еще не все
- Аудит системных событий в Linux
- Подсистема аудита: архитектура и принцип работы
- Установка
- Конфигурирование
- Создание правил
- Файлы правил
- Анализ журнальных файлов: утилита aureport
- Ausearch: поиск и анализ событий
- Анализ процессов с помощью утилиты autrace
- Централизованное хранение логов
- Заключение
Мониторинг файловых операций с помощью демона auditd
Оригинал: Customized File Monitoring with Auditd
Автор: Paul Brown
Дата публикации: 14 июня 2016 г.
Перевод: А.Панин
Дата перевода: 13 января 2017 г.
Узнайте о том, как настроить демон auditd для отслеживания любых системных событий.
В предыдущей статье, посвященной демону auditd, я продемонстрировал методику использования утилиты aureport для получения информации о событиях, отслеживаемых демоном auditd в автоматическом режиме. Также я упомянул о том, что вы можете, к примеру, проверить, не испытывает ли какой-либо из пользователей системы проблем при аутентификации, причем эти проблемы могут быть интерпретированы как попытки получения доступа к системе злоумышленниками.
Как я говорил ранее, утилита aureport является частью большого набора утилит из комплекта поставки auditd. Возможность использования auditd для мониторинга определенных событий сама по себе является довольно полезной, но при этом вы также можете использовать данный демон для отслеживания событий, которые вас действительно интересуют.
Пользовательские правила отслеживания событий
Для передачи пользовательских правил отслеживания событий демону auditd в процессе его работы следует использовать утилиту auditctl. Но перед тем, как создавать свои правила, я предлагаю вам проверить, не используются ли демоном какие-нибудь стандартные правила. Получите привилегии пользователя root (или воспользуйтесь утилитой sudo) и выполните следующую команду:
Параметр -l сообщает утилите о необходимости вывода списка всех активных на данный момент правил и, как несложно заметить, после выполнения данной команды выводится лишь приведенная ниже строка -a never,task , которая обозначает, что ни одно из следующих правил не будет записывать данные в журнал. Это правило, которое обычно используется по умолчанию в новых установках auditd и сообщает демону о необходимости добавления ( -a ) правила в список задач (аналогичный списку задач, исполняющихся ядром ОС — вам пока не стоит беспокоиться по данному поводу), причем это правило запрещает auditd записывать что-либо в журнал.
Так как в нашем случае не указывается интересующая нас задача, auditd предполагает, что данное правило относится ко всем задачам. По-русски это правило читается так: «Не нужно записывать в журнал информацию о любых задачах, исполняющихся с участием ядра ОС». И, так как демон auditd расставляет приоритет правил сверху вниз (то есть, первое правило имеет преимущество перед последующими правилами в случае возникновения каких-либо конфликтов), данное правило обозначает, что в журнал не будут записываться какие-либо данные вне зависимости от содержания остальных правил.
Вам наверняка не понадобится данное правило, поэтому в первую очередь следует избавиться от него. Для удаления всех правил, используемых демоном auditd, вы можете воспользоваться следующей командой:
Если вы уже передали демону несколько своих правил и не хотите удалять их, вы можете удалить лишь первое правило с помощью команды:
Теперь, когда путь свободен, я постараюсь продемонстрировать вам методику создания вашего первого правила. Демон auditd нередко используется для мониторинга операций с файлами и директориями. Например, вы можете создать директорию в своей домашней директории от лица обычного пользователя с помощью аналогичной команды:
Теперь следует получить привилегии пользователя root и добавить правило, предназначенное для наблюдения за созданной директорией:
Параметр -w сообщает демону auditd о необходимости наблюдения за всеми изменениями в рамках директории test_dir/ . Параметр -k сообщает auditd о необходимости добавления строки test_watch (называемой ключом) к записям, добавляемым в журнал. В качестве ключа может использоваться любая строка, хотя отличной идеей является использование строки, которая хорошо запоминается и тесно связана с назначением правила. Как вы увидите позднее, данная строка является крайне полезной для отбрасывания не связанных с правилом записей в процессе исследования журналов auditd.
Теперь вы должны будете выполнить какие-либо операции в рамках директории test_dir/ от лица обычного пользователя — создайте несколько поддиректорий, создайте или скопируйте несколько файлов, удалите несколько файлов или получите список ее содержимого.
После выполнения данных операций вы можете обратиться к содержимому журнала демона auditd с помощью команды:
Обратили внимание на параметр -k test_watch ? Даже в том случае, если вы используете множество других правил для наблюдения за различными параметрами системы, вы можете сообщить утилите ausearch о необходимости вывода лишь тех записей, которые вас действительно интересуют, передав ей соответствующий ключ (Рисунок 1).
Рисунок 1: Вывод утилиты ausearch
Даже при условии использования приведенного ключа утилита ausearch выводит огромный объем информации. Однако, вы также можете заметить, что выводимая информация является достаточно структурированной. По сути, каждому событию соответствуют три записи в выводе.
Каждая запись содержит пары ключ/значение, разделенные с помощью символа «=» ; некоторые значения являются строками, другие — списками в круглых скобках и так далее. Вы можете узнать о значении каждого из фрагментов записей в официальном руководстве , но в данном случае важно понимать, что структурированный формат вывода рассматриваемой утилиты позволяет без каких-либо сложностей осуществлять разбор ее вывода с помощью соответствующих сценариев. Фактически, инструмент aureport, который описывался в предыдущей статье серии, также осуществляет структурированный вывод.
Для того, чтобы доказать данный тезис, предлагаю передать вывод утилиты ausearch на вход утилиты aureport:
Это уже интересно! Изучив данный вывод, вы можете узнать, кто, что и когда делал с файлами.
Если вы внимательно рассмотрели приведенный листинг, вы наверняка обратили внимание на то, что ввиду использования мною окружения рабочего стола Plasma, индексирующая служба Baloo из состава KDE также осуществляет доступ к исследуемым файлам, наполняя журнал дополнительными записями. Это объясняется тем, что каждый раз при создании или удалении файла Baloo осуществляет фиксацию соответствующего факта. Данное обстоятельство значительно затрудняет разбор вывода рассматриваемой утилиты и наблюдение за процессами, происходящими в системе. Поэтому я предлагаю отфильтровать все записи, относящиеся к действиям Baloo, с помощью утилиты grep:
Это уже намного лучше. Теперь ясно, чем пользователи занимаются в системе. Вы можете проследить за тем, как они создают и копируют директории и файлы. Также вы можете узнать имена файлов, которые были удалены и так далее.
Если правило более не требуется, вы можете удалить его с помощью команды:
Мониторинг изменений отдельных файлов
Мониторинг изменений содержимого директорий может быть связан с записью огромного объема данных в журнал. По этой причине иногда удобнее осуществлять мониторинг изменений отдельных важных файлов для того, чтобы быть уверенным в том, что никто не подменил их содержимое. Классический пример команды, добавляющей правило для мониторинга изменений отдельного файла:
Данное правило позволяет быть уверенным в том, что никто не подменяет содержимое файла passwd .
Параметр -p сообщает демону auditd о типах операций доступа к файлу, которые следует отслеживать. Допустимыми обозначениями типов операций доступа к файлу в данном случае являются:
- r — операция чтения данных из файла
- w — операция записи данных в файл
- x — операция исполнения файла
- a — операция изменения атрибутов файла или директории
Так как приложения должны иметь возможность читать содержимое файла /etc/passwd , мы не будем отслеживать операции чтения с целью защиты от ложных срабатываний. Также не совсем разумным решением является отслеживание операций исполнения неисполняемого файла; исходя из всего вышесказанного, мы сообщаем демону auditd о необходимости отслеживания изменений содержимого файла /etc/passwd (то есть, операций записи данных в файл), а также его атрибутов.
Если вы явно не укажите атрибуты файла, изменение которых необходимо отслеживать, демон auditd будет отслеживать изменения всех его атрибутов. По этой причине при мониторинге изменений содержимого директории test_dir/ в приведенных выше примерах генерация событий осуществлялась даже в случае использования команды ls .
Правила, используемые на постоянной основе
Для того, чтобы ваши правила работали на постоянной основе, вы можете добавлять их в файл /etc/audit/audit.rules или в новый файл с произвольным именем, который придется создать самостоятельно в директории /etc/audit/rules.d/ . Если вы экспериментируете с правилами и используете для этого утилиту auditctl, причем вас вполне устраивает текущий набор правил, вы можете сохранить его с помощью данной последовательности команд:
Данные команды позволяют сохранить текущие правила в файле с именем my.rules без необходимости их ручного ввода. Если вы выполняли все описанные в данной статье действия, файл my.rules должен содержать все приведенные выше правила:
Для того, чтобы избежать конфликтов правил, следует преобразовать все существующие файлы правил из директорий /etc/audit/ и /etc/audit/rules.d/ в файлы резервных копий путем простого добавления соответствующих расширений:
После этого нужно перезапустить рассматриваемый демон с помощью следующей команды:
Это позволит демону обработать все добавленные правила в автоматическом режиме.
Теперь после каждой перезагрузки системы auditd будет осуществлять мониторинг тех файловых операций, которые вас интересуют.
Это еще не все
В рамках нескольких статей мне удалось рассказать лишь о малой части возможностей демона auditd. Но, как несложно заметить, auditd является мощным инструментом, который может использоваться для мониторинга множества других событий, помимо операций с файлами и директориями, со сбором большого объема дополнительной информации. Я планирую описать другие возможности данного инструмента в следующей статье серии.
Источник
Аудит системных событий в Linux
Одним из инструментов, позволяющих повысить уровень безопасности в Linux, является подсистема аудита. C её помощью можно получить подробную информацию обо всех системных событиях.
Она не обеспечивает никакой дополнительной защиты, но предоставляет подробную информацию о нарушениях безопасности, на основании которой можно принять конкретные меры. Особенности работы с подсистемой аудита мы рассмотрим в этой статье.
Подсистема аудита: архитектура и принцип работы
Подсистема аудита была добавлена в ядро Linux начиная с версии 2.6. Она предназначена для отслеживания критичных с точки зрения безопасности системных событий. В качестве примеров таких событий можно привести следующие (список далеко не полный):
- запуск и завершение работы системы;
- чтение, запись и изменение прав доступа к файлам;
- инициация сетевых соединений;
- попытки неудачной авторизации в системе;
- изменение сетевых настроек;
- изменение информации о пользователях и группах;
- запуск и остановка приложений;
- выполнение системных вызовов.
Ни одно из названных событий не может произойти без использования системных вызовов ядра. Чтобы их отслеживать, достаточно просто перехватывать соответствующие системные вызовы. Именно это и делает подсистема аудита:
Получив вызов от приложения в пространстве пользователя, подсистема аудита пропускает его через один из следующих фильтров: user, task или exit (более подробно о них речь пойдёт ниже). После этого вызов пропускается через фильтр exclude, который исходя из правил аудита передаёт его демону auditd для дальнейшей обработки.
Такая простая схема позволяет вполне эффективно отслеживать любой аспект работы ОС, а в случае компрометации системы выявлять подозрительные действия и определять их причину.
Установка
Чтобы начать работать с подсистемой аудита, нужно установить пакет auditd (здесь и далее приводятся примеры команд для OC Ubuntu 14.04):
В cостав этого пакета входят демон auditd и несколько вспомогательных утилит:
- auditctl — утилита для управления демоном auditd; позволяет получать информацию о текущем состоянии подсистемы аудита, а также добавлять и удалять правила;
- autrace — утилита для аудита событий, порождаемых процессами (работает по тому же принципу, что и strace);
- ausearch — утилита для поиска событий в журнальных файлах;
- aureport — утилита для генерации отчётов о работе системы аудита.
Конфигурирование
Настройки подсистемы аудита хранятся в конфигурационном файле etc/audit/auditd.conf. Он содержит в числе прочих следующие параметры:
- log_file — файл, в котором будут храниться логи подсистемы аудита;
- log_format — формат, в котором будет сохранены логи;
- freq — максимальное число записей протокола, которые могут храниться в буфере;
- flush — режим синхронизации буфера с диском (none — ничего не делать, incremental — переносить данные из буфера на диск с частотой, указанной в значении параметра freq; data — синхронизировать немедленно, sync — синхронизировать как данные, так и метаданные файла при записи на диск);
- max_log_file — максимальный размер файла лога в мегабайтах;
- max_log_file_action — действие при превышении максимального размера файла лога;
- space_left — минимум свободного пространства в мегабайтах, по достижении которого должно быть осуществлено действие, указанное в следующем параметре;
- space_left_admin — указывает, что делать, когда на диске недостаточно свободного места (ignore — ничего не делать; syslog — отправлять в syslog, email — отправлять уведомление по почте; suspend — прекратить запись логов на диск; single — перейти в однопользовательский режим; halt — выключить машину)
- disk_full_action — действие, которое нужно осуществить при переполнении диска (этот параметр может принимать те же значения, что и space_left_admin).
Создание правил
Для добавления и настройки правил используется команда auditctl. Вот список её опций:
- -l — вывести список имеющихся правил;
- -а — добавить новое правило;
- -d — удалить правило из списка;
- -D — удалить все имеющиеся правила.
Чтобы создать новое правило, нужно выполнить команду вида:
Сначала после опции -а указывается список, в который нужно добавить правило. Всего существует 5 таких списков:
- task — события, связанные с созданием новых процессов;
- entry — события, которые имеют место при входе в системный вызов;
- exit — события, которые имеют место при выходе из системного вызова;
- user — события, использующие параметры пользовательского пространства;
- exclude — используется для исключения событий.
Затем указывается, что нужно делать после наступления события. Здесь возможны два варианта: always (события будут записываться в журнал) и never (не будут).
После опции -S идёт имя системного вызова, при котором событие нужно перехватить (open, close и т.п.).
После опции -F указываются дополнительные параметры фильтрации. Например, если нам требуется вести аудит обращений к файлам из каталога /etc, правило будет выглядеть так:
Можно установить и дополнительный фильтр:
Аббревиатура aw означает следующее: а — изменение атрибута (attribute change), w — запись (write). Формулировка perm = aw указывает, что для директории /etc нужно отслеживать все факты изменения атрибутов (а — attribute change) и w (w — write).
При настройке слежения за отдельными файлами можно опустить опцию -S, например:
Файлы правил
Правила можно не только задавать через командную строку, но и прописывать в файле etc/audit/audit.rules.
Начинается этот файл с так называемых метаправил, в которых задаются общие настройки журналирования:
Далее следуют пользовательские правила. Их синтаксис предельно прост: достаточно просто перечислить соответствующие опции команды auditctl. Рассмотрим пример типового файла правил:
Изменения конфигурации вступят в силу после перезапуска демона auditd:
Анализ журнальных файлов: утилита aureport
Все журнальные файлы сохраняются в директории /var/log/audit в машиночитаемом формате. Их можно сделать человекопонятными c помощью утилиты aureport.
Если ввести команду aureport без аргументов, мы увидим общую системную статистику (количество пользователей системы, общее количество системных вызовов, число открытых терминалов и т.п.):
Она не имеет особой практической ценности. Гораздо больший интерес представляют специализированные отчёты. Вот так, например, можно просмотреть информацию обо всех системных вызовах:
Воспользовавшись опцией -au (или −−auth), можно просмотреть информацию обо всех попытках входа в систему:
В аureport поддерживается фильтрация по дате и времени:
Можно указывать как конкретные время и дату, так и специальные человекопонятные конструкции:
- now — текущий момент;
- yesterday — вчерашнее сутки;
- recent — 10 минут назад;
- this-week (или this-month, this-year) — текущая неделя (месяц, год).
С помощью aureport можно просмотреть информацию о действиях любого пользователя системы. Для этого нужно сначала узнать id этого пользователя:
и затем выполнить следующую команду:
Ausearch: поиск и анализ событий
Для просмотра детальной информации о событии используется утилита ausearch:
Вывод приведённой выше команды выглядит так:
type=SYSCALL msg=audit(1364481363.243:24287): arch=c000003e syscall=2 success=no exit=-13 a0=7fffd19c5592 a1=0 a2=7fffd19c4b50 a3=a items=1 ppid=2686 pid=3538 auid=500 uid=500 gid=500 euid=500 suid=500 fsuid=500 egid=500 sgid=500 fsgid=500 tty=pts0 ses=1 comm=»cat» exe=»/bin/cat» subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key=»sshd_config»
Рассмотрим его структуру более подробно. В поле type указывается тип записи; type = syscall означает, что запись была сделана после выполнения системного вызова. В поле msg указано время события в формате Unix Timestamp и его уникальный идентификационный номер.
В поле arch содержится информация об используемой архитектуре системы (c000003e означает x86_84), представленная в закодированном шестнадцатеричном формате. Чтобы она выводилась в человекочитаемом виде, можно воспользоваться опцией -i или −−interpret.
В поле syscall указан тип системного вызова — в нашем случае это 2, то есть вызов open. Параметр success сообщает, был ли вызов обработан успешно или нет. В нашем примере вызов был обработан неудачно (success = no).
Для каждого вызова в отчёте также перечисляются индивидуальные параметры; более подробно о них можно почитать в официальном руководстве. Вывести на консоль информацию о любом параметре в человекочитаемой форме можно получить при помощи упомянутой выше опции -i или −−interpret, например:
Опция -sc позволяет включать в список события, относящиеся к указанному системному вызову, например:
Опция -ui служит для поиска событий по идентификатору пользователя:
Поиск по именам демонов осуществляется с помощью опции -tm:
Для поиска нужных событий можно также использовать ключи, например:
Приведённая команда выведет список всех действий, совершённых от имени root-пользователя. Поддерживается также фильтрация по дате и времени, аналогичная той, что была описана выше. Вывести список событий, завершившихся неудачно, можно с помощью опции −−failed.
Анализ процессов с помощью утилиты autrace
В некоторых случаях бывает полезным получить информацию о событиях, связанных с одним конкретным процессом. Для этой цели можно воспользоваться утилитой autrace. Предположим, нам нужно отследить процесс date и узнать, какие системные вызовы и файлы он использует. Выполним команду:
На консоли появится следующий текст:
Обратим внимание на последнюю строку вывода: в ней указана команда, с помощью которой можно получить более подробную информацию. Выполним эту команду и передадим вывод утилите aureport, которая преобразует его в человекочитаемый формат:
В результате мы получим вот такой отчёт:
Централизованное хранение логов
Для отправки логов подсистемы аудита в централизованное хранилище используется плагин audisp-remote. Он входит в пакет audisp-plugins, который нужно устанавливать дополнительно:
Конфигурационные файлы всех плагинов хранятся в директории /etc/audisp/plugins.d.
Настройки удалённого логгирования прописываются в конфигурационном файле /etc/audisp/plugins.d/audisp-remote.conf. По умолчанию этот файл выглядит так:
Чтобы активировать отправку логов в удалённое хранилище, заменим значение параметра active на yes. Затем откроем файл etc/audisp/audisp-remote.conf и в качестве значения параметра remote_server укажем буквенный или IP-адрес cервера, на котором будут храниться логи.
Чтобы принимать логи с удалённых хостов и сохранять их на сервере, в файле /etc/audit/auditd.conf нужно прописать следующие параметры:
tcp_listen_port = 60
tcp_listen_queue = 5
tcp_max_per_addr = 1
##tcp_client_ports = 1024-65535 #optional
tcp_client_max_idle = 0
Заключение
В этой статье мы изложили основы работы с подсистемой аудита Linux. Мы рассмотрели принцип работы системы аудита, научились формулировать правила, читать логи и пользоваться вспомогательными утилитами.
Для желающих изучить тему более подробно приводим несколько полезных ссылок:
Источник