Como monitoro arquivos abertos de um processo em tempo real?

38

Eu sei que posso ver os arquivos abertos de um processo usando lsof naquele momento na minha máquina Linux. No entanto, um processo pode abrir, alterar e fechar um arquivo tão rapidamente que não serei capaz de vê-lo ao monitorá-lo usando o shell script padrão (por exemplo, watch ) conforme explicado em " monitora arquivos de processos abertos no linux (tempo real) ".

Então, acho que estou procurando uma maneira simples de auditar um processo e ver o que ele fez ao longo do tempo. Seria ótimo se também fosse possível ver quais conexões de rede (tentaram) fazer e fazer com que a auditoria iniciasse antes que o processo tivesse tempo de ser executado sem que a auditoria fosse iniciada.

Idealmente, gostaria de fazer isso:

sh $ audit-lsof /path/to/executable
4530.848254 OPEN  read  /etc/myconfig
4530.848260 OPEN  write /var/log/mylog.log
4540.345986 OPEN  read  /home/gert/.ssh/id_rsa          <-- suspicious
4540.650345 OPEN  socket TCP ::1:34895 -> 1.2.3.4:80    |
[...]
4541.023485 CLOSE       /home/gert/.ssh/id_rsa          <-- would have missed
4541.023485 CLOSE socket TCP ::1:34895 -> 1.2.3.4:80    |   this when polling

Isso seria possível usando strace e alguns sinalizadores para não ver todas as chamadas do sistema?

    
por gertvdijk 19.12.2012 / 14:16

1 resposta

47

Executando com

strace -e trace=open,close,read,write,connect,accept your-command-here

provavelmente seria suficiente.

Você precisará usar a opção -o para colocar a saída do strace em algum lugar que não seja o console, se o processo puder ser impresso no stderr. Se o seu processo forks, você também precisará de -f ou -ff .

Ah, e você pode querer -t , assim você pode ver quando as chamadas acontecerem.

Note que você pode precisar ajustar a lista de chamadas de função dependendo do seu processo - eu precisava adicionar getdents , por exemplo, para obter uma amostra melhor usando ls :

$ strace -t -e trace=open,close,read,getdents,write,connect,accept ls >/dev/null
...
09:34:48 open("/etc/ld.so.cache", O_RDONLY) = 3
09:34:48 close(3)                       = 0
09:34:48 open("/lib64/libselinux.so.1", O_RDONLY) = 3
09:34:48 read(3, "7ELF
strace -e trace=open,close,read,write,connect,accept your-command-here
$ strace -t -e trace=open,close,read,getdents,write,connect,accept ls >/dev/null
...
09:34:48 open("/etc/ld.so.cache", O_RDONLY) = 3
09:34:48 close(3)                       = 0
09:34:48 open("/lib64/libselinux.so.1", O_RDONLY) = 3
09:34:48 read(3, "7ELF%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%>%pre%%pre%%pre%%pre%@V%pre%%pre%%pre%%pre%%pre%%pre%"..., 832) = 832
09:34:48 close(3)                       = 0
...
09:34:48 open("/proc/filesystems", O_RDONLY) = 3
09:34:48 read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tb"..., 1024) = 366
09:34:48 read(3, "", 1024)              = 0
09:34:48 close(3)                       = 0
09:34:48 open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
09:34:48 close(3)                       = 0
09:34:48 open(".", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
09:34:48 getdents(3, /* 5 entries */, 32768) = 144
09:34:48 getdents(3, /* 0 entries */, 32768) = 0
09:34:48 close(3)                       = 0
09:34:48 write(1, "file-A\nfile-B\nfile-C\n", 21) = 21
09:34:48 close(1)                       = 0
09:34:48 close(2)                       = 0
%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%>%pre%%pre%%pre%%pre%@V%pre%%pre%%pre%%pre%%pre%%pre%"..., 832) = 832 09:34:48 close(3) = 0 ... 09:34:48 open("/proc/filesystems", O_RDONLY) = 3 09:34:48 read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tb"..., 1024) = 366 09:34:48 read(3, "", 1024) = 0 09:34:48 close(3) = 0 09:34:48 open("/usr/lib/locale/locale-archive", O_RDONLY) = 3 09:34:48 close(3) = 0 09:34:48 open(".", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3 09:34:48 getdents(3, /* 5 entries */, 32768) = 144 09:34:48 getdents(3, /* 0 entries */, 32768) = 0 09:34:48 close(3) = 0 09:34:48 write(1, "file-A\nfile-B\nfile-C\n", 21) = 21 09:34:48 close(1) = 0 09:34:48 close(2) = 0
    
por 19.12.2012 / 15:30