Sto lavorando a un progetto relativo alla migrazione della VM. A volte l'immagine della VM scompare e voglio solo sapere chi è il colpevole. Ho provato a fare passi in avanti su processi sospetti ma senza risultati.
Sto lavorando a un progetto relativo alla migrazione della VM. A volte l'immagine della VM scompare e voglio solo sapere chi è il colpevole. Ho provato a fare passi in avanti su processi sospetti ma senza risultati.
Risposte:
Finalmente ho trovato la risposta qui .
Il demone di Linux Audit farà il trucco.
sudo auditctl -w /path/to/somefile -p wra
e poi
ausearch -f /path/to/somefile -i
È possibile scoprire il PID di un processo, che ha alcuni file aperti utilizzando lsof
.
Una volta chiuso ed eliminato il file, non è possibile ottenere tali informazioni.
BTW. Tieni presente che l'eliminazione di un file è un'operazione sulla directory in cui si trova, non su un file stesso.
Vorrei suggerire un'alternativa con sysdig poiché le risposte sopra stanno invecchiando. Consentire di visualizzare il pid
e name
dei processi che eliminano il file /tmp/test
. Per prima cosa creiamo il file con touch /tmp/test
. Quindi iniziamo sysdig
con il seguente filtro:
$ 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)
richiede un or
filtro se il percorso (ad es. evt.arg.name
) può essere relativo . Per gestire sia unlink
(che chiama unlink(2)
) che rm
(che chiama unlinkat(2)
nella sua versione GNU), il filtro dovrebbe corrispondere ad entrambi i syscall.
sysdig
dovrebbe essere in esecuzione quando un processo elimina il file. Quindi quando eseguiamo tali comandi:
$ unlink /tmp/test
$ touch /tmp/test
$ rm /tmp/test
$ cd /tmp; touch test; rm test
Verrà visualizzato un tale output:
11380,unlink
11407,rm
11662,rm
Consultare la guida per l' utente di sysdig per una spiegazione sul filtro e sull'output.
Dato che il filtro è piuttosto lungo, ho trovato conveniente scrivere uno scalpello. È uno script lua associato a un sysdig
comando:
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
Sentiti libero di commentare e migliorarlo. È possibile inserire lo script lua in un spy_deletes.lua
file all'interno di una directory ed eseguirlo sysdig
in questa directory per rendere disponibile lo scalpello. Durante la digitazione sudo sysdig -cl
lo vedrai come:
Category: files
---------------
spy_deletes spy file deletion
Ora puoi chiamarlo:
$ sudo sysdig -c spy_deletes /tmp/test
E in un altro tipo di terminale:
$ touch test; unlink test
$ touch test; unlink /tmp/test
$ touch test; rm test
$ touch test; rm /tmp/test
Produrrà:
16025 unlink
16033 unlink
16041 rm
16049 rm
Il unlinkat
filtro meriterebbe di essere più preciso e corrispondere solo al percorso assoluto. Ciò richiederebbe il recupero del file fd della directory passata a unlinkat(2)
.
rm /tmp/test
in un altro terminale. Ho modificato la mia risposta per renderlo più chiaro.