web-dev-qa-db-fra.com

Comment capturer toutes les commandes tapées sous Unix/Linux par n'importe quel utilisateur?

Je voudrais capturer toutes les commandes tapées sous Unix/Linux par n'importe quel utilisateur. Il existe peu d'alternatives, comme utiliser une commande de script ou un utilitaire acct. Mais le problème avec eux est qu'ils bêtise tout du terminal à un fichier ou fournissent simplement le résumé des commandes. Je cherche un utilitaire où il me fournira toutes les commandes tapées par n'importe quel utilisateur avec les arguments des commandes. C'est possible? Existe-t-il des solutions de rechange, telles que l’interconnexion des appels système pour l’obtenir?

6
vinayag

Il semble y avoir un très bon article sur l’audit Shell à http://administratosphere.wordpress.com/2011/05/20/logging-every-Shell-command/ .

Cela prend en compte des éléments tels que la fiabilité des fichiers d’historique des utilisateurs (et fournit des informations pour l’améliorer), mais aborde également les fonctionnalités d’audit explicites intégrées aux shells. Peut-être que quel que soit l'environnement que vous utilisez, les shell ne sont pas compilés avec les fonctionnalités d'audit activées, mais si vous avez le code source et la configuration de vos versions disponibles (comme vous le feriez au moins pour toute distribution Linux), il ne devrait pas y en avoir. t être trop difficile à activer la fonction d’audit tout en gardant le reste de la configuration comme dans la distribution par défaut.

Ce que cette approche laisserait encore ouverte, ce sont les commandes exécutées via une autre commande - ou une fonctionnalité du système d'exploitation appelée à partir d'un programme. Donc, f.ex. Si vous avez Perl, ou tout autre interpréteur de langage de programmation disponible sur la machine, alors que vous pouvez éventuellement contrôler l'exécution de Perl, vous ne pouvez pas dire ce que l'utilisateur avait demandé à l'interpréteur Perl de faire. D'un autre côté, même avec l'audit Shell, je ne suis pas sûr que l'exécution de Perl soit visible si elle était exécutée f.ex. depuis un éditeur (comme vi) en tant que filtre pour traiter tout ce qui avait été écrit dans l’éditeur.

Ainsi, bien que l’audit Shell vous fournisse une couche d’audit, le gain n’est pas si important à moins que votre environnement ne soit vraiment restreint par rapport à d’autres chemins d’exécution que le Shell.

Vous devez déterminer si les utilisateurs à auditer ont réellement besoin d'un accès Shell. Dans le cas contraire, fournissez-leur quelque chose de plus limité, avec des fonctionnalités d'audit. Un petit système de menu à base de texte, peut-être?

4
Juha Laiho

Je sais que c'est vieux, mais je pense que la commande de script pourrait être ce qu'il cherchait?

> script my_output_file
Script started, file is my_output_file

http://www-users.cs.umn.edu/~gini/1901-07s/files/script.html

7
TimeTrap

Vous pouvez utiliser Snoopy Logger

Ce que c'est: Une bibliothèque simple qui s'insère entre syscalls process et execv/e () au moyen du préchargement LD. Il enregistre toutes les commandes exécutées dans syslog.

Ce que ce n’est pas: [ Solution de sécurité/d’audit - il peut être facilement contourné. Il ne consigne pas les commandes Shell intégrées Shell ne crée pas de nouveau processus - echo vs/bin/echo par exemple).

Divulgation: mainteneur actuel de Snoopy ici.

2
Bostjan Skufca

Il est possible de faire ce que vous voulez dans les audits, les enregistrements de tty, les hacks et les outils gratuits, mais en fonction de l’ampleur de l’environnement que vous essayez de contrôler, vous pourrez peut-être mieux utiliser Audit et des produits conçus pour relever le défi. vous voulez vous attaquer. [ Observe-IT , Centrify et PowerBroker

J'espère que cela t'aides

1
Andre de Miranda

Prenez la source bash. Ajoutez un enregistreur autour de l'invocation de l'exécutif. Compilez-le. Exécutez-le en tant que première commande après vous être connecté.

Tout le reste veut vraiment des pouvoirs de racine.

1
Sean Perry

Pour les enregistrements sporadiques, je cours habituellement

ssh localhost | tee -a registered-session.log

Cela fonctionne assez bien.

1
luke

Saisissez /home/victim/.bash_history ou /home/victim/.config/fish/fish_history

Cela vous permettra de voir toutes les commandes bash et fish de Shell avec les arguments entrés par l'utilisateur.

0
Md. Minhazul Haque

Le moyen le plus simple de résoudre ce problème est si vous êtes root et en mesure de modifier les fichiers système en redirigeant la console elle-même de cette façon:

Si vous utilisez par exemple /bin/sh en tant que console par défaut, déplacez-le vers /bin/hs et créez un fichier comme celui-ci sous /bin/sh:

#!/bin/hs

ORIGSHELL=/bin/hs
LOGFILE=/var/log/whatyoulike

OPTIONS="$@"

USER=`whoami`
WEBUSER=web
WILD=NO
WARN=NO



if [ "$USER" = "$WEBUSER" ]
then

  #Ok then - are we doing something wild?
  for ARG in $@
  do
    case "$ARG" in
    *\/lynx)
      WILD=YES
      ;;
    *\/wget)
      WILD=YES
      WARN=YES
      ;;
    *\/curl)
      WILD=YES
      WARN=YES
      ;;
    *\/links)
      WILD=YES
      WARN=YES
      ;;
    *\/fetch)
      WILD=YES
      WARN=YES
      ;;
    esac
  done

  #Are we wild?
  if [ "$WILD" = "YES" ]
  then
    Host=`hostname`
    IPADDR=`resolveip -s $Host`
    NETSTAT=`/usr/bin/nighthawk -ape --numeric-hosts --numeric-ports --tcp | grep 'ESTABLISHED web'`

    # Log it.
    echo "`date` [$USER] $IPADDR "$@"" >> $LOGFILE
    echo "$NETSTAT" >> $LOGFILE
  fi
  #Are we REALLY wild?
  if [ "$WARN" = "YES" ]
  then
    # Mail it!
    mail -s 'HACKATTACK' [email protected] < $LOGFILE &
  fi
fi

# Now, do it.
exec $OPERATION "$@"

#we never come here...
exit 0

Ceci est juste un exemple, comment il peut être utilisé pour suivre tout ce qui est transparent. Vous pouvez faire ce que vous voulez vérifier l’entrée. Le script ci-dessus est utilisé pour rechercher même l’auteur du shell actuel, afin que vous puissiez y réagir. Bien sûr, les vérifications de cas précédentes sont pas ceux que nous utilisons vraiment;) - mais un bon échantillon.

J'espère que ça aide, Jimmy

0
Jimmy Koerting