Esiste un modo semplice per registrare tutti i comandi eseguiti, inclusi gli argomenti della riga di comando?


11

Sto cercando di trovare come registrare un'istanza specifica di rrdtoolper vedere se il percorso che sta ricevendo non è corretto.

So che avrei potuto avvolgere il file eseguibile in uno script shell che avrebbe registrato i parametri, ma mi chiedevo se ci fosse un modo più specifico per il kernel di monitorarlo, forse un callback del filesystem che vede quando un particolare / proc / pid / exe corrisponde a un determinato binario?


C'è un modo per auditdregistrare gli argomenti della riga di comando e il programma eseguito? serverfault.com/questions/765179/…
Neil

Risposte:


16

Sì, esiste una funzione del kernel: il sottosistema di controllo. Il auditddemone esegue la registrazione e il comando auditctlimposta le regole di registrazione. È possibile registrare tutte le chiamate a un sistema specifico tutte, con alcuni filtri. Se si desidera registrare tutti i comandi eseguiti e i relativi argomenti, registrare la execvechiamata di sistema:

auditctl -a exit,always -S execve

Per tracciare in modo specifico l'invocazione di un programma specifico, aggiungere un filtro sull'eseguibile del programma:

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

I registri vengono visualizzati in /var/log/audit.log, o ovunque la tua distribuzione li inserisca. Devi essere root per controllare il sottosistema di controllo.

Al termine dell'indagine, utilizzare la stessa riga di comando con -dinvece di -aeliminare una regola di registrazione oppure eseguire auditctl -Dper eliminare tutte le regole di controllo.

Ai fini del debug, la sostituzione del programma con uno script wrapper offre una maggiore flessibilità per registrare cose come l'ambiente, informazioni sul processo padre, ecc.


Perché il -F path=/ust/bin/rrdtool? Non capisco come rrdtoolsia nemmeno il software correlato.
Graeme,

@Graeme Il problema descritto nella domanda era il monitoraggio di un'invocazione di rrdtool. Se vuoi registrare le invocazioni di tutti i programmi, elimina la -F path=…parte (otterrai ovviamente molti registri).
Gilles 'SO- smetti di essere malvagio' il

Giusto ... prima riga della domanda. Grazie.
Graeme,

Tutto questo è ottimo, ma come posso ripristinare la configurazione allo stato iniziale? Altrimenti continuerà a riempire il registro con nuovi e nuovi comandi lanciati ... o questo auditctlcomando è efficace solo fino al riavvio?
Ruslan,

@Ruslan L'effetto di auditctlsopravvive solo fino al riavvio, ma questo è comunque un buon punto, ho aggiunto le istruzioni per rimuoverle senza riavviare la mia risposta.
Gilles 'SO- smetti di essere malvagio'

6

Potresti usare snoopy .

Snoopy è una soluzione più leggera in quanto non necessita della collaborazione del kernel. Tutto ciò che serve è il caricatore dinamico (dl) che precarica la libreria snoopy, il percorso nel quale è specificato /etc/ld.so.preload.

Divulgazione: sono l'attuale manutentore di snoopy.


È possibile effettuare la registrazione per i comandi generati direttamente o indirettamente da una particolare shell?
camper,

Non sono sicuro di aver capito la tua domanda - intendi "shell" come programma specifico che viene utilizzato come shell (bash, dash, zsh ecc.) O intendi che desideri registrare solo PTY specifici? Snoopy fornisce un framework di filtraggio, ma attualmente sono implementati solo un paio di filtri di base, vedi qui per l'elenco: link . Se hai un caso d'uso concreto che potrebbe essere applicabile ad altri, ti preghiamo di spiegarlo nella richiesta di funzionalità e, oh, a proposito, le patch sono benvenute :)
Bostjan Skufca

Intendevo solo un PTY specifico.
camper,

Non esiste un filtro specifico per ATM ATM disponibile. Tuttavia, è possibile utilizzare snoopy per registrare tutto, incluso il PTY in cui si è verificato l'evento, quindi eseguire il filtro nel demone syslog. Non so quale si stia utilizzando, ma syslog-ng (ad esempio) può fare corrispondenze regex, positive o negative.
Bostjan Skufca,

Certo, grazie! Lo strumento e l'approccio sono generalmente abbastanza utili. Posso facilmente fare un po 'di filtraggio per ottenere ciò di cui ho bisogno.
camper,

2

Il sottosistema "audit" del kernel Linux può fare ciò di cui hai bisogno.

ad esempio se si eseguono questi comandi:

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

Quindi viene registrato ogni evento di esecuzione e vengono fornite molte informazioni al riguardo

ad esempio questo è l'output di me che corro 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

Ci sono alcuni valori interessanti che possono essere visti; ad esempio "auid" è 500, che è il mio ID di accesso, anche se "uid" è zero (perché sto correndo sotto su). Pertanto, anche se l'utente può aver cambiato account suo sudoè ancora possibile risalire al proprio "ID di controllo"

Ora quei auditctlcomandi andranno persi al riavvio. Puoi inserirli in un file di configurazione (ad es. Nella /etc/audit/rules.d/directory, su CentOS 7). La posizione esatta dipenderà dalla versione del tuo sistema operativo. La auditctlpagina di manuale dovrebbe aiutare qui.

Attenzione, però ... questo causerà la generazione di molti messaggi di registro. Assicurati di avere abbastanza spazio sul disco!

Se necessario, le regole possono essere limitate a un utente specifico o a un comando specifico.

E anche attenzione; se un utente inserisce la password nell'esecuzione del comando (ad es. mysql --user=username --password=passwd), questo verrà registrato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.