Alguém sabe uma maneira simples de monitorar o spawn do processo de raiz

12

Eu quero executar um script quando um novo processo raiz é gerado. (no Linux) Como posso simplesmente fazer isso?

Obrigado

    
por cerisier 09.11.2010 / 01:53

3 respostas

7

Isso soa como um trabalho perfeito para o auditd. Depois de ter auditado em execução, um serviço padrão em modernos sistemas baseados em RedHat, você pode criar uma regra que faça exatamente o que você quer executando

auditctl -a task,always -F uid=0

Quebrando essa regra de comando, fazendo uso excessivo da man page, descobrimos que:

   -a list,action
          task       Add  a  rule to the per task list. This rule list is used
                     only at the time a task is created -- when fork() or
                     clone() are called by the parent task. When using this
                     list, you should only use fields that are known at task
                     creation time, such as the uid, gid, etc.
          always     Allocate an audit context, always fill it in at syscall 
                     entry time, and always write out a record at syscall exit
                     time.

Portanto, sempre escreva um registro para essa ação sempre que uma chamada de sistema bifurcado ou clone sair.

A opção final pode ser considerada como uma string de filtro, em nosso uso -F uid=0 simplesmente nos restringe a casos em que o uid do proprietário do processo é 0.

Observe que essa regra pode ser executada em tempo de execução, certificando-se de que o auditd esteja configurado corretamente e de adicionar a regra
-a task,always -F uid=0
no arquivo relevante para sua distribuição, provavelmente /etc/audit/audit.rules

Tenha em mente que isso vai ser muito barulhento e quem quer que esteja fazendo suas análises de registros precisará estar preparado para isso.

    
por 02.02.2011 / 17:34
2

Eu não acho que haja uma maneira limpa de fazer isso sem recompilar seu kernel com CONFIG_PROC_EVENTS e / ou CONFIG_KPROBES (embora eu adoraria saber se existe uma maneira de fazer isso, então eu fiz a sua pergunta) .

Eu tive uma idéia de usar o iwatch / inotify para criação de diretório dentro de / proc, mas não parecia funcionar, nem o auditctl. Parece que sua melhor escolha, apesar de suja, é continuamente analisar ps para uma mudança de um script. O seguinte código Perl faria isso, embora fosse propenso a perder alguns e ignora ps (como seria desencadear a si mesmo):

perl -e 'my %pids; while(1) { my @pids = 'ps -U root -u root'; foreach (@pids) { next if /ps$/; ($pid) = /^\s*(\d+)\D/; if (!$pids{$pid}) { $pids{$pid}++; print "Process $pid created (" . 'cat /proc/$pid/cmdline' . ")\n"; } } }
    
por 09.11.2010 / 02:59
1

A melhor maneira que posso pensar seria construir a biblioteca snoopy . O snoopy é uma biblioteca compartilhada muito pequena que fica conectada a /etc/ld.so.preload e envolve% de chamadas do sistema execve() . É configurável para registrar todos os exec() , ou apenas aqueles do root. Em sua atual encarnação, o snoopy registra no syslog toda vez que um evento correspondente (um syscall para execve() ) acontece. Não é um programa grande (algumas centenas de linhas de código, no máximo) e pode ser modificado sem muita dificuldade para executar um script em vez de (ou além de) registrar a atividade. Snoopy está escrito em C.

Algumas coisas a serem observadas:

  • Se você executar um script toda vez que um processo raiz for gerado, seu script será um processo raiz, que precisará gerar o script novamente, que será outro processo raiz, etc. Tenha cuidado para não obter em um loop lá.
  • Em uma caixa típica do Linux, há muitos processos que são executados como root e gerados regularmente. Por exemplo, o cron pode gerar cronjobs do sistema como root a cada minuto ou alguns minutos. Se você estiver apenas procurando que isso aconteça quando um usuário fizer login como root, será mais trabalhoso.
por 10.11.2010 / 21:55