Detectando qual comando / script excluindo seus arquivos usando inotifywait

0

Um dos nossos servidores de aplicativos exclui periodicamente o arquivo interno:

/home/test/data

O problema é que ainda não sabemos qual o script ou comando excluindo os arquivos para que tentemos usar o inotifywait. Somos capazes de registrar o datetime, mas não conseguimos recuperar as informações necessárias. Posso configurar / customizar este inotify para mostrar quem é o culpado que está excluindo meus arquivos?

Amostra de registro:

/opt/asd CREATE 2017/04/03-17:49:05
/opt/asd DELETE 2017/04/03-17:49:11
/opt/wira/.bash_history MODIFY 2017/04/03-17:51:29
/opt/wira/.bash_history MODIFY 2017/04/03-17:51:29
/opt/wira/.bash_history MODIFY 2017/04/03-17:51:29
/home/test/data/test DELETE 2017/04/03-17:52:16
/home/test/data/c/test DELETE 2017/04/03-17:58:00
/home/test/data/c DELETE,ISDIR 2017/04/03-17:58:00

Esta é a nossa configuração

# specify log file
LOGFILE=/var/log/inotify.log
# specify target directory for monitoring
MONITOR=/home/test/data
# specify target events for monitoring ( comma separated )
# refer ro "man inotifywait" for kinds of events
EVENT=delete,modify,move
    
por Shin Dapaty 03.04.2017 / 23:44

2 respostas

1

A ferramenta para fazer isso é auditd , que é

the userspace component to the Linux Auditing System. It's responsible for writing audit records to the disk. Viewing the logs is done with the ausearch or aureport utilities. Configuring the audit rules is done with the auditctl utility. During startup, the rules in /etc/audit/audit.rules are read by auditctl. The audit daemon itself has some configuration options that the admin may wish to customize. They are found in the auditd.conf file.

(do Manual ). Para detectar um arquivo que está sendo apagado, depois de instalar o pacote auditd e iniciá-lo, você audita a pasta contida do arquivo em questão, da seguinte forma:

    
    $ touch zz
    $ sudo auditctl -w /home/me -p wa
    $ rm /home/me/zz
    $ sudo cat /var/log/audit/audit.log
    type=DAEMON_START msg=audit(1491310210.803:235): auditd start, ver=2.4.5 format=raw kernel=4.8.0-45-generic auid=4294967295 pid=29913 subj=unconfined  res=success
    type=USER_AUTH msg=audit(1491310280.366:26): pid=30060 uid=1000 auid=1000 ses=2 msg='op=PAM:authentication acct="e" exe="/usr/bin/sudo" hostname=? addr=? terminal=/dev/pts/6 res=success'
    type=USER_ACCT msg=audit(1491310280.366:27): pid=30060 uid=1000 auid=1000 ses=2 msg='op=PAM:accounting acct="me" exe="/usr/bin/sudo" hostname=? addr=? terminal=/dev/pts/6 res=success'
    type=USER_CMD msg=audit(1491310280.366:28): pid=30060 uid=1000 auid=1000 ses=2 msg='cwd="/home/me" cmd=617564697463746C202D77202F686F6D652F6D6172696F202D70207761 terminal=pts/6 res=success'
    type=CRED_REFR msg=audit(1491310280.366:29): pid=30060 uid=0 auid=1000 ses=2 msg='op=PAM:setcred acct="root" exe="/usr/bin/sudo" hostname=? addr=? terminal=/dev/pts/6 res=success'
    type=USER_START msg=audit(1491310280.366:30): pid=30060 uid=0 auid=1000 ses=2 msg='op=PAM:session_open acct="root" exe="/usr/bin/sudo" hostname=? addr=? terminal=/dev/pts/6 res=success'
    type=CONFIG_CHANGE msg=audit(1491310280.390:31): auid=1000 ses=2 op="add_rule" key=(null) list=4 res=1
    type=USER_END msg=audit(1491310280.390:32): pid=30060 uid=0 auid=1000 ses=2 msg='op=PAM:session_close acct="root" exe="/usr/bin/sudo" hostname=? addr=? terminal=/dev/pts/6 res=success'
    type=CRED_DISP msg=audit(1491310280.390:33): pid=30060 uid=0 auid=1000 ses=2 msg='op=PAM:setcred acct="root" exe="/usr/bin/sudo" hostname=? addr=? terminal=/dev/pts/6 res=success'
    type=SYSCALL msg=audit(1491310299.535:34): arch=c000003e syscall=263 success=yes exit=0 a0=ffffff9c a1=21b0000 a2=0 a3=15e items=2 ppid=2441 pid=30087 auid=1000 uid=1000 gid=1000 euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=pts6 ses=2 comm="rm" exe="/bin/rm" key=(null)
    type=CWD msg=audit(1491310299.535:34): cwd="/home/me"
    type=PATH msg=audit(1491310299.535:34): item=0 name="/home/me" inode=23199747 dev=fd:00 mode=040755 ouid=1000 ogid=1000 rdev=00:00 nametype=PARENT
    type=PATH msg=audit(1491310299.535:34): item=1 name="zz" inode=23205547 dev=fd:00 mode=0100664 ouid=1000 ogid=1000 rdev=00:00 nametype=DELETE
    type=PROCTITLE msg=audit(1491310299.535:34): proctitle=726D007A7A
    type=USER_CMD msg=audit(1491310321.131:35): pid=30120 uid=1000 auid=1000 ses=2 msg='cwd="/home/me" cmd=636174202F7661722F6C6F672F61756469742F61756469742E6C6F67 terminal=pts/6 res=success'
    type=CRED_REFR msg=audit(1491310321.131:36): pid=30120 uid=0 auid=1000 ses=2 msg='op=PAM:setcred acct="root" exe="/usr/bin/sudo" hostname=? addr=? terminal=/dev/pts/6 res=success'
    type=USER_START msg=audit(1491310321.131:37): pid=30120 uid=0 auid=1000 ses=2 msg='op=PAM:session_open acct="root" exe="/usr/bin/sudo" hostname=? addr=? terminal=/dev/pts/6 res=success'

Eu usei o negrito para o evento de exclusão relevante, onde você pode ver facilmente o PPID, o PID e o usuário que executou a exclusão.

    
por 04.04.2017 / 15:06
0

Usar inotifywait como um trap de evento é um bom começo. No entanto, como você observou, não está dizendo a você quem / o quê, somente quando. Saber quando é uma ótima maneira de reduzir os culpados. Mas você precisa de mais informações.

Como solução rápida e (muito) suja, altere temporariamente as permissões de arquivo para o diretório de dados, de forma que apenas um usuário ou grupo específico possa modificar / excluir arquivos. Isso resultará em um despejo de mensagens de erro, pois os aplicativos (e talvez as pessoas) tentam tocar nos arquivos e receber um tapa. (Ressalva: qualquer coisa em execução como root irá ignorar isso, portanto, aqui está o meu conselho para executar aplicativos / tarefas de contas de serviço, NÃO raiz).

Essas mensagens de erro identificarão o (s) processo (s) tentando excluir os arquivos e, a partir daí, você poderá pesquisar qual script está iniciando o processo, pois todos os processos filhos contêm o processo pai, até o init / 0. Os scripts provavelmente serão uma instância do bash, mas seus pais serão crond (job cronometrado) ou um app.

Outro caminho possível é revisar suas tabelas cron para ver quais tarefas do cron são executadas imediatamente antes dos arquivos serem eliminados. (Se seus aplicativos executarem trabalhos sem serem transferidos para o crond, procure os cronogramas e logs de tarefas nos aplicativos.)

    
por 04.04.2017 / 00:10