вторник, 11 июня 2013 г.

Аудит в Linux

Обычно об аудите задумываются когда возникают подозрения в компрометации системы. Лично я использовал аудит несколько раз за свою практику. И каждый раз я быстренько смотрел одним глазочком, как его настроить. Как правило это был аудит модификаций файлов. В данной статье я не преследую цель раскрыть архитектурные подробности устройства аудита в linux, или дать рекомендации по настройке/администрированию для сред CC-CAPP/EAL (Common Criteria-Controlled Access Protection Profiles/Evaluation Assurance Level), это скорее практическая статья. Хотя минимум теоретической информации все же необходим. Все ниже написанное справедливо для rhel6, расхождения с другими дистрибутивами не существенное.

Подсистема аудита состоит из нескольких компонентов:

  • модуль ядра — перехватывает системные вызовы (syscalls) и регистрирует событие;
  • даемон auditd — пишет зарегистрированное событие на диск в файл;
  • даемон audispd — осуществляет пересылку сообщений (диспетчер) к другому приложению;
  • ряд вспомогательных утилит:

    • auditctl — утилита управления демоном auditd;
    • aureport — дает возможность составить отчет, отчет может быть настроен под задачи;
    • ausearch — позволяет выбрать события по заданному критерию;
    • autrace — утилита позволяет выполнить трассировку отдельного приложения.

Используемые конфигурационные файлы:

  • /etc/sysconfig/auditd — содержит настройки используемые при старте даемона auditd;
  • /etc/audit/auditd.conf — настройки поведения даемона auditd;
  • /etc/audit/audit.rules — файл содержащий правил аудита.

Настройка даемона auditd.
Как отмечено выше, настройка сводится к изменению параметров в файлах конфигурации /etc/sysconfig/auditd и /etc/audit/auditd.conf. Поверьте мне на слово, файл /etc/sysconfig/auditd с содержимым по умолчанию можно не трогать, там ничего интересного нет. Разберем лучше сразу второй файл - /etc/audit/auditd.conf.

# cat /etc/audit/auditd.conf
log_file = /var/log/audit/audit.log 
log_format = RAW 
log_group = root 
priority_boost = 4 
flush = INCREMENTAL 
freq = 20 
num_logs = 5 
disp_qos = lossy 
dispatcher = /sbin/audispd 
name_format = NONE 
##name = mydomain 
max_log_file = 6 
max_log_file_action = ROTATE 
space_left = 75 
space_left_action = SYSLOG 
action_mail_acct = root 
admin_space_left = 50 
admin_space_left_action = SUSPEND 
disk_full_action = SUSPEND 
disk_error_action = SUSPEND 
##tcp_listen_port = 
tcp_listen_queue = 5 
tcp_max_per_addr = 1 
##tcp_client_ports = 1024-65535 
tcp_client_max_idle = 0 
enable_krb5 = no 
krb5_principal = auditd 
##krb5_key_file = /etc/audit/audit.key

