Existe uma maneira fácil de registrar todos os comandos executados, incluindo argumentos de linha de comando?

8

Estou tentando descobrir como registrar uma instanciação específica de rrdtool para ver se o caminho que está recebendo está incorreto.

Eu sei que eu poderia quebrar o executável em um shell script que registraria os parâmetros, mas eu queria saber se havia uma maneira mais específica do kernel de monitorar isso, talvez um callback do sistema de arquivos que vê quando um / proc / específico pid / exe corresponde a um dado binário?

    
por Peter Grace 30.07.2013 / 00:21

3 respostas

11

Sim, existe um recurso de kernel: o subsistema de auditoria. O daemon auditd faz o registro, e o comando auditctl configura as regras de registro. Você pode registrar todas as chamadas para um sistema específico alls, com alguma filtragem. Se você quiser registrar todos os comandos executados e seus argumentos, registre a chamada do sistema execve :

auditctl -a exit,always -S execve

Para rastrear especificamente a invocação de um programa específico, adicione um filtro ao executável do programa:

auditctl -a exit,always -S execve -F path=/usr/bin/rrdtool

Os registros são exibidos em /var/log/audit.log ou onde quer que sua distribuição os coloque. Você precisa ser root para controlar o subsistema de auditoria.

Para fins de depuração, substituir o programa por um script de wrapper oferece mais flexibilidade para registrar coisas como o ambiente, informações sobre o processo pai, etc.

    
por 30.07.2013 / 02:18
4

Você pode usar snoopy .

O Snoopy é uma solução mais leve, pois não precisa da cooperação do kernel. Tudo o que é necessário é o carregador dinâmico (dl) que pré-carrega a biblioteca snoopy, caminho para o qual é especificado em /etc/ld.so.preload .

Divulgação: sou o mantenedor atual do snoopy.

    
por 05.11.2014 / 23:34
0

O subsistema de "auditoria" do kernel do Linux pode fazer o que você precisa.

por exemplo. se você executar estes comandos:

auditctl -a exit,always -F arch=b64 -S execve
auditctl -a exit,always -F arch=b32 -S execve

Em seguida, cada evento de execução é registrado e um lote de informações é fornecido em torno desse

por exemplo. esta é a saída de mim executando tail /var/log/audit/audit.log

exit=0 a0=7f0e4a21e987 a1=7f0e4a21e6b0 a2=7f0e4a21e808 a3=8 items=2 ppid=906 pid=928 auid=500 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="tail" exe="/usr/bin/tail" subj=kernel key=(null)
type=EXECVE msg=audit(1543671660.203:64): argc=2 a0="tail" a1="/var/log/audit/audit.log"
type=CWD msg=audit(1543671660.203:64):  cwd="/home/sweh"
type=PATH msg=audit(1543671660.203:64): item=0 name="/usr/bin/tail" inode=266003 dev=fd:03 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=unlabeled objtype=NORMAL cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
type=PATH msg=audit(1543671660.203:64): item=1 name="/lib64/ld-linux-x86-64.so.2" inode=273793 dev=fd:03 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=unlabeled objtype=NORMAL cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
type=PROCTITLE msg=audit(1543671660.203:64): proctitle=7461696C002F7661722F6C6F672F61756469742F61756469742E6C6F67

Existem alguns valores interessantes que podem ser vistos; por exemplo. "auid" é 500, que é meu ID de login, mesmo que "uid" seja zero (porque estou executando em su ). Assim, mesmo que o usuário possa ter alternado as contas com su ou sudo , ainda poderemos rastrear seu "ID de auditoria"

Agora, os comandos auditctl serão perdidos em uma reinicialização. Você pode colocá-los em um arquivo de configuração (por exemplo, no diretório /etc/audit/rules.d/ , no CentOS 7). A localização exata dependerá da sua versão do sistema operacional. A página de manual auditctl deve ajudar aqui.

Cuidado, porém ... isso fará com que um lote de mensagens de log seja gerado. Certifique-se de ter espaço suficiente no disco!

Se necessário, as regras podem ser limitadas a um usuário específico ou a um comando específico.

E também cuidado; Se um usuário colocar a senha na execução do comando (por exemplo, mysql --user=username --password=passwd ), isso será registrado.

    
por 01.12.2018 / 14:50