Файловый аудит в Linux: как посмотреть дерево каталогов для удалений?

9

У меня на сервере запущен скрипт форума и как-то небольшое количество вложений начинает теряться. Я хочу узнать, что их удаляет и в какое время. Как я могу настроить Linux audd (auditl) для просмотра дерева каталогов (вложения хранятся в многоуровневом дереве каталогов), чтобы отслеживать там удаление файлов?

Может быть, я должен использовать какой-то другой инструмент для этого?

Владислав Раструсный
источник

Ответы:

8

Это ответ, который я написал на предыдущий вопрос:

Обычно, если вы хотите знать, что делает процесс / пользователь / файл без необходимости запускать lsof против него 24/7, вы используете Auditctl.

Предполагая, что у вас есть контроль аудита ядра недавних выпусков, это простая операция. (Это в Debian-fu, если вы работаете с Red Hat при необходимости)

# apt-get install auditd

Убедитесь, что он работает (/etc/init.d/auditd status).

auditctl -a entry,always -F arch=b64 -S open -F pid=<process id>

Замените b64 на b32, если вы используете 32-битную арку, open можно заменить любым системным вызовом или словом «all».

Для получения дополнительной информации прочитайте man-страницу auditl.

Вы можете использовать этот метод и попросить его следить за системным вызовом unlink.

Параметр -w полезен для просмотра файлов / каталогов, но, как объясняет man-страница, есть предостережения.

-w путь Вставить наблюдение за объектом файловой системы в пути. Вы не можете вставить часы в каталог верхнего уровня. Это запрещено ядром. Подстановочные знаки также не поддерживаются и генерируют предупреждение. Наблюдение за работой осуществляется путем внутреннего отслеживания inode. Это означает, что если вы поместите часы в каталог, вы увидите то, что кажется файловыми событиями, но на самом деле это просто обновление метаданных. Делая это, вы можете пропустить несколько событий. Если вам необходимо просмотреть все файлы в каталоге, рекомендуется размещать отдельные часы для каждого файла. В отличие от правил аудита syscall, часы не влияют на производительность в зависимости от количества правил, отправленных ядру.

Аарон Тейт
источник
Я не могу :( У меня PHP работает в режиме CGI. Это всегда новый процесс. Кроме того, я хочу не наблюдать за одним процессом, а наблюдать за изменениями в определенной части файловой системы.
Владислав Раструсный
Да, посмотрите редактирование, которое я сделал, есть параметры для просмотра каталогов файловой системы, но с предостережениями или файлами.
Аарон Тейт
В нем около 1000 папок и около 50 тыс. Файлов. Так что это тоже не сработает ... :(
Владислав Раструсный
Как правило, если вы знаете о предостережениях, вы можете просто пойти дальше и поместить часы в каталог верхнего уровня, содержащий папки, которые вы хотите просмотреть.
Аарон Тейт
Мне нужно сделать то же самое (смотреть папку для удаления, чтобы я мог найти PID / имя процесса, который это сделал), но это, похоже, не работает (по крайней мере, в ядре 3.x). Если я запускаю «auditl -a entry, всегда -F arch = b64 -S unlink -w / path / to / dir» для отслеживания удалений, то я получаю «опция наблюдения не может быть задана с помощью системного вызова». У кого-нибудь есть идеи?
IBBoard
1

Может быть, можно использовать incron ?

ptman
источник
Это не позволяет наблюдать за деревом в целом. Только для каждого каталога, как я вижу.
Владислав Раструсный
0

Пара идей. Вы можете использовать, straceчтобы увидеть, что делает ваше приложение, но оно может генерировать журнал журналов и замедлять работу системы.

Другая идея заключается в том, чтобы использовать inotifywait, а затем lsof/fuserв файле, чтобы увидеть, что его использует. Вы можете попробовать запустить этот скрипт с высоким приоритетом (если можете), чтобы информация была максимально точной. Вероятно, он не будет перехватывать unlinkвызов, поскольку файл будет удален до доставки события.

Дэн Андреатта
источник
Я не могу. Я не знаю, какой процесс запустить, потому что я нахожу удаленные файлы через некоторое время. inotifywait также не будет работать, потому что PHP работает как CGI, и существует множество процессов PHP с разными идентификаторами.
Владислав Раструсный
inotify используется для мониторинга файловой системы, а не запущенных процессов. Для strace вы должны отслеживать основной родительский процесс с -fфлагом, чтобы следовать за дочерними элементами .
Дэн Андреатта
0

Хотя рекомендация fenix audd кажется идеальной, вам может пригодиться IDS файловой системы, такой как AIDE . К сожалению, он вряд ли будет достаточно мелкозернистым для того, что вы пытаетесь изолировать.

Я часто пишу сценарии для решения проблем, подобных тем, что вы описываете. Если вы не можете достичь желаемого с помощью рекомендуемых решений, напишите что-нибудь самостоятельно. Это часто не очень сложно.

сигнализатор
источник
Кажется, это только для поиска изменений файла. Не для мониторинга в реальном времени.
Владислав Раструсный