Pracuję nad projektem związanym z migracją VM. Czasami obraz VM zniknie, a ja po prostu chcę wiedzieć, kto jest winowajcą. Próbowałem śledzić podejrzane procesy, ale bezskutecznie.
Pracuję nad projektem związanym z migracją VM. Czasami obraz VM zniknie, a ja po prostu chcę wiedzieć, kto jest winowajcą. Próbowałem śledzić podejrzane procesy, ale bezskutecznie.
Odpowiedzi:
W końcu znalazłem odpowiedź tutaj .
Demon kontroli systemu Linux załatwi sprawę.
sudo auditctl -w /path/to/somefile -p wra
i wtedy
ausearch -f /path/to/somefile -i
Możesz znaleźć PID procesu, w którym niektóre pliki są otwarte przy użyciu lsof
.
Po zamknięciu i usunięciu pliku nie można uzyskać tych informacji.
BTW. Pamiętaj, że usunięcie pliku jest operacją na katalogu, w którym się znajduje, a nie na samym pliku.
Pozwól, że zasugeruję alternatywę dla sysdig, ponieważ powyższe odpowiedzi się starzeją. Pozwól wyświetlić pid
i name
procesów, które usuwają plik /tmp/test
. Najpierw tworzymy plik za pomocą touch /tmp/test
. Następnie zaczynamy sysdig
od następującego filtra:
$ 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)
wymaga or
filtra, jeśli ścieżka (np. evt.arg.name
) może być względna . Aby obsłużyć oba unlink
(które wywołania unlink(2)
) i rm
(które wywołują unlinkat(2)
w wersji GNU), filtr powinien pasować do obu wywołań systemowych.
sysdig
powinien być uruchomiony, gdy proces usuwa plik. Następnie, gdy wykonujemy takie polecenia:
$ unlink /tmp/test
$ touch /tmp/test
$ rm /tmp/test
$ cd /tmp; touch test; rm test
Wyświetli takie wyjście:
11380,unlink
11407,rm
11662,rm
Objaśnienie dotyczące filtrowania i danych wyjściowych znajduje się w podręczniku użytkownika sysdig .
Ponieważ filtr jest dość długi, wygodne było napisanie dłuta. Jest to skrypt lua powiązany z sysdig
poleceniem:
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
Skomentuj i popraw. Możesz umieścić skrypt lua w spy_deletes.lua
pliku w katalogu i wykonać sysdig
w tym katalogu, aby udostępnić dłuto. Podczas pisania sudo sysdig -cl
zobaczysz to jako:
Category: files
---------------
spy_deletes spy file deletion
Teraz możesz to nazwać:
$ sudo sysdig -c spy_deletes /tmp/test
I w innym typie terminala:
$ touch test; unlink test
$ touch test; unlink /tmp/test
$ touch test; rm test
$ touch test; rm /tmp/test
Wyprowadzi:
16025 unlink
16033 unlink
16041 rm
16049 rm
unlinkat
Filtr będzie zasługują na dokładniejsze i tylko dopasować ścieżkę bezwzględną. Wymagałoby to odzyskania fd z katalogu przekazanego unlinkat(2)
.
rm /tmp/test
inny terminal. Zredagowałem swoją odpowiedź, aby była jaśniejsza.