Значения параметров:

  • log_file — место расположения и название файла аудита;
  • log_format — формат ведения лога. Возможные значения: RAW — сообщения записываются в том виде как их передало ядро; nolog — не писать сообщения;
  • log_group — группа-владелец лог-файла аудита;
  • priority_boost — приоритет c каким работает даемон (nice).
  • flush — как будет записываться лог-файл на диск. Возможные значения: none — не использовать политики записи, incremental —  лог будет записываться с определенной периодичностью, определенной в параметре freq; data — данные пишутся в файл в синхронном режиме; sync — в синхронном режиме находятся не только данные но и метаданные файла.  
  • freq — число событий при котором осуществляется запись данных на диск, используется при значении flush = incremental. 
  • num_logs — число лог файлов аудита хранимых на диске, если настроена ротация в параметре max_log_file_action.
  • disp_qos — определяет надежность передачи данных между даемоном auditd и диспетчером audispd. Возможные значения: lossy — auditd может не передавать некоторые события аудита, если очередь событий полна при этом события будут записаны на диск; lossless — логирование событий на диск будет остановлено пока не освободится место в очереди.
  • dispatcher — где располагается исполняемый файл диспетчера.
  • name_format и name. name_format — определяет порядок разрешения имен хостов. Возможные значения: none — имя не используется; hostname — имя возвращенное через запрос gethostname; fqd — полное имя хоста, возвращенное через DNS запрос; numeric — ip адрес; user — строка определенная в параметре name.
  • max_log_file и max_log_file_action. max_log_file — максимальный размер лог файла в мегабайтах, по достижению которого будет выполнено действие определенное в max_log_file_action. Возможные действия: ignore — ничего не делать; syslog — отправить предупреждение в syslog; suspend — остановить запись событий на диск; rotate — произвести ротацию лог файлов в соответствии с числом num_logs; keep_logs — осуществить ротацию, при этом не удалять старые файлы.
  • space_left, space_left_action и action_mail_acct. space_left — величина в мегабайтах, определяющая размер оставшегося дискового пространства при достижении которого будет выполнно действие space_left_action. Возможные действия: ignore — ничего не делать;  syslog — отправить предупреждение в syslog; email — отправить письмо аккаунту определенному в action_mail_acct; exec — выполнить скрипт; suspend — остановить запись на диск, перевести систему в single mode; halt — выключить систему.
  • admin_space_left и admin_space_left_action. admin_space_left — величина в мегабайтах оставшегося свободного пространства на диске. Последний шанс для администратора что бы добавить/очистить свободное пространство. Величина должна быть меньше чем space_left. Действия которые можно определить в admin_space_left_action аналогичны space_left_action.
  • disk_full_action — действия выполняемые при заполнении всего дискового пространства, аналогичны space_left_action. 
  • disk_error_action — действия выполняемые при возникновении дисковой ошибки, аналогичны space_left_action.
  • tcp_listen_port, tcp_listen_queue, tcp_max_per_addr, tcp_client_ports и tcp_client_max_idle — даемон аудита может принимать сообщения от других даемонов. Данные переменные определяют сетевые настройки.
  • enable_krb5, krb5_principal, krb5_key_file — переменные определяющие аутентификацию по протоколу kerberos. 

Управление подсистемой аудита
Управление подсистемой аудита и добавление новых правил осуществляется утилитой — auditctl. Естественно эти изменения временные, для того что бы они стали постоянными их необходимо прописать в /etc/audit/audit.rules.

Основные команды управления auditctl:

  • -e [0..2] — (enabled), при 0 — отключить, 1 — включить, 2 — включить и заблокировать конфигурацию аудита. В случае блокировки изменение конфигурации аудита будет доступно только после перезагрузки хоста; 
  • -f [0..2] — (flag), установка поведения при критической ошибке, 1 — ничего не делать, 1 — вывести сообщение на консоль, 2 — немедленное выключение системы;
  • -r — (rate_limit), лимит скорости сообщений в минуту, при 0 — скорость не лимитируется. Если будет осуществлено превышение — будет выполнено действие поведения при критической ошибке flag;
  • -b — (backlog_limit), размер буфера сообщений ожидающих обработки. Если будет осуществлено превышение — будет выполнено действие поведения при критической ошибке flag;
  • -s — запрос текущего состояние даемона аудита;
  • -l — вывод всех текущих правил аудита;
  • -D — очистить все правила аудита.

Приведу несколько примеров:
Посмотрим как выглядит настройка по умолчанию даемона аудита:

# auditctl -s 
AUDIT_STATUS: enabled=1 flag=1 pid=985 rate_limit=0 backlog_limit=320 lost=0 backlog=0

Удалим все существующие правила:

# auditctl -D

Увеличим размер буфера сообщений:

# auditctl -b 1024

Добавим правило аудита, оно включает протоколирование всех попыток изменить содержимое файла /etc/shadows или изменить его атрибуты, структуру правил рассмотрим позже:

# auditctl -w /etc/shadow -p wa

В файл /etc/audit/audit.rules параметры конфигурации и правила записывается точно в таком же виде, как и  консольные команды, за исключением самой команды auditctl, т.е для вышеприведенных примеров будет справедливо:

# cat /etc/audit/audit.rules
-D
-b 1024
-w /etc/shadow -p wa