Мониторинг доступа к файлам в Linux

20

Есть ли способ в Unix узнать, кто получил доступ к определенному файлу за последнюю 1 неделю? Это может быть пользовательский или какой-то скрипт, который может переместиться в другое место. Могу ли я получить список имен пользователей, которые обращались к определенному файлу? Как я могу узнать, кто обращается к конкретному файлу ??

разъем
источник

Ответы:

39

Если у вас нет чрезвычайно необычных политик ведения журналов, кто получил доступ к тому, что файл не зарегистрирован (это было бы огромное количество информации). Вы можете узнать, кто был зарегистрирован в какое время в системных журналах; Эта lastкоманда отображает историю входа и другие журналы, такие как /var/log/auth.logрассказывает, как пользователи проходили аутентификацию и откуда они вошли (какой терминал или какой хост удаленно).

Дата, когда файл был прочитан в последний раз, называется временем доступа, или для краткости atime . Все файловые системы Unix могут хранить его, но многие системы не записывают его, потому что он имеет (как правило, небольшое) снижение производительности. ls -ltu /path/to/fileили stat /path/to/fileпоказывает время доступа к файлу.

Если пользователь получил доступ к файлу и не пытался скрыть свои треки, его история оболочки (например ~/.bash_history) может иметь подсказки.

Чтобы узнать, что или у кого есть файл, открытый сейчас, используйте lsof /path/to/file.

Чтобы записать, что произойдет с файлом в будущем, есть несколько способов:

  • Используйте inotifywait . inotifywait -e access /path/toнапечатает строку, /path/to/ ACCESS fileкогда кто-то читает file. Этот интерфейс не скажет вам, кто получил доступ к файлу; Вы можете позвонить, lsof /path/to/fileкак только появится эта линия, но есть условие гонки (доступ может быть прекращен к тому времени, когда lsof начнет работу).

  • LoggedFS - это наращиваемая файловая система, которая обеспечивает представление дерева файловой системы и может выполнять более сложные записи всех обращений через это представление. Чтобы настроить его, см. Синтаксис файла конфигурации LoggedFS .

  • Вы можете использовать подсистему аудита Linux для регистрации большого количества вещей, включая доступ к файловой системе. Убедитесь, что auditdдемон запущен, затем настройте то, с чем вы хотите войти auditctl. Каждая регистрируемая операция записывается в /var/log/audit/audit.log(в типичных распределениях). Чтобы начать просмотр определенного файла:

    auditctl -w /path/to/file
    

    Если вы помещаете наблюдение в каталог, рекурсивно также просматриваются файлы в нем и его подкаталогах.

Жиль "ТАК - прекрати быть злым"
источник
Спасибо, Жиль. У меня есть этот файл данных, созданный сценарием. Я просто хочу знать, что происходит с этим файлом после его создания ... ни один из других сценариев не выбирает его для дальнейшего процесса, поэтому я хочу посмотреть, не получит ли кто-нибудь доступ к этому файлу вручную
Джек,
@ Джек: Трудно сказать, не зная намного больше о вашей настройке, но пока ничто не удаляет или не переименовывает файл, другие сценарии смогут его найти, независимо от того, кто-то другой обращается к нему. Из вашего комментария я думаю, что вы должны смотреть на то, что происходит, когда вы запускаете свои скрипты.
Жиль "ТАК - перестань быть злым"
2
Эй, вы могли бы создать хороший круговой цикл с помощью этого:syslogd access log file /var/log/audit.log at 10:01\nsyslogd access log file /var/log/audit.log at 10:02\n...
penguin359
7

Пример выше с inotifywait должен быть одним из (см. Man-страницу для получения дополнительной информации):

inotifywait /path/to/file
inotifywait -e open /pat/to/file

Или с режимом мониторинга и отметкой времени:

inotifywait -m --format '%w:%e:%T' --timefmt '%F %T %Z %z'
Милан Керслагер
источник
6

Предыдущий ответ - не лучшая практика для выполнения того, что вы просите. У Linux есть API для этого. inotifyAPI http://linux.die.net/man/7/inotify

  1. Вы можете написать программу на C, чтобы делать то, что вы хотите, просто вызывая inotifyAPI напрямую
  2. Вы можете использовать kfsmd, http://www.linux.com/archive/feature/124903 демон, который используетinotify
  3. Если вам нужно что-то, что работает на разных платформах ( inotifyспецифично для Linux), и вы используете Java, JNotify работает на разных платформах (Linux, Mac, Windows), абстрагируя базовый API нативной ОС.
лощина
источник
3
Добро пожаловать в Stack Exchange . Ответы представлены не в хронологическом порядке, так что «предыдущий ответ» не показывает, какой ответ вы имеете в виду. Интересно, на какой из двух других вы ссылаетесь в любом случае: у одного нет ничего похожего на хорошую или плохую практику, а другой упоминает API inotify.
Жиль "ТАК - перестань быть злым"
Скорее всего, Глен ссылается на ответ выше с сортировкой голосов по умолчанию. Действительно, самый популярный ответ не дает решения вопроса. Может быть несколько причин, по которым вам может понадобиться узнать, сколько раз к файлам обращаются за определенный период времени.
Wtower
1
Как объясняется в unix.stackexchange.com/a/12251/20336, inotify API не предоставляет информацию о том, кто получил доступ к данному файлу. Плюс inotify действительно не помогает выяснить, кто получил доступ к файлу на прошлой неделе. Для этого вам нужны функции аудита, для которых требуется использовать программное обеспечение под названием auditd(однако даже это не помогает выяснить, кто обращался к файлу на прошлой неделе, если вы auditdуже не работали на прошлой неделе).
Микко Ранталайнен
3

Это, в общем, неосуществимо. Я видел файловые системы с достаточным количеством одитингов, чтобы сделать это так или иначе, но это не обычная вещь Unix, нет.

tchrist
источник