Вопрос или проблема
Я хочу иметь возможность инструментировать и анализировать на предустановленном сервере и получить список каждого прочитанного файла.
Я также хотел бы определить, какие из этих файлов были прочитаны ядром для выполнения программы, загрузки библиотеки или просто прочитаны приложением.
Я думал, что это будет просто. SELinux по умолчанию запрещает, а в разрешающем режиме он логирует всё. Так что установите его без правил и запустите в разрешающем режиме, и всё должно быть записано в лог.
Обратите внимание, что этот вопрос связан с этим на Security SE, так как я сталкиваюсь с чем-то похожим на того пользователя. Затем возникает проблема в том, что работа под SELinux или любыми другими пакетами аудита введет значительную нагрузку и, возможно, изменит поведение системы под наблюдением.
Для моих целей не так важно, почему файл был прочитан, был ли он прочитан как исполняемый или конфигурационный файл, поскольку ядро записывает это обратно в файловую систему для большинства файловых систем. Я осознал, что мне просто нужно извлечь эти данные из статистики inode.
%T@ печатает время создания, а %A@ печатает время доступа, так что если они
почти одинаковы, файл не
был изменен с момента установки.
Я работаю с командой над получением разрешения на открытие исходного кода, но, честно говоря, код довольно простой.
Я рекомендую монтировать с помощью lazytime для лучшего результата.
find_args=(-xdev -type f -printf "%p|%T@|%A@\\n")
find / $find_args > logfile.psv
#Создайте файл PSV (файл с разделителями по трубкам), который содержит
#путь|время_создания|время_доступа
Это довольно надежно выполняет то, что я хочу. 8
8 Почему “|”
Некоторые модули прошивки ubuntu имеют “,” в своем названии, так что это не хороший разделитель.
Учитывая важность символа “|”, я остановился на этом, очевидно, это можно сделать более устойчивым с помощью “взрослого конструктора csv”.
Одно из требований к моему приложению — нулевая зависимость, поэтому решения на основе python или Perl не подходят.
В сочетании с простым “распаковщиком пакетов“, когда мы находим файл, который недавно не использовался, мы можем сопоставить его с установочным пакетом, из которого он пришел.
Ответ или решение
Для проведения аудита серверов на базе Ubuntu и получения списка всех файлов, которые были прочитаны и выполнены ядром, необходимо учитывать ряд аспектов, связанных с работой системы, инструментами аудита и спецификой назначения файлов. В данном контексте, ваш подход с использованием SELinux в режиме разрешения, хотя и имеет свои плюсы, может создавать значительную нагрузку на систему и изменять ее поведение, что недопустимо, если ваша цель — минимальное вмешательство в работу сервера.
1. Аудит файлов с использованием find
Ваш метод с использованием команды find
для сбора информации о файлах — это хороший старт. Запись информации о времени создания и последнего доступа к файлам дает возможность отслеживать, какие файлы могли быть прочитаны. Ваша команда:
find_args=(-xdev -type f -printf "%p|%T@|%A@\\n")
find / $find_args > logfile.psv
создаст файл с разделителем |
, содержащий пути всех файлов с их временем создания и временем последнего доступа. Это действительно полезно для определения, были ли изменены файлы с момента установки или их состояния.
2. Использование auditd
Для более глубокого аудита загрузки файлов и их чтения вы можете использовать auditd
, который является стандартным инструментом аудита для Linux. Он позволяет отслеживать как системные вызовы, так и действия пользователя с файлами. Чтобы установить auditd
, выполните:
sudo apt-get install auditd
После установки вы можете настроить правила для аудита:
sudo auditctl -a always,exit -F arch=b64 -S open,openat,execve -k file_access
Это правило будет отслеживать все открытия и выполнение файлов. После этого вы сможете просмотреть логи с помощью:
sudo ausearch -k file_access
Эта команда выведет все события, связанные с доступом к файлам.
3. Анализ файловых систем
Учитывая, что вы упоминали об анализе инодов, возможно, вам будет интересно перепроверить состояние файлов с помощью stat
. Эта команда выводит информацию о файле, включая время доступа, изменения и создания:
stat /путь/к/файлу
Для массового анализа всех файлов можно использовать find
с stat
:
find / -type f -exec stat --format='%n|%W|%X' {} \; > logfile.psv
4. Использование lsof
Можно также воспользоваться командой lsof
, которая отображает открытые файлы и их дескрипторы. С помощью lsof
вы можете получать информацию о том, какие процессы обращаются к каким файлам в реальном времени:
lsof +D /путь/к/каталогу
5. Итог и рекомендации
- Используйте
find
иstat
для периодического создания журналов о состоянии файлов. - Настройте
auditd
для детализированного отслеживания файлового доступа, однако убедитесь, что это не влияет на производительность. - Рассмотрите возможность использования
lsof
для динамического мониторинга открытых файлов и их дескрипторов.
Поскольку вы упомянули, что важным является отсутствие зависимостей, все предложенные решения могут быть выполнены с использованием стандартных инструментов, которые уже присутствуют на большинстве систем Ubuntu. Такой подход позволит вам минимально вмешиваться в систему, при этом собрав необходимую информацию для анализа.