web-dev-qa-db-ja.com

ファイルを変更しているプロセスを見つける

実稼働サーバー上の特定のファイルが、ログアクティビティと相関していないように見えるランダムな時間に変更されています。どのプログラムがそれをしているのか理解できませんし、容疑者もたくさんいます。どうすれば犯人を見つけることができますか?

これは常に同じファイルで、同じパスにありますが、異なるサーバー上および異なる時間にあります。ボックスは puppet によって管理されますが、ファイルが変更された時点でパペットログにはアクティビティが表示されません。

このファイルを変更しているプロセスを見つけるのに役立つカーネルフック、ツール、またはテクニックはどれですか。


lsofは、ファイルのオープン、変更、クローズが非常に速いため、これには適していません。ポーリングに依存するソリューション(lsofを頻繁に実行するなど)は適切ではありません。


  • OS:Debianテスト
  • カーネル:Linux、2.6.32〜3.9、32ビットと64ビットの両方。
21
Wayne Conrad

Auditdを使用して、監視するファイルのルールを追加できます。

auditctl -w /path/to/that/file -p wa

次に、/var/log/audit/audit.logに書き込まれるエントリを監視します。

24

SystemTapは inodewatchスクリプト を使用してこれを行うことができます。

4
Mark Plotnick

アクションでそれをキャッチできる場合、つまりファイルが現在アクセスされている場合は、lsofを実行してプロセスを見つけることができます。

$ while :; do echo foo >> bar.txt; done &
$ Sudo lsof bar.txt
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
bash    25723 terdon    1u   REG    8,6  5015796 16647496 bar.txt
2
terdon

探しているプログラムがまだファイルを開いている場合は、以下を使用できます。

 Sudo lsof /path/to/file/being/modified

これを小さなループで呼び出して、次のスクリプトgetfileusers.sh

 #!/bin/sh

 FILE=$1

 while true; do
    lsof "${FILE}"
 done > /tmp/fileusers.log

そしてそれを呼び出す:

 Sudo ./getfileusers.sh /path/to/file/being/modified

そして最終的に/tmp/fileusers.log誰がファイルに触れたかを確認するには...

2
umläute