Wie kann ich die Bash-Befehle von Benutzern protokollieren?

Wie kann ich die Bash-Befehle von Benutzern protokollieren?

Ich betreibe einen Debian-Etch-Server, auf dem sich Benutzer (hoffentlich) über SSH in ein Chroot-Jail einloggen. Wie kann ich die von ihnen ausgeführten Befehle so protokollieren lassen, dass sie sie weder löschen noch verhindern können?

Antwort1

InstallierenSchnüffler. Wenn Sie nur den einen Benutzer protokollieren möchten, führen Sie eine Syslog-Filterung durch.

Antwort2

Ich habe eine Methode geschrieben, um alle Bash-Befehle/Builtins in einer Textdatei oder auf einem Syslog-Server zu protokollieren, ohne einen Patch oder ein spezielles ausführbares Tool zu verwenden.

Es ist sehr einfach zu implementieren, da es sich um ein einfaches Shellscript handelt, das einmal bei der Initialisierung von „bash“ aufgerufen werden muss. (Zum Beispiel einfach „sourcen“ aus .bashrc.) Es basiert auf der Idee, Bash-DEBUG-Traps zu verwenden. Siehe auchdieser Beitrag auf 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  

Hier finden Sie eine detaillierte Erklärung der Methode: http://blog.pointsoftware.ch/index.php/howto-bash-audit-command-logger

Grüße Francois Scheurer

Antwort3

Sie können versuchenAbonnieren. Das ist mehr, als Sie wollen, weil das gesamte TTY protokolliert wird.
Ich habe es selbst nicht verwendet, aber die Art und Weise, wie es funktioniert (im Kernel), führt dazu, dass Benutzer die Protokolle nicht ändern können.

Antwort4

Sie könnten die Systemüberwachung aktivieren.

verwandte Informationen