Ich arbeite an einem Projekt im Zusammenhang mit der VM-Migration. Manchmal verschwindet das VM-Image und ich möchte nur wissen, wer der Schuldige ist. Ich habe mich an verdächtigen Prozessen versucht, aber ohne Erfolg.
Ich arbeite an einem Projekt im Zusammenhang mit der VM-Migration. Manchmal verschwindet das VM-Image und ich möchte nur wissen, wer der Schuldige ist. Ich habe mich an verdächtigen Prozessen versucht, aber ohne Erfolg.
Antworten:
Endlich habe ich die Antwort hier gefunden .
Der Linux Audit-Daemon erledigt den Trick.
sudo auditctl -w /path/to/somefile -p wra
und dann
ausearch -f /path/to/somefile -i
Sie können die PID eines Prozesses ermitteln, bei dem eine Datei mit geöffnet wurde lsof
.
Sobald die Datei geschlossen und gelöscht wurde, können Sie diese Informationen nicht mehr abrufen.
Übrigens. Denken Sie daran, dass das Löschen einer Datei in einem Verzeichnis ausgeführt wird, in dem sie sich befindet, nicht in einer Datei selbst.
Lassen Sie mich eine Alternative mit sysdig vorschlagen, da die obigen Antworten immer älter werden. Lassen Sie sich das pid
und name
der Prozesse anzeigen, die die Datei löschen /tmp/test
. Zuerst erstellen wir die Datei mit touch /tmp/test
. Dann beginnen wir sysdig
mit folgendem Filter:
$ 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)
erfordert einen or
Filter, wenn der Pfad (z. B. evt.arg.name
) relativ sein kann . Um sowohl unlink
(welche Aufrufe unlink(2)
) als auch rm
(welche Aufrufe unlinkat(2)
in der GNU-Version) zu verarbeiten, sollte der Filter mit beiden Systemaufrufen übereinstimmen.
sysdig
sollte ausgeführt werden, wenn ein Prozess die Datei löscht. Wenn wir dann solche Befehle ausführen:
$ unlink /tmp/test
$ touch /tmp/test
$ rm /tmp/test
$ cd /tmp; touch test; rm test
Es wird eine solche Ausgabe angezeigt:
11380,unlink
11407,rm
11662,rm
Weitere Informationen zum Filtern und zur Ausgabe finden Sie im sysdig-Benutzerhandbuch .
Da der Filter ziemlich lang ist, fand ich es praktisch, einen Meißel zu schreiben. Es ist ein Lua-Skript, das einem sysdig
Befehl zugeordnet ist:
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
Fühlen Sie sich frei zu kommentieren und zu verbessern. Sie können das lua-Skript in einer spy_deletes.lua
Datei in einem Verzeichnis ablegen und sysdig
in diesem Verzeichnis ausführen , um den Meißel verfügbar zu machen. Während der Eingabe sudo sysdig -cl
sehen Sie Folgendes:
Category: files
---------------
spy_deletes spy file deletion
Jetzt können Sie es anrufen:
$ sudo sysdig -c spy_deletes /tmp/test
Und in einem anderen Terminaltyp:
$ touch test; unlink test
$ touch test; unlink /tmp/test
$ touch test; rm test
$ touch test; rm /tmp/test
Es wird ausgegeben:
16025 unlink
16033 unlink
16041 rm
16049 rm
Der unlinkat
Filter hätte es verdient, genauer zu sein und nur dem absoluten Pfad zu entsprechen. Dies würde erfordern, das fd des Verzeichnisses abzurufen, das an übergeben wird unlinkat(2)
.
rm /tmp/test
in einem anderen Terminal getippt. Ich habe meine Antwort bearbeitet, um sie klarer zu machen.