Finalmente, encontrei a resposta aqui .
O daemon do Linux Audit fará o truque.
sudo auditctl -w /path/to/somefile -p wra
e depois
ausearch -f /path/to/somefile -i
Estou trabalhando em um projeto relacionado à migração de VMs. Às vezes a imagem da VM desaparece e eu só quero saber quem é o culpado. Eu tentei strace em processos suspeitos, mas sem sucesso.
Você pode descobrir o PID de um processo, que tem algum arquivo aberto usando lsof
.
Quando o arquivo for fechado e excluído, você não poderá obter essa informação.
BTW. Tenha em mente que a exclusão de um arquivo é uma operação no diretório em que ele está, não em um arquivo em si.
Deixe-me sugerir uma alternativa com o sysdig , pois as respostas acima estão envelhecidas. Vamos exibir os pid
e name
dos processos que excluem o arquivo /tmp/test
. Primeiro criamos o arquivo com touch /tmp/test
. Em seguida, iniciamos sysdig
com o seguinte 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)
requer um filtro or
se o caminho (por exemplo, evt.arg.name
) puder ser relativo . Para lidar com unlink
(que chama unlink(2)
) e rm
(que chama unlinkat(2)
em sua versão GNU), o filtro deve corresponder aos dois syscalls.
sysdig
deve estar em execução quando um processo excluir o arquivo. Então quando nós executamos tais comandos:
$ unlink /tmp/test
$ touch /tmp/test
$ rm /tmp/test
$ cd /tmp; touch test; rm test
Ele exibirá essa saída:
11380,unlink
11407,rm
11662,rm
Consulte o guia do usuário do sysdig para obter uma explicação sobre filtragem e saída.
Como o filtro é bem longo, achei conveniente escrever um cinzel. É um script de lua associado a um comando sysdig
:
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
Sinta-se à vontade para comentar e melhorar. Você pode colocar o script lua em um arquivo spy_deletes.lua
dentro de um diretório e executar sysdig
neste diretório para disponibilizar o formão. Ao digitar sudo sysdig -cl
, você verá como:
Category: files
---------------
spy_deletes spy file deletion
Agora você pode ligar:
$ sudo sysdig -c spy_deletes /tmp/test
E em outro tipo de terminal:
$ touch test; unlink test
$ touch test; unlink /tmp/test
$ touch test; rm test
$ touch test; rm /tmp/test
Será produzido:
16025 unlink
16033 unlink
16041 rm
16049 rm
O filtro unlinkat
merece ser mais preciso e corresponder apenas ao caminho absoluto. Isso exigiria recuperar o fd do diretório passado para unlinkat(2)
.