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 pide namedei processi che eliminano il file /tmp/test. Per prima cosa creiamo il file con touch /tmp/test. Quindi iniziamo sysdigcon 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 orfiltro 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.
sysdigdovrebbe 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 sysdigcomando:
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.luafile all'interno di una directory ed eseguirlo sysdigin questa directory per rendere disponibile lo scalpello. Durante la digitazione sudo sysdig -cllo 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 unlinkatfiltro 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/testin un altro terminale. Ho modificato la mia risposta per renderlo più chiaro.