Descubra qual processo está alterando um arquivo

35

Estou tentando encontrar uma maneira confiável de descobrir qual processo na minha máquina está alterando um arquivo de configuração ( /etc/hostspara ser específico).

Eu sei que posso usar lsof /etc/hostspara descobrir quais processos atualmente têm o arquivo aberto, mas isso não ajuda, porque o processo está obviamente abrindo o arquivo, gravando nele e fechando-o novamente.

Também observei a lsofopção de repetição da opção (-r), mas ela parece ser tão rápida quanto uma vez por segundo, o que provavelmente nunca capturará a gravação em andamento.

Conheço algumas ferramentas para monitorar alterações no sistema de arquivos, mas, neste caso, quero saber qual processo é responsável, o que significa capturá-lo em flagrante.

risos
fonte

Respostas:

53

Você pode usar a auditoria para encontrar isso. Se ainda não estiver disponível, instale e ative a auditoria para sua distribuição.

definir uma inspeção de auditoria em / etc / hosts

/sbin/auditctl -w /etc/hosts -p war -k hosts-file

-w watch /etc/hosts
-p warx watch for write, attribute change, execute or read events
-k hosts-file is a search key.

Aguarde até que o arquivo hosts seja alterado e use o ausearch para ver o que está registrado

/sbin/ausearch -f /etc/hosts | more

Você obterá grandes quantidades de produção, por exemplo


time-> Wed 12 de outubro 09:34:07 2011 type = PATH msg = audit (1318408447.180: 870): item = 0 name = "/ etc / hosts" inode = 2211062 dev = fd: 00 mode = 0100644 ouid = 0 ogid = 0 rdev = 00: 00 obj = system_u: object_r: etc_t: s0 tipo = CWD msg = auditoria (1318408447.180: 870): cwd = "/ home / iain" tipo = SYSCALL msg = audit (1318408447.180: 870): arch = c000003e syscall = 2 success = yes exit = 0 a0 = 7fff73641c4f a1 = 941 a2 = 1b6 a3 = 3e7075310c itens = 1 ppid = 7259 pid = 7294 au id = 1001 uid = 0 gid = 0 euid = 0 suid = 0 fsuid = 0 egid = 0 sgid = 0 fsgid = 0 tty = pts0 ses = 123 comm = "touch" exe = "/ bin / touch" subj = user_u: system_r: unconfined_t: s0 key = "hosts-file"


Nesse caso, usei o comando touch para alterar o registro de data e hora dos arquivos, o pid era 7294 e o ppid, 7259 (meu shell).

user9517 suporta GoFundMonica
fonte
2
A "habilitar auditoria para sua distribuição" provavelmente deve ser expandida um pouco. Irritantemente, os comandos acima não me deram erros nem resultados. "/ sbin / auditctl -e 1" também não ajudou. A execução de um deamon de auditoria para fazer o registro ajudou - "/etc/init.d/auditd start" (embora tenha excluído minhas regras, tive que digitá-las novamente).
21712 Tobixen
Não funcionou para mim, ausearchsempre retorna<no matches>
m0skit0
1
Às vezes, pode ser necessário definir várias auditorias para obter o processo real que iniciou a modificação, se esse processo, por exemplo, estiver chamando um comando externo para fazer o trabalho. ou seja, eu estava tentando descobrir por que uma entrada do usuário no crontab estava sendo constantemente redefinida. O comando crontab foi o responsável, mas quando chequei o ppid em que ele havia saído, tive que auditar / usr / bin / crontab também, em seguida, corresponder o carimbo de data e hora do acesso ao crontab à execução auditada do crontab e verificar é ppid ... que revelou que um daemon de orquestração estava aplicando uma configuração cron específica do usuário.
Wil
3

Você também pode usar as ferramentas inotify:

  inotifywait -mq -e open -e modify /etc/hosts
Dragos
fonte
14
O Auditd pode fornecer as informações que você deseja. Mesmo que seja fácil supor que o inotify permitirá que você faça isso - isso não acontecerá, pois não fornecerá o ID do processo que fez a modificação.
objetivou
2

Depois de muita pesquisa, encontrei a solução, basta usar este comando: sudo fs_usage | grep [path_to_file]

treblam
fonte
2
isto é para MacOS única ...
majick