Comment puis-je enregistrer les commandes bash des utilisateurs?


10

J'utilise un serveur debian etch où les utilisateurs se connecteront (espérons-le) à une prison chroot via ssh. Comment puis-je avoir les commandes qu'ils exécutent enregistrées d'une manière qu'ils ne peuvent pas supprimer ni empêcher?


Réponses:


11

installez snoopy . Si vous ne souhaitez enregistrer qu'un seul utilisateur, effectuez un filtrage syslog fu.


Je veux enregistrer chaque utilisateur.
Malfist

Ensuite, installez-le, cela "fonctionnera" (TM)
Cian

puis-je le configurer pour qu'il se connecte ailleurs que /var/log/auth.log?
Malfist

Il va dans syslog, vous pouvez donc le filtrer n'importe où, iirc. Je n'ai jamais rien fait avec syslog-ng, donc je n'ai aucune idée des filtres avec syslog normal, je le crains.
Cian

4

J'ai écrit une méthode pour enregistrer toutes les commandes / commandes intégrées de «bash» dans un fichier texte ou un serveur «syslog» sans utiliser de correctif ni d'outil exécutable spécial.

Il est très facile à déployer, car il s'agit d'un simple shellscript qui doit être appelé une fois lors de l'initialisation du 'bash'. (juste 'source' à partir de .bashrc par exemple) Il est basé sur l'idée d'utiliser des pièges bash DEBUG. Voir aussi ce post sur 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  

voir la méthode expliquée en détails ici: http://blog.pointsoftware.ch/index.php/howto-bash-audit-command-logger

cheers Francois Scheurer


2

Vous pouvez essayer ttyrpld . C'est plus que ce que vous voulez car il enregistrera tout le tty.
Je ne l'ai pas utilisé moi-même mais la façon dont il fonctionne (dans le noyau) fait que l'utilisateur ne peut pas modifier les journaux.


cool, je vais le vérifier. S'il joue bien avec tout, ce sera ce dont j'ai besoin. Je peux changer ses fichiers journaux pour les ajouter uniquement pour être sûr
Malfist

La réponse de Cian en utilisant snoopy semble être plus proche de ce que vous recherchez.
rayon


-1

Vous pouvez activer l'audit du système.


1
et comment on fait ça?
Rory

Commencez avec les pages de manuel pour auditd et continuez à partir de là. Il ne fait peut-être pas partie de l'installation de base de Debian, mais la fonction d'audit est un composant du noyau Linux, de sorte que les outils de l'espace utilisateur peuvent être installés et utilisés sur n'importe quelle distribution.
Geoff Fritz

-3

bash conserve un historique des commandes d'une taille spécifiée. L'administrateur peut définir cette taille et écrire facilement un script qui va récupérer cet historique par utilisateur via cron.


1
.bash_history est pour la commodité, pas pour la sécurité. Il y a un certain nombre de raisons à cela, la plus importante étant qu'elle est modifiable par l'utilisateur (ou du moins modifiable).
Matt
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.