Comment ajouter des données de connexion de réseau ou de source utilisateur aux entrées d'historique?

8

Je souhaite modifier les paramètres d'historique de tous les utilisateurs des systèmes que je gère. Je voudrais qu'il contienne les informations du terminal de connexion comme dewho

sysadmin:/ # who
sysadmin  pts/0        Mar 26 07:11 (sysadmin.doofus.local)

Je modifie actuellement mon historique des manières suivantes. Je sais que bon nombre de ces paramètres ont été abordés ici plusieurs fois. Cependant, j'ai tiré ce code de " Linux System Administration Recipes by: Juliet Kemp " il y a longtemps.

shopt -s histappend
PROMPT_COMMAND='history -n;history -a'
HISTSIZE=100000
HISTFILESIZE=100000
HISTTIMEFORMAT="%m/%d/%y %T  "

shopt -s histappend résout le problème lorsque vous avez plusieurs terminaux, des informations ouvertes peuvent être perdues.

PROMPT_COMMAND='history -n;history -a' s'étend pour donner un ajout en temps réel à l'historique sur plusieurs terminaux.

HISTSIZE=100000 HISTFILESIZE=100000 augmente la quantité de historyrétention

HISTTIMEFORMAT="%m/%d/%y %T "fait précéder chaque ligne de l'histoire d'un horodatage

Ce que vous obtenez généralement history

835  ls
836  cd ..

Mes historyrésultats actuels modifiés

5853  03/26/12 07:16:49  ls
5854  03/26/12 07:16:50  ll

Le retour de historyje voudrais voir

5853  03/26/12 07:16:49  sysadmin.doofus.local    ls
5854  03/26/12 07:16:50  sysadmin.doofus.local    ll

001  03/26/12 05:11:29  demo_user.doofus.local    cd
002  03/26/12 05:11:30  demo_user.doofus.local    ll

Je ne suis pas "marié" à voir le DNSnom. Je ne le voudrais là que s'il le tire de whoou d'un autre emplacement sans avoir besoin d'effectuer une recherche ou une requête de quelque nature que ce soit. Je serais content de l'adresse IP.

002  03/26/12 05:11:30  192.168.0.2    ll

Pourquoi? Je gère plusieurs systèmes où un ID utilisateur que plusieurs utilisateurs d'un même groupe partagent pour effectuer leurs tâches quotidiennes. Cela me permettrait de corréler leur emplacement réel et leur utilisateur réel au sein de l'organisation avec ce qu'ils ont fait dans l'histoire.

Je suis conscient que ce n'est pas optimal et je voudrais le changer mais, lorsque vous êtes sur un navire de la taille d'un paquebot de croisière, vous n'essayez pas de faire des virages en épingle à cheveux. (Remarque: lorsque vous faites cela, les passagers essaient de vous jeter par-dessus bord)

Quoi qu'il en soit, jusqu'à ce que je puisse les migrer vers une meilleure solution, j'aimerais avoir cette capacité de suivi.

De plus, si vous avez des recommandations sur ce que j'utilise actuellement pour mes historymodifications, j'aimerais l'entendre.

Merci,

Modifier: 1

Je ne veux pas exécuter d'autres programmes ou avoir à configurer quoi que ce soit supplémentaire "dans des limites raisonnables".

Je veux ajouter des 0frais généraux, si je dois ajouter, il doit être petit.

Je fais confiance à mes utilisateurs, je voudrais juste (si quelque chose devait arriver) voir lequel des 10 utilisateurs qui se sont connectés au système avec le même utilisateur: mot de passe l'a fait. Ou bien, il pourrait ne pas s'agir d'un utilisateur, il aurait pu être oublié cronsur un système qui effectue une connexion en tant qu'utilisateur pour faire quelque chose. Ou une application Ex: BMC Control-Mqui se connecte sshet exécute des tâches. Il ne s'agit pas tant de trouver de «mauvais utilisateurs» que de pouvoir le retrouver avec un minimum d'effort.

Modifier 2:

Les systèmes exécutent SLES et RHEL

2bc
la source
1
Des sons comme la comptabilité des processus peuvent être utiles. L'historique du shell n'a jamais été conçu pour la journalisation, et si vous voulez l'utiliser, vous devez faire confiance à tous vos utilisateurs. Voir la question connexe sur la surveillance des activités et une réponse connexe .
jw013
@ jw013 Merci pour le commentaire. Cependant, cela doit être configuré et géré et, étant donné les informations que j'ai lues, je ferais mieux d'exclure les répertoires comme /proc /devet les /homerépertoires d' utilisateurs . Cela ajoute des frais généraux. Alors que historysont déjà en cours d'enregistrement et que leurs informations de connexion sont connues du système connectant IP, etc. Ces informations, si elles ne sont pas déjà disponibles "statiquement", pourraient être définies de cette façon ou stockées dans une variable ou un fichier et entrées dans les historyenregistrements et le résultat. serait très petit ou 0.
2bc
Si c'est sous Linux, pensez à utiliser auditd. Je ne sais pas si ses journaux vous donneront suffisamment d'informations. La difficulté de ce que vous voulez est précisément pourquoi les comptes partagés sont si décriés.
Gilles 'SO- arrête d'être méchant'
C'est sous Linux, je vais éditer ma question pour que ce soit clair. auditdc'est un peu comme si inotifyvous deviez lui dire quoi surveiller pour les changements. Fichiers individuels, répertoires, etc. Je ne veux pas aller à ce niveau de configuration. En fait (je le fais), mais je m'en fiche pas mal. Je dois puppetgérer ce genre de choses. auditdest livré avec la charge supplémentaire et le temps de configuration également. Si un compte modifie quelque chose, je voudrais quand même regarder en arrière dans l'historique et voir qui ou quoi se connecte et essaie.
2bc
2
hm, puisqu'il PROMPT_COMMAND=exécute simplement des commandes normales avant l'invite suivante, ne pourriez-vous pas écrire une fonction appelant sed / awk qui fonctionne sur la dernière ligne du fichier d'historique pour ajouter les informations. puis appeler cette fonction PROMPT_COMMAND=pour ajouter les données? il serait hackish mais devrait faire l'affaire.
llua

