回答:
最後にここで答えを見つけました。
Linux Auditデーモンがトリックを行います。
sudo auditctl -w /path/to/somefile -p wra
その後
ausearch -f /path/to/somefile -i
上記の回答は古くなっているため、sysdigを使用した代替案を提案します。ファイルを削除するプロセスpid
とname
を表示してみましょう/tmp/test
。まず、でファイルを作成しますtouch /tmp/test
。次にsysdig
、次のフィルターから始めます。
$ sudo sysdig -p'%proc.pid,%proc.name' '(evt.type=unlinkat and (evt.arg.name=test or evt.arg.name=/tmp/test)) or (evt.type=unlink and evt.arg.path=/tmp/test)'
unlinkat(2)
パス(例)が相対的なor
場合、フィルターが必要です。(を呼び出す)と(GNUバージョンを呼び出す)の両方を処理するには、フィルターは両方のsyscallに一致する必要があります。evt.arg.name
unlink
unlink(2)
rm
unlinkat(2)
sysdig
プロセスがファイルを削除するときに実行されている必要があります。そのようなコマンドを実行すると:
$ unlink /tmp/test
$ touch /tmp/test
$ rm /tmp/test
$ cd /tmp; touch test; rm test
次のような出力が表示されます。
11380,unlink
11407,rm
11662,rm
フィルタリングと出力の説明については、sysdigユーザーガイドを参照してください。
フィルターはかなり長いので、ノミを書くのが便利だと思いました。sysdig
コマンドに関連付けられているluaスクリプトです。
description = "displays processes that delete a file"
short_description = "spy file deletion"
category = "files"
args =
{
{
name = "path",
description = "the path of the file to monitor",
argtype = "string"
},
}
function on_set_arg(name, val)
path = val
return true
end
function on_init()
local filename = path
for i in string.gmatch(path, "[^/]+") do
filename = i
end
chisel.set_event_formatter("%proc.pid\t%proc.name")
chisel.set_filter(
"(evt.type=unlinkat and (evt.arg.name=" .. path .. " or \
evt.arg.name=" .. filename .. ")) or \
(evt.type=unlink and evt.arg.path=" .. path .. ")")
return true
end
コメントして改善してください。luaスクリプトはspy_deletes.lua
ディレクトリ内ファイルに配置し、sysdig
このディレクトリで実行して、チゼルを使用可能にすることができます。入力sudo sysdig -cl
すると、次のように表示されます。
Category: files
---------------
spy_deletes spy file deletion
今、あなたはそれを呼び出すことができます:
$ sudo sysdig -c spy_deletes /tmp/test
そして、別の端末タイプで:
$ touch test; unlink test
$ touch test; unlink /tmp/test
$ touch test; rm test
$ touch test; rm /tmp/test
出力されます:
16025 unlink
16033 unlink
16041 rm
16049 rm
unlinkat
フィルタは、より正確であるとだけ絶対パスを一致させるために値するでしょう。これには、に渡されるディレクトリのfdを取得する必要がありますunlinkat(2)
。
rm /tmp/test
別の端末で入力していました。回答を編集してわかりやすくしました。