Come registrare tutti i comandi Bash di tutti gli utenti su un server?


21

La nostra piccola azienda gestisce un Ubuntu Server 11.10, a cui un paio di persone hanno accesso a SSH. A volte vengono utilizzati anche i terminali reali. Come possiamo registrare localmente tutti i comandi di Bash eseguiti, insieme all'utente e al timestamp?

Possiamo presumere che nessuno sia nefasto e cerchi attivamente di evitare la registrazione, ma preferiremmo comunque che gli utenti non avessero accesso diretto in scrittura ai loro file di registro. Le sessioni simultanee devono essere gestite correttamente.

Risposte:


32

Per le shell BASH, modifica il file di configurazione del runtime BASH a livello di sistema:

sudo -e /etc/bash.bashrc

Aggiungi alla fine di quel file:

export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'

Configurare la registrazione per "local6" con un nuovo file:

sudo -e /etc/rsyslog.d/bash.conf

E i contenuti ...

local6.*    /var/log/commands.log

Riavvia rsyslog:

sudo service rsyslog restart

Disconnettersi. Accedi. Voila!

Ma ho dimenticato la rotazione del registro:

sudo -e /etc/logrotate.d/rsyslog

C'è un elenco di file di registro da ruotare nello stesso modo ...

/var/log/mail.warn
/var/log/mail.err
[...]
/var/log/message

Quindi aggiungi il nuovo file di registro dei comandi bash in quell'elenco:

/var/log/commands.log

Salvare.


Ho dimenticato la rotazione del registro che ho aggiunto alla risposta.

1
Funziona in questo modo, ma potrei inventare un metodo attorno ad esso (forse con csh, .bash_logout). Andrei con la soluzione acct di Sabacon. Queste erano letture eccellenti: linuxjournal.com/article/6144 e beginlinux.com/blog/2010/01/…

2
Credo che questo possa essere facilmente disattivato dall'utente semplicemente reimpostando o disinserendo PROMPT_COMMANDo eseguendo una shell non bash.
Stefan Lasiewski,

1
@Benubird sembra che ci siano alcuni livelli di strutture preimpostate, 8 delle quali sono local0-local7: en.wikipedia.org/wiki/Syslog . 0 significa emergenza, 7 significa debug e 6 è solo timido di 7, "normali messaggi operativi".
munchybunch

1
@yukashima perché i registri possono diventare file di grandi dimensioni se non eliminati, ruotare significa ruotare i file di registro ed eliminare quelli più vecchi per mantenere i registri più piccoli ...
Badr Elmers

4

Un sistema di contabilità di processo può essere utile a questo proposito, in particolare l' acc pacchetto che fornisce i comandi lastcomm e ac.

I comandi ac stampano le statistiche sul tempo di connessione degli utenti, in ore. Questo è il periodo di tempo in cui l'utente è stato collegato al sistema, in remoto tramite SSH o un terminale seriale, o mentre si trova sulla console.

Il comando lastcomm visualizza informazioni sui comandi eseguiti in precedenza. Le voci più recenti sono riportate in cima all'elenco. Viene inoltre visualizzato il tempo totale della CPU utilizzato da ciascun processo.

Un vecchio tutorial che può essere utile è qui:

http://www.linuxjournal.com/article/6144?page=0,1

In questo tutorial è possibile trovare altri comandi di contabilità come l'ultimo e così via:

http://www.techrepublic.com/article/system-accounting-in-linux/1053377


lastcomm è abbastanza inutile come registratore di comandi. Registra solo l'eseguibile che è stato eseguito. Nessun argomento, switch o percorso sono registrati.
Phil_1984_

3

Puoi usare snoopy .

Il logger Snoopy può adattarsi bene al tuo scopo. Non intende essere una soluzione di registrazione inevitabile, ma piuttosto uno strumento utile per gli amministratori diligenti che preferiscono tenere traccia delle proprie azioni.

Divulgazione: sono manutentore snoopy.


Fornire istruzioni sull'installazione e sull'utilizzo nella risposta.
muru,

1
Istruzioni dettagliate per l'installazione sono disponibili nella pagina snoopy di github, che è la principale risorsa snoopy in questo momento: github.com/a2o/snoopy . Sto ancora fornendo istruzioni di installazione in altri luoghi, poiché la posizione primaria è gestita dal design e altri no. Il readme di BTW è stato appena aggiornato per essere più strutturato.
Bostjan Skufca,

1
Può darsi. Ma senza nemmeno un riepilogo dei passaggi necessari per utilizzare questo, questa è una risposta solo link e probabilmente sarà eliminata.
Muru,

1
Bene, ho fornito un puntatore a una soluzione alternativa e praticabile. Se questo non è ciò di cui tratta questo sito, allora dovrebbe essere eliminato, insieme al mio account.
Bostjan Skufca,

2
@BostjanSkufca non ha bisogno di essere offeso. È solo una cosa di scambio di stack avere almeno risposte ragionevolmente indipendenti. Se sei così fortemente contrario all'aggiunta di passaggi, questo è il tuo desiderio. Il mio downvote rimane. Qualcuno probabilmente lo voterà.
muru,

3

Puoi trovare qui uno script per registrare tutti i comandi / incorporati bash in un file di testo o in un syslog server senza usare una patch o uno speciale strumento eseguibile.

Molto facile da distribuire, in quanto è un semplice script di shell che deve essere chiamato una volta all'inizializzazione di bash .

È gratuito e spero che soddisfi le tue esigenze.


1
Questa è una buona risposta, ma è preferibile includere i passaggi e lo script nel corpo della risposta, anziché collegarli al tuo blog. Puoi per favore modificare la tua risposta per includerla?
Tom Brossman,

2
Sito ora non disponibile
Gaia

0

Per occuparti di più sessioni senza sovrascrivere il file della cronologia, dovrai inserire "shopt -s histappend" in un file di avvio di Bash. Vedi, anche questa domanda sullo stesso problema.


0

prova questo (le soluzioni sopra non funzioneranno al 100% con bash 4.3):

export HISTTIMEFORMAT="%Y-%m-%d %T "
export PROMPT_COMMAND='trap "" 1 2 15; history -a >(tee -a ~/.bash_history | while read line; do if [[ $line =~ ^#[0-9]*$ ]]; then continue; fi; logger -p user.info -t "bash[$$]" "($USER) $line"; done); trap 1 2 15;'

questo fa la registrazione E impedisce la registrazione di timestamp usati per il file della cronologia di bash. la trappola è necessaria, poiché bash invierà i segnali al "subjob" dopo aver premuto più volte strg + c (testato con bash 4.3). questo forzerà la disconnessione dell'utente corrente (es. accesso con sudo)


0

Puoi anche provare a installare acct. Acct mantiene una traccia di controllo dettagliata di ciò che viene fatto sui tuoi sistemi Linux.

sudo apt-get install acct
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.