É possível descobrir qual programa ou script criou um determinado arquivo?

35

De repente, três arquivos apareceram no meu diretório pessoal, chamados "client_state.xml", "lockfile" e "time_stats_log". Os dois últimos estão vazios. Eu estou querendo saber como eles chegaram lá. Não é a primeira vez que isso acontece, mas a última vez foi há semanas; Eu apaguei os arquivos e nada quebrou ou reclamou. Não consegui pensar no que estava fazendo no momento relatado por stat $filename. Existe alguma maneira de descobrir de onde eles vieram?

Como alternativa, existe uma maneira de monitorar o diretório inicial (mas não os subdiretórios) para a criação de arquivos?

Lobo
fonte
Desde que eu tenho certeza que alguém vai mencionar isso, eu não tenho inotify.
Wolf

Respostas:

18

Não acredito que haja uma maneira de determinar qual programa criou um arquivo.

Para sua pergunta alternativa: Você pode observar a recriação do arquivo usando inotify. inotifywaité uma interface de linha de comandos para o inotifysubsistema; você pode pedir para procurar createeventos no diretório inicial:

$ (sleep 5; touch ~/making-a-test-file) &
[1] 22526

$ inotifywait -e create ~/
Setting up watches.
Watches established.
/home/mmrozek/ CREATE making-a-test-file

Você provavelmente deseja executá-lo com -m(monitor), que informa para não sair depois de ver o primeiro evento

Michael Mrozek
fonte
Como eu ganho inotify? Não está instalado (kernel 2.6.34) e não existe /dev/inotify.
Wolf
1
@Wolf Que distro? Se você constrói seu próprio kernel, é CONFIG_INOTIFY_USER( Filesystems-> Inotify support for userspace). inotifywaitprovavelmente está em um pacote chamado algo comoinotify-tools
Michael Mrozek
@ Michael, é o openSUSE 11.3. Eu nunca construí um kernel; só usam o Linux há cerca de 5 meses e é um conceito um pouco assustador. Mas vou procurar um tutorial ou algo assim.
Wolf
@Wolf Bem, a resposta de dogbane pode ser mais fácil se o kernel que você tem não vem com ele
Michael Mrozek
2
@ Michael Na verdade, depois de um pouco mais de caça e pesquisa, adicionei um repositório da comunidade que, ao que parece, contém o inotify-toolspacote, então agora tenho inotifywait(e inotifywatch). Eu testei e parece funcionar.
Wolf
22

Você pode assistir a tudo o que acontece em um sistema de arquivos acessando-o através do LoggedFS . Este é um sistema de arquivos empilhados que registra todos os acessos em uma árvore de diretórios.

loggedfs -l /var/tmp/$USER-home-fs.log ~

O registro de todo o diretório pessoal pode reduzir a velocidade do sistema. Você pelo menos desejará escrever um arquivo de configuração com filtros rigorosos.

Se você tiver acesso root, no Linux, poderá usar o subsistema de auditoria para registrar um grande número de coisas, incluindo acessos ao sistema de arquivos. Verifique se o auditddaemon foi iniciado e, em seguida, configure com o qual deseja fazer logon auditctl. Cada operação registrada é registrada em /var/log/audit/audit.log(em distribuições típicas). Para começar a assistir um arquivo específico:

auditctl -w /path/to/file

ou na forma longa

auditctl -a exit,always -F path=/path/to/file

Se você colocar uma observação em um diretório (com -wou -F dir=), os arquivos nele e seus subdiretórios recursivamente também serão observados.

Gilles 'SO- parar de ser mau'
fonte
O BSD também suporta isso via Auditoria de eventos de segurança. freebsd.org/doc/en_US.ISO8859-1/books/handbook/audit.html
Shawn J. Goff
4

Você pode dar uma olhada auditd, este pacote permite que você faça auditorias de segurança e obtenha muitas informações sobre quem mudou o quê no sistema de arquivos.

lutzky
fonte
se você possui um servidor que fornece acesso ao shell para vários usuários e precisa fornecer algum nível de responsabilidade para ações individuais, é possível criar certos shells (como bash e tcsh) com o log do histórico de comandos. Eu escrevi um post de blog sobre como fazer login em shells em < timkennedy.net/2010/12/07/… >. O log do shell não substitui um sistema de auditoria real, pois não registra comandos executados por shells não interativos (como scripts ou programas). Para obter esse tipo de granularidade, você realmente precisa de uma boa solução de auditoria.
Tim Kennedy
1
@ TimKennedy - seu blog não está mais aparecendo.
slm
1
Desculpe. O site foi hackeado e ficou inativo por um tempo. nova página está em timkennedy.net/2010/12/logging-shell-commands-to-syslog-on.html
Tim Kennedy
3

Sei que essa é uma pergunta antiga, mas vou sugerir outra abordagem, caso alguém ache útil. Originalmente, eu postei isso como resposta a uma pergunta que foi enganada para esta.

Uma opção é usar sysdig: um aplicativo de monitoramento de sistema de código aberto. Utilizando-o, você pode monitorar a atividade em um arquivo por nome. Suponha que você desejasse ver qual processo estava criando um arquivo chamado /tmp/example.txt:

# sysdig fd.name=/tmp/example.txt
567335 16:18:39.654437223 0 touch (5470) < openat fd=3(<f>/tmp/example.txt) dirfd=-100(AT_FDCWD) name=/tmp/example.txt flags=70(O_NONBLOCK|O_CREAT|O_WRONLY) mode=0666
567336 16:18:39.654438248 0 touch (5470) > dup fd=3(<f>/tmp/example.txt)
567337 16:18:39.654438592 0 touch (5470) < dup res=0(<f>/tmp/example.txt)
567338 16:18:39.654439629 0 touch (5470) > close fd=3(<f>/tmp/example.txt)
567339 16:18:39.654439764 0 touch (5470) < close res=0
567342 16:18:39.654441958 0 touch (5470) > close fd=0(<f>/tmp/example.txt)
567343 16:18:39.654442111 0 touch (5470) < close res=0

A partir dessa saída, você pode ver que um processo chamado touchpid 5470 abriu o arquivo.

Se você quiser obter mais informações, poderá executar no "modo de captura" onde um rastreamento de chamada do sistema é coletado:

# sysdig -w /tmp/dumpfile.scap

Aguarde a criação do arquivo, pare sysdige execute:

# csysdig -r /tmp/dumpfile.scap

Isso permitirá que você explore tudo o que aconteceu. Você pode pressionar <F2>e selecionar Files, pressione <F4>para procurar o nome do arquivo e, em seguida, pressione <F6>para "dig" (que mostrará uma saída semelhante ao comando acima). Com isso, você pode usar a mesma abordagem para encontrar informações sobre o processo que realmente criou o arquivo.

Existe uma versão GUI do csysdigchamado sysdig-inspect, se é mais a sua xícara de chá.

Andy Dalton
fonte
ou talvez um loop ocupado que execute constantemente lsof tentando ver se / quando um processo está gravando nesse arquivo ... unix.stackexchange.com/a/13782/8337
rogerdpack 07/11
2

Você não precisa, inotifyportanto, pode escrever um script que verifique o arquivo em um loop:

#!/bin/sh

while [ true ]; do                     # Run for as long as nessesary
  if [ -f /path/to/file ]; then        # If fileexists
    echo "Found file"                  # Notify and stop monitoring
    exit 0
  fi
  sleep 5                             # Else wait 5 secs
done
dogbane
fonte
2
Isso não mostra qual programa o criou.
OverCoder