Como posso rastrear executáveis criados pelo meu usuário no Linux?

11

Usando o Linux, eu gostaria de rastrear os executáveis que são executados em meu nome, incluindo toda a linha de comando (na prática, todo exec * () feito como meu próprio usuário). Um programa que eu não controle é suposto, a fim de lidar com uma tarefa, para executar o programa que eu passo, mas eu quero ter certeza de fazê-lo, e quais opções ele usa. O programa que eu não controlo é sorrateiro, e parece mudar de comportamento dependendo do nome do programa que ele deve executar para a tarefa, então eu não posso passar em um script de shell que registraria a informação e invocaria o real. programa.

É possível que eu seja informado de todos os exec * () feitos como meu usuário no sistema no Linux, incluindo a linha de comando completa? Curta a execução de ps em um loop, ou seja. Eu prefiro fazê-lo diretamente no sistema em que trabalho e não requer acesso root, mas, se necessário, posso gerar um sistema no qual tenho acesso root, instalar os programas e investigar lá.

Usando o Ubuntu 12.4 LTS.

    
por Pierre Lebeaupin 11.12.2013 / 20:55

2 respostas

10

Você precisa configurar auditd para registrar execve events. Exemplo no RHEL5:

[root@ditirlns01 ~]# auditctl -a always,entry -S execve
WARNING - 32/64 bit syscall mismatch, you should specify an arch
[root@ditirlns01 ~]#

Ignoro o aviso de arco e isso não parece importar, mas você pode usar -F arch=b64 ou -F arch=b32 para defini-lo, se desejar.

O resultado do acima é:

[root@ditirlns01 ~]# ls /tmp/whatever
ls: /tmp/whatever: No such file or directory
[root@ditirlns01 ~]# grep whatever /var/log/audit/audit.log
type=EXECVE msg=audit(1386797915.232:5527206): argc=3 a0="ls" a1="--color=tty" a2="/tmp/whatever"
type=EXECVE msg=audit(1386797927.133:5527241): argc=3 a0="grep" a1="whatever" a2="/var/log/audit/audit.log"
[root@ditirlns01 ~]#

Isso é obviamente rápido e sujo, mas isso é o básico de como você faz isso. O que você precisa fazer, provavelmente, depende muito do que você está tentando fazer exatamente. Você pode reduzir o fluxo de auditoria usando vários filtros no comando auditctl , mas não conheço nenhuma dessas informações, portanto, não sei o que incluir. Se você precisar de algo mais específico, sugiro que você verifique a man page ou publique um comentário para essa resposta e atualizarei mais algumas vezes.

Espero que isso o ajude na direção certa.

EDITAR:

Como sua pergunta envolve consultar um usuário específico, posso mostrar a você que:

[root@ditirlns01 ~]# auditctl -a always,entry -S execve -F euid=16777216
WARNING - 32/64 bit syscall mismatch, you should specify an arch

Idêntico ao acima, mas somente execve de alguém executando com o ID de usuário efetivo de 16777216 será logado. Se você precisar especificar o valor loginuid do usuário (com quem eles inicialmente fizeram login no sistema), filtre por auid :

[root@ditirlns01 ~]# auditctl -a always,entry -S execve -F auid=16777216
WARNING - 32/64 bit syscall mismatch, you should specify an arch

Os filtros AUID / loginuid seriam úteis, por exemplo, se o usuário fizesse uma su ou sudo para raiz. Nessa situação, haverá muitas coisas sendo executadas como root, mas você está preocupado apenas com as coisas que foram iniciadas pelo usuário em questão. auditctl também permite empilhar os filtros, para que você possa filtrar por euid e auid :

[root@ditirlns01 ~]# auditctl -a always,entry -S execve -F auid=16777216 -F euid=0
WARNING - 32/64 bit syscall mismatch, you should specify an arch
[root@ditirlns01 ~]# ls /tmp/nashly -ltar
ls: /tmp/nashly: No such file or directory
[root@ditirlns01 ~]# grep nashly /var/log/audit/audit.log
type=EXECVE msg=audit(1386798635.199:5529285): argc=4 a0="ls" a1="--color=tty" a2="/tmp/nashly" a3="-ltar"
type=EXECVE msg=audit(1386798646.048:5529286): argc=3 a0="grep" a1="nashly" a2="/var/log/audit/audit.log"
    
por 11.12.2013 / 22:40
0

Você fez uma pergunta simples. Eu fiz um exemplo com mplayer , mas acho que pode ser adaptado para outras situações:

#! /bin/sh
# This executable must be used instead of /usr/bin/mplayer
# do not forget the chmod +x filename...
LOG=/tmp/mplayer.log
echo "$@" >> $LOG
if [ -n "$1" ] && [ -f "$1" ] ; then
        filename="$1"
        echo "$(date "+%F %T") $(basename "$filename")" \
        | tee -a "$(dirname "$filename")/mplayer.log"  >> $LOG
fi
/usr/bin/mplayer "$@"

Como você pode ver, isso é muito simples: Analisa o primeiro argumento, como é um arquivo, um log é feito no arquivo central $LOG e concatenado em um arquivo (que sempre tem o mesmo nome mplayer.log no mesmo diretório.

Assim, o usuário pode receber o último filme que leu em cada diretório.

    
por 04.02.2017 / 22:59