Никто из нас не хочет разбираться с системой аудита в рабочей среде, потому что обычно это происходит уже после нарушения безопасности или инцидента. За годы люди придумали множество идей для наблюдения за действиями приложений. Почти все базы данных ведут журналы событий для предотвращения потери данных. Такие системы, как Kubernetes, генерируют события для каждого действия, и приложения, работающие в вашей рабочей среде, также реализуют структурированное логирование по той же причине. Но что мы можем сделать, если всего этого недостаточно? Что, если кто-то найдет способ запустить удаленную оболочку на вашей машине или вырваться из производственной пеосочницы? Что, если один из ваших бывших сотрудников, имеющих доступ к машинам, решит скопировать или удалить с них некоторые файлы? В идеале у нас должен быть инструмент, который позволил бы регистрировать такие события без ручного внедрения инструментария во все установленные приложения.
Знакомство с фреймворком аудита Linux
Фреймворк аудита Linux, также известный как auditd, был создан для решения вышеописанной проблемы. Он позволяет системному администратору регистрировать различные системные события и использовать их для последующего анализа. Можно сравнить его с "черным ящиком" в самолете. Журналы событий часто содержат полезную информацию, такую как выполненные команды, системные вызовы, информацию о доступе к файлам и сетевую статистику.
Чем аудит Linux отличается от других?
Чтобы понять, что делает auditd уникальным, нужно обсудить архитектуру системы. Большинству инструментов аудита требуется некоторая интеграция с запущенным приложением, а это означает, что мы можем упустить важную информацию, если это сделано неправильно. Интеграция таких инструментов во все среды, как правило, требует много работы и дисциплины.
В отличие от них, аудит Linux - это модуль, встроенный непосредственно в ядро Linux. Это дает ему возможность видеть все действия с точки зрения ядра. Кроме того, он очень гибко настраивается, что позволяет большинству пользователей найти оптимальный баланс и избежать слишком большого количества "шума".
Как показано на диаграмме выше, между приложением и ядром нет дополнительных слоев.
Вместо этого все события передаются демону auditd (audit demon), работающему в пользовательском пространстве, напрямую из ядра через netlink. Затем auditd отвечает за сохранение всех событий в файловой системе. Он также предлагает все, что мы ожидаем от демона Linux: ротацию логов, мониторинг свободного места на диске и т.д. Если демон не запущен, все события "выводятся" в ядре и могут быть найдены в dmesg.
Взаимодействие с аудитом Linux
Мы уже поговорили о том, что такое auditd и что он может делать. Давайте теперь посмотрим, как мы можем использовать его на практике. Есть несколько способов просмотра событий, генерируемых аудитом Linux:
Файл журнала
Самый очевидный - это файл журнала, расположенный в /var/log/audit/audit.log в большинстве систем. Этот файл содержит все события, зарегистрированные процессом в пользовательском пространстве auditd. Когда процесс auditd не запущен, все события аудита выводятся ядром и могут быть найдены в dmesg среди остальных сообщений ядра.
Инструменты, предоставляемые auditd
Поскольку файл журнала auditd содержит необработанные данные, найти нужную информацию непросто. По этой причине auditd поставляется с инструментами командной строки. Мы поговорим о них подробнее далее в статье.
Прямое обращение к ядру с помощью netlink
Последний вариант, который вы можете выбрать - это подключение через netlink. Если вы никогда не слышали о netlink, это замена для ioctl. Он позволяет напрямую обращаться к ядру без больших накладных расходов. Обмен информацией требует некоторых знаний о ядре, поскольку сообщения отправляются в бинарном формате.
Если вы не хотите слишком глубоко погружаться в программирование ядра, вы также можете использовать библиотеку audit-userspace (https://github.com/linux-audit/audit-userspace), которая предлагает C API, реализующий большинство технических деталей за вас.
Важно отметить, что чтение сообщений аудита Linux возможно только один раз. Поэтому если вы решите читать сообщения в своем приложении, не забудьте отключить auditd. В противном случае вы ничего не увидите.
Набор инструментов Auditd
Auditd не был бы очень полезен без сопутствующих инструментов. Аудит Linux распространяется с набором инструментов, которые позволяют нам изменять поведение демона, искать события и выводить системную статистику. Давайте посмотрим, что доступно нам "из коробки".
autrace - трассировка выполнения только одного процесса
autrace позволяет запустить процесс и записать все, что происходит. Пример ниже показывает, как запустить ls:
| 1 2 3 4 5 | # autrace /bin/ls Waiting to execute: /bin/ls auditd-test Cleaning up... Trace complete. You can locate the records with 'ausearch -i -p 153157' |
Сгенерированный журнал не показывает много деталей, но последняя строка указывает нам на другой удобный инструмент.
ausearch - grep для бесконечных журналов
Как я упоминал ранее, auditd даже при конфигурации по умолчанию регистрирует множество событий. Чтобы лучше понять поведение системы, ausearch предоставляет широкий набор фильтров, таких как фильтрация по PID, пользователю, ID сессии, времени и т.д.
Ниже приведен пример вывода списка всех событий по PID.
| 1 2 3 4 5 6 7 8 9 | # ausearch -i -p 153157 ---- type=PROCTITLE msg=audit(08/16/2025 01:01:40.493:5126) : proctitle=autrace /bin/ls type=SYSCALL msg=audit(08/16/2022 01:01:40.493:5126) : arch=x86_64 syscall=close success=yes exit=0 a0=0x4 a1=0x0 a2=0x7f8e619ea160 a3=0x7f8e61a710c8 items=0 ppid=153151 pid=153153 auid=john uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=pts4 ses=213 comm=autrace exe=/usr/sbin/autrace subj==unconfined key=(null) ---- type=PROCTITLE msg=audit(08/16/2025 01:01:40.493:5128) : proctitle=autrace /bin/ls type=PATH msg=audit(08/16/2025 01:01:40.493:5128) : item=0 name= inode=7 dev=00:18 mode=character,620 ouid=root ogid=tty rdev=88:04 nametype=NORMAL cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 cap_frootid=0 type=CWD msg=audit(08/16/2025 01:01:40.493:5128) : cwd=/tmp/a type=SYSCALL msg=audit(08/16/2025 01:01:40.493:5128) : arch=x86_64 syscall=newfstatat success=yes exit=0 a0=0x1 a1=0x7f8e617d846f a2=0x7ffffc4624e0 a3=0x1000 items=1 ppid=153151 pid=153153 auid=john uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=pts4 ses=213 comm=autrace exe=/usr/sbin/autrace subj==unconfined key=(null) |
aureport - агрегация всех событий
Иногда мы не хотим видеть все отдельные события, а хотим получить сводку о том, что произошло в прошлом. Здесь aureport оказывается очень удобным и может помочь ответить на многие вопросы всего несколькими нажатиями клавиш:
Кто вошел в систему?
| 1 2 3 4 5 6 7 8 9 | # aureport -l --summary Login Summary Report ============================ total auid ============================ 8 operator 3 nobody 2 bin |
Кто пытался войти в систему и потерпел неудачу?
| 1 2 3 4 5 6 7 | # aureport -l --summary --failed Failed Login Summary Report ============================ total auid ============================ 243 john |
К каким файлам был доступ?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # aureport -f --summary File Summary Report =========================== total file =========================== 1084 /run/systemd/userdb/io.systemd.Machine 1070 /run/systemd/userdb/io.systemd.DynamicUser 412 /var/run/nscd/socket 212 /run/systemd/notify 36 /dev/log 30 /run/systemd/journal/stdout 27 16 /run/cups/cups.sock … |
Ввод с TTY? Отчет об аномалиях? Нет проблем. Эти и многие другие отчеты могут быть быстро сгенерированы для обзора состояния системы.
auditctl - управление аудитом
auditctl - это инструмент управления демоном, который позволяет получать и изменять настройки auditd. Вероятно, одна из самых полезных вещей, для которой можно использовать auditctl - это вывод списка всех активных правил:
| 1 | auditctl -l |
auditctl также позволяет проверять состояние (-s) или добавлять новые правила.
Помните, что все правила, установленные с помощью auditctl, исчезнут после перезагрузки. Чтобы сделать правило постоянным, его нужно добавить в файл конфигурации.
Потенциальные проблемы
Пока что auditd выглядит как безупречная система, соответствующая потребностям каждого. Но, к сожалению, реальность не так проста. Например, одна из основных проблем, с которой сталкиваются многие пользователи после включения аудита Linux, — это снижение производительности.
Другая потенциальная ловушка, которую многие могут не осознавать, — это поведение auditd, когда на диске не остается свободного места. Auditd с конфигурацией по умолчанию просто запишет предупреждающее сообщение и прекратит запись событий на диск. Когда это происходит, наш журнал событий может упустить важные события и сделать потенциальный анализ невозможным. К счастью, эту опцию можно изменить, установив для параметра disk_full_action значение HALT или SUSPEND в конфигурации аудита.
Похожая проблема также может быть вызвана политикой сброса (flush policy) по умолчанию, установленной в INCREMENTAL_ASYNC или INCREMENTAL. Некоторые события не могут быть полностью синхронизированы с диском, что создает неполную картину ситуации.
Какие есть альтернативы?
Ядро Linux поставляется со множеством функций. Одна из них — Berkeley Packet Filter (BPF), который приобрел большую популярность за последние несколько лет. BPF изначально проектировался не для целей аудита, а как способ безопасного выполнения пользовательского кода в ядре Linux. Компилятор BPF гарантирует, что предоставленный код не приведет к сбою и всегда завершится. Это делает его более безопасной альтернативой модулям ядра, которые могут обрушить всю систему. Если вы никогда не использовали BPF на практике, самый простой способ начать — использовать инструмент bcc (https://github.com/iovisor/bcc). Этот пакет поставляется с примерно 100 скриптами (на момент написания). Простые приложения позволяют вам воспользоваться преимуществами BPF в вашей системе без написания какого-либо кода.
Возвращаясь к нашему предыдущему примеру с трассировкой системного вызова connect, давайте посмотрим, как мы можем достичь того же с помощью BPF. К счастью, bcc поставляется с уже готовым скриптом под названием tcpconnect, который позволяет нам выводить список всех вызовов connect.
Вот пример:
| 1 2 3 4 | sudo tcpconnect Tracing connect ... Hit Ctrl-C to end PID COMM IP SADDR DADDR DPORT 88739 curl 4 192.168.0.1 12.93.94.75 80 |
Поскольку BPF, как и аудит Linux, работает в ядре, у него есть доступ ко всем системным вызовам, что позволяет собирать аналогичную информацию. Конечно, мы также могли бы использовать аудит Linux для получения той же информации. Сначала нам нужно добавить новое правило в auditd:
| 1 | auditctl -a always,exit -F arch=b64 -S connect |
Затем в нашем журнале аудита мы должны увидеть события примерно такого вида:
| 1 2 | type=SYSCALL msg=audit(1765869826.766:305136): arch=c000003e syscall=42 success=yes exit=0 a0=7 a1=7f4c040015f0 a2=1c a3=0 items=0 ppid=268860 pid=272050 auid=1000 uid=1000 gid=1000 euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=pts0 ses=283 comm="curl" exe="/usr/bin/curl" subj==unconfined key=(null)ARCH=x86_64 SYSCALL=connect AUID="john" UID="john" GID="john" EUID="john" SUID="john" FSUID="john" EGID="john" SGID="john" FSGID="john" type=SOCKADDR msg=audit(1765869826.767:305137): saddr=0A000050000000002607F8B040090808000000000000200E00000000SADDR={ saddr_fam=inet6 laddr=2607:f8b0:4009:808::200e lport=80 } |
Будущее аудита в Linux
Может ли BPF заменить аудит Linux? Я думаю, что да. BPF - это мощная технология, принятая такими компаниями, как Google, Netflix и Teleport. Она позволяет создавать более настраиваемые решения, направленные на решение более конкретных проблем, а не только аудит.
Заменит ли BPF аудит Linux? Возможно. Netflix, например, использует BPF для трассировки сетевых пакетов, используя менее 1% ЦП и памяти. Uber создала фреймворк для нагрузочного тестирования, который может автоматически регулировать сетевой трафик, чтобы снизить потребность в ручных настройках и увеличить покрытие тестов. Teleport использует BPF для отслеживания активности пользователя во время удаленной сессии, что может устранить необходимость в аудите Linux.
Заключение
Auditd - это надежная и мощная система аудита. Его реализация в ядре Linux делает его очень эффективным и широко доступным. В этой статье мы рассмотрели, почему был создан аудит Linux, его архитектуру и использование. Мы также показали некоторые более современные альтернативы.