Réponses:

1

D'après la suggestion de llua, nous pouvons travailler un peu plus avec l'histoire. Ajoutez une ligne au fichier BASH RC à l'échelle du système, peut-être /etc/bash.bashrc.

export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'

Configurez la journalisation pour "local6" dans votre enregistreur système. Peut-être quelque chose comme ça:

local6.*    /var/log/commands.log

Redémarrez l'enregistreur système. Peut-être configurer la rotation du fichier journal. Se déconnecter; s'identifier; et l'historique est maintenant écrit dans /var/log/commands.log dans un format comme celui-ci:

date heure enregistreur de nom d'hôte: nom d'utilisateur [audit_pid]: commande [return_val]

Cela pourrait être modifié davantage au goût.

Christophe
la source
1

Les paragraphes suivants décrivent l'idée en général et sont dépassés à certains égards, mais vous pouvez utiliser puis utiliser la dernière de cette page. Permet d'utiliser un gros fichier ~ / .bash_history.archive (distinct de HISTFILE = ~ / .bash_history). Et puis, à la sortie de chaque session bash, nous pouvons y ajouter de nouvelles lignes d'historique.

Le premier problème avec cette approche était: comment faire bash pour appeler ce script à chaque sortie? Bien sûr, si vous le quittez en tapant 'exit', vous pouvez alias la fonction 'exit' mais j'utilise le raccourci Ctrl-D pour cela et je ne pouvais pas trouver un moyen de le réaffecter à quelque chose mais pas à la fonction de sortie intégrée.

Donc, la première tentative a été: d'interdire Ctrl-D par

export IGNOREEOF=10

et définissez la combinaison double Ctrl-X pour appeler la fonction de sortie.

Mais la bonne approche consiste à utiliser exit tramp de bash, ce qui est une solution parfaite car il est appelé quelle que soit la façon dont vous quittez bash: Ctrl-D, exit, fermez la fenêtre xterm.

trap 'archive_history' EXIT

L'étape suivante consiste à définir une ligne de départ dans notre bash_history afin que nous puissions enregistrer uniquement les nouvelles lignes et nous assurer que nous les ajoutons à un fichier d'historique.

export CURBASHSTART=`grep -v "^[ \t]*$" $HISTFILE | wc -l | awk '{print $1}'` CURBASHDATE=`date`

shopt -s cmdhist histappend

C'est tout ce dont nous avons besoin au début de la bash - maintenant nous savons à partir de quelle ligne d'historique l'histoire (fraîche) commence. Pour sauvegarder l'historique, ajoutez le morceau suivant à votre ~ / .bashrc.

archive_history()
{
    HISTORYOLD=${HISTFILE}.archive
    CURTIME=`date`
    CURTTY=`tty`
    if  [ x$HISTDUMPPED = x ]; then
      echo "#-${HOSTNAME}-- ${CURBASHDATE} - ${CURTIME} ($CURTTY) ----" >>   $HISTORYOLD

      history $(($HISTCMD-${CURBASHSTART-0})) | sed -e 's/^[ ]*[0-9][0-9]* [ ]*//g'  >> $HISTORYOLD
      export HISTDUMPPED=1
    fi
}

exit ()
{
   archive_history
   builtin exit

}

Le fichier ~ / .inputrc doit contenir les lignes suivantes pour redéfinir le raccourci de sortie en Ctrl-x x. Du premier coup, vous pourriez penser que c'est un raccourci terrible, mais ensuite vous vous y habituez - croyez-moi.

$if Bash
# to exit through calling exit function which will archive the history
"\C-x\C-x": "exit\n"
# to dump history we have so far
"\C-x\C-w": "archive_history\n"

$endif

De plus, si votre session bash est une session de connexion et que vous quittez en appelant ' logout', vous pouvez ajouter la ligne suivante à votre~/.bash_logout

archive_history

Une fois toutes les actions mentionnées terminées, vous pouvez trouver votre ~/.bash_history.archivefichier contenant des sections comme celles-ci.

#-belka-- Sun Oct 12 21:52:13 EDT 2003 - Sun Oct 12 21:53:25 EDT 2003 (/dev/pts/13) ----
exit
aptitude
exit
#-washoe-- Sun Oct 12 18:03:16 EDT 2003 - Sun Oct 12 23:06:48 EDT 2003 (/dev/pts/3) ----

exit
cd progr/letters/resume/
e resume.tex

qui en général peut être lu comme fichier historique habituel si vous le souhaitez.

Rahul Patil
la source