Wie kann ich die Bash-Befehle von Benutzern protokollieren?

10

Ich verwende einen Debian-Ätzserver, auf dem sich Benutzer (hoffentlich) über ssh in ein Chroot-Gefängnis einloggen. Wie kann ich die von ihnen ausgeführten Befehle so protokollieren lassen, dass sie weder gelöscht noch verhindert werden können?

Malfist
quelle
siehe diese Frage serverfault.com/questions/8851/…
hayalci

Antworten:

11

installiere snoopy . Wenn Sie nur einen Benutzer protokollieren möchten, führen Sie eine Syslog-Filterung durch.

Cian
quelle
Ich möchte jeden Benutzer protokollieren.
Malfist
Dann installieren Sie es einfach, es wird "nur funktionieren" (TM)
Cian
Kann ich festlegen, dass es sich neben /var/log/auth.log befindet?
Malfist
Es geht zu Syslog, so dass Sie es von überall nach iirc filtern können. Ich habe bisher nur etwas mit Syslog-ng gemacht, daher habe ich leider keine Ahnung von Filtern mit normalem Syslog.
Cian
4

Ich habe eine Methode geschrieben, um alle 'bash'-Befehle / eingebauten' in eine Textdatei oder einen 'syslog'-Server zu protokollieren, ohne einen Patch oder ein spezielles ausführbares Tool zu verwenden.

Die Bereitstellung ist sehr einfach, da es sich um ein einfaches Shellscript handelt, das bei der Initialisierung der 'Bash' einmal aufgerufen werden muss. (nur 'Quelle' von .bashrc zum Beispiel) Es basiert auf der Idee, Bash-DEBUG-Traps zu verwenden. Siehe auch diesen 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  

Weitere Informationen finden Sie hier: http://blog.pointsoftware.ch/index.php/howto-bash-audit-command-logger

Prost Francois Scheurer

Francois Scheurer
quelle
2

Sie können ttyrpld versuchen . Es ist mehr als Sie wollen, weil es die ganze tty protokolliert.
Ich habe es selbst nicht verwendet, aber aufgrund der Funktionsweise (im Kernel) kann der Benutzer die Protokolle nicht ändern.

Radius
quelle
cool, ich werde es überprüfen. Wenn es mit allem gut spielt, ist es das, was ich brauche. Ich kann seine Protokolldateien in Anhängen ändern, nur um sicherzugehen
Malfist
Die Antwort von Cian mit snoopy scheint eher das zu sein, wonach Sie suchen.
Radius
0

Verwenden Sie einen mit grsecurity gepatchten Kernel. Genau für diesen Zweck gibt es eine Kernel-Option.

cstamas
quelle
-1

Sie können die Systemüberwachung aktivieren.

Geoff Fritz
quelle
1
und wie macht man das
Rory
Beginnen Sie mit den Manpages für auditd und gehen Sie von dort aus. Es ist möglicherweise nicht Teil der Debian-Basisinstallation, aber die Prüffunktion ist eine Linux-Kernelkomponente, sodass die Userland-Tools auf jeder Distribution installiert und verwendet werden können.
Geoff Fritz
-3

bash behält einen Befehlsverlauf einer bestimmten Größe bei. Sie als Administrator können diese Größe festlegen und einfach ein Skript schreiben, das diesen Verlauf pro Benutzer über cron abruft.

Rekursion
quelle
1
.bash_history dient der Bequemlichkeit und nicht der Sicherheit. Dafür gibt es eine Reihe von Gründen, nicht zuletzt, dass es vom Benutzer bearbeitet werden kann (oder zumindest anhängbar ist).
Matt