Configuring Linux
27 April 2010

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

Зачастую пользователям и системным администратором необходимо отслеживать, к каким файлам обращается приложение. В Linux-е уже есть все средства для этого, и тем удивительнее постоянно слышать на форумах — есть ли аналог Sysinternal Filemon. В данной статье я опишу использование утилиты strace, и рассмотрю ряд моментов, которые ускользают от некоторых пользователей, полагающих, что приложениям надо ограничивать права даже на чтение, например, ограничить доступ mplayer-а только к показываемому фильму.

strace — это трассировщик системных вызовов и сигналов. Для работы с файлами используется системный вызов «open», и соответственно, необходимо отслеживать только его. Пример команды:
$ strace -xf -eopen -o /path/to/log /path/to/program

Здесь мы указываем отслеживать все дочерние процессы, заменять непечатаемые символы на шестнадцатеричное представление и сохранять лог вызовов в файл /path/to/log. Потом полученный лог можно обработать соответствующими инструментами. Далее будут приведены примеры, как можно вычленить из лога всю нужную информацию.

Мониторинг текстового редактора nano


Для начала посмотрим, к каким файлам обращается простейший текстовой редактор nano:
$ strace -xf -eopen -o out.log nano temp.txt
$ sed -n 's/.*open(\(.*\))\s*=.*/\1/p' out.log | sort

Командой sed мы преобразуем лог в более краткий формат для читабельности, и сортируем строчки. В итоге должно вывестись что-то типа такого:
"/etc/ld.so.cache", O_RDONLY
"/etc/nanorc", O_RDONLY
"/home/nuald/.nano_history", O_RDONLY
"/home/nuald/.nano_history", O_WRONLY|O_CREAT|O_TRUNC, 0666
"/home/nuald/.nanorc", O_RDONLY
"/lib/libc.so.6", O_RDONLY
"/lib/libdl.so.2", O_RDONLY
"/lib/libncursesw.so.5", O_RDONLY
"/lib/terminfo/x/xterm", O_RDONLY
"temp.txt", O_WRONLY|O_CREAT|O_TRUNC, 0666
"/usr/lib/gconv/gconv-modules.cache", O_RDONLY
"/usr/lib/locale/en_US.utf8/LC_ADDRESS", O_RDONLY
... другие библиотеки для работы с локалью
"/usr/lib/locale/locale-archive", O_RDONLY
"/usr/share/locale/en/LC_MESSAGES/nano.mo", O_RDONLY
... другие файлы локализации
"/usr/share/locale/locale.alias", O_RDONLY

Можно выделить следующие категории файлов, к которым обращается программа:
  • Конфигурация nano (nanorc, ~/.nano_history)
  • Динамические библиотеки, используемые программой (libc и др.)
  • Файлы локализации
  • И собственно редактируемый файл

Т.е. в процессе работы программам нужен доступ к достаточному большому количеству файлов, и ограничение доступа на чтение отрицательно повлияет на работоспособность программ.

Мониторинг видеопроигрывателя mplayer


Теперь попробуем запустить mplayer и проверить те файлы, в которые он только пишет. Возможно, это нам даст возможность составить нужный безопасный профиль работы программы.

$ strace -xf -eopen -o out.log mplayer test.mp4
$ sed -n 's/.*open(\(.*\))\s*=.*/\1/p' out.log | grep -v O_RDONLY | sort

"/dev/3dfx", O_RDWR
"/dev/fb0", O_RDWR
"/dev/mga_vid", O_RDWR
"/dev/mga_vid", O_RDWR
"/dev/shm/pulse-shm-3056117003", O_RDWR|O_CREAT|O_EXCL|O_NOFOLLOW|O_CLOEXEC, 0400
"/home/nuald/.mplayer/config", O_WRONLY|O_CREAT|O_EXCL, 0666
"/home/nuald/.pulse-cookie", O_RDWR|O_CREAT|O_NOCTTY, 0600

Здесь мы командой grep ограничили вывод, и не включали файлы, которые были открыты с флагом O_RDONLY (только на чтение). Как видите, и здесь не все так гладко — mplayer-у приходится писать в другие файлы, и возможно ограничение доступа полностью его сломает, и он не сможет воспроизводить видео. Так что приведенную выше идею об ограничении доступа не так просто будет реализовать, и точно не реализовать в ее изначальном смысле.

Заключение


В этом небольшом эскурсе была приведена лишь одна область применения strace. У данной программы есть много замечательных способностей, и она может позволить избавиться от бессонных ночей в поисках причин неработоспобности приложений даже без применения отладчика. Это инструмент, который должен знать любой Linux-разработчик, и надеюсь, что это принесет вам пользу в борьбе с многочисленными багами, и повысить качество разрабатываемого программного обеспечения.

P.S. Приведу список других инструментов, полезных для мониторинга доступа к файлам:
  • SystemTap — инструментарий для сбора статистики. Острожно — требует debug-версии ядра (из него он берет отладочные символы и информацию). Пример мониторинга операции «open» описан в документации.
  • /proc/sys/vm/block_dump — Отладка блокового ввода-вывода.
  • inotify -подсистема ядра Linux, которая позволяет получать уведомления об изменениях в файловой системе. Можно использовать через inotify tools.

+53
23.5k 129
Comments 26
Top of the day