Come posso registrare i comandi bash degli utenti?


10

Sto eseguendo un server debian etch in cui gli utenti accederanno (si spera) a una prigione chroot tramite ssh. Come posso avere i comandi che eseguono registrati in un modo che non possono eliminare o impedire?


Risposte:


11

installa snoopy . Se si desidera registrare solo un utente, eseguire un po 'di filtro syslog.


Voglio registrare ogni utente.
Malfist,

Quindi installalo, "funzionerà" (TM)
Cian,

posso impostarlo per accedere da qualche parte oltre a /var/log/auth.log?
Malfist,

Va su syslog, quindi puoi filtrarlo ovunque, da lì, iirc. Ho sempre fatto qualcosa con syslog-ng, quindi non ho idea di filtri con syslog regolari, temo.
Cian,

4

Ho scritto un metodo per registrare tutti i comandi / builtin 'bash' in un file di testo o in un server 'syslog' senza usare una patch o uno strumento eseguibile speciale.

È molto facile da implementare, in quanto è un semplice shellscript che deve essere chiamato una volta durante l'inizializzazione di 'bash'. (solo 'sorgente' da .bashrc per esempio) Si basa sull'idea di usare trapp di DEBUG bash. Vedi anche questo post su superuser.com

declare -rx HISTCONTROL=""                                  #does not ignore spaces or duplicates
declare -rx HISTIGNORE=""                                   #does not ignore patterns
declare -rx AUDIT_LOGINUSER="$(who -mu | awk '{print $1}')"
declare -rx AUDIT_LOGINPID="$(who -mu | awk '{print $6}')"
declare -rx AUDIT_USER="$USER"                              #defined by pam during su/sudo
declare -rx AUDIT_PID="$$"
declare -rx AUDIT_TTY="$(who -mu | awk '{print $2}')"
declare -rx AUDIT_SSH="$([ -n "$SSH_CONNECTION" ] && echo "$SSH_CONNECTION" | awk '{print $1":"$2"->"$3":"$4}')"
declare -rx AUDIT_STR="[audit $AUDIT_LOGINUSER/$AUDIT_LOGINPID as $AUDIT_USER/$AUDIT_PID on $AUDIT_TTY/$AUDIT_SSH]"
set +o functrace                                            #disable trap DEBUG inherited in functions, command substitutions or subshells, normally the default setting already
shopt -s extglob                                            #enable extended pattern matching operators
function audit_DEBUG() {
  if [ "$BASH_COMMAND" != "$PROMPT_COMMAND" ]               #avoid logging unexecuted commands after 'ctrl-c or 'empty+enter'
  then
    local AUDIT_CMD="$(history 1)"                          #current history command
    if ! logger -p user.info -t "$AUDIT_STR $PWD" "${AUDIT_CMD##*( )?(+([0-9])[^0-9])*( )}"
    then
      echo error "$AUDIT_STR $PWD" "${AUDIT_CMD##*( )?(+([0-9])[^0-9])*( )}"
    fi
  fi
}
function audit_EXIT() {
  local AUDIT_STATUS="$?"
  logger -p user.info -t "$AUDIT_STR" "#=== bash session ended. ==="
  exit "$AUDIT_STATUS"
}
declare -fr +t audit_DEBUG
declare -fr +t audit_EXIT
logger -p user.info -t "$AUDIT_STR" "#=== New bash session started. ===" #audit the session openning
#when a bash command is executed it launches first the audit_DEBUG(),
#then the trap DEBUG is disabled to avoid a useless rerun of audit_DEBUG() during the execution of pipes-commands;
#at the end, when the prompt is displayed, re-enable the trap DEBUG
declare -rx PROMPT_COMMAND="trap 'audit_DEBUG; trap DEBUG' DEBUG"
declare -rx BASH_COMMAND                                    #current command executed by user or a trap
declare -rx SHELLOPT                                        #shell options, like functrace
trap audit_EXIT EXIT  

vedere il metodo spiegato in dettaglio qui: http://blog.pointsoftware.ch/index.php/howto-bash-audit-command-logger

saluti Francois Scheurer


2

Puoi provare ttyrpld . È più di quello che vuoi perché registrerà l'intero tty.
Non l'ho usato da solo, ma il modo in cui funziona (nel kernel) impedisce all'utente di modificare i log.


bene, lo controllerò. Se si gioca bene con tutto, sarà quello di cui ho bisogno. Posso modificare i suoi file di registro in append-solo solo per essere sicuro
Malfist,

La risposta di Cian con snoopy sembra essere più simile a ciò che stai cercando.
raggio

0

Utilizzare un kernel con patch grsecurity . Esiste un'opzione del kernel esattamente per questo scopo.


-1

È possibile abilitare il controllo del sistema.


1
e come si fa?
Rory,

Inizia con le pagine man per auditd e vai da lì. Potrebbe non far parte dell'installazione Debian di base, ma la funzione di controllo è un componente del kernel Linux, quindi gli strumenti per l'utente possono essere installati e utilizzati su qualsiasi distribuzione.
Geoff Fritz,

-3

bash mantiene una cronologia dei comandi di una dimensione specificata. L'amministratore può impostare tale dimensione e scrivere facilmente uno script che va e recupera la cronologia per utente tramite cron.


1
.bash_history è per comodità, non per sicurezza. Ci sono una serie di ragioni per questo, non ultimo il fatto che è modificabile dall'utente (o almeno appendibile).
Matt,
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.