Shell – Traiter avec plusieurs files d'historique de commands

Là où je travaille, à des fins de security et d'audit, nous devons conserver un file historique pour chaque session (user, date, terminal, etc.) dans le nom du file.

Évidemment, la variable HISTFILE est en lecture seule (en readonly HISTFILE ), donc un user normal ne peut pas définir un file d'historique différent (non root, sans changer /etc/profile ).

Voici ce que nous avons dans le /etc/profile :

 EXTENDED_HISTORY=ON readonly EXTENDED_HISTORY export EXTENDED_HISTORY HISTFILE=$HOME/.history/`date +%y%m%d.%H%M%S`.${WHO_USER:-user}.${WHO_TERMINAL:-term}.${SSH_PORT:-port}.${MY_PID:-pid} readonly HISTFILE export HISTFILE 

Le gros problème est que nous ne pouvons pas searchr d'anciennes commands, sauf faire un grep sur les anciens files.

Avez-vous besoin d'une solution de contournement simple ou même une meilleure solution pour garder l'audit et être toujours en mesure de partager l'historique des commands sur plusieurs sessions?

Nous utilisons ksh et bash.

Les files d'historique Shell sont une mauvaise méthode d'audit des commands. Ils peuvent sortingvialement être modifiés ou contournés par les users. Ils ne sont utiles que si vous faites confiance aux users pour ne pas contourner délibérément ou accidentellement le mécanisme d'audit. Par exemple, les commands lancées à partir d'une interface graphique, d'un éditeur, etc. ne sont pas enregistrées de cette façon. Il y a bien d'autres façons pour un user de lancer des commands non-enregistrées et même de maintenir un déni plausible de le faire par commodité ou sans s'en rendre count, et non comme une tentative délibérée de contourner une mesure de security.

Si vous ajoutez les files d'historique uniquement (ce qui nécessite l'exécution de chattr +a tant que root dans le file d'historique), tout ce qui a été enregistré rest enregistré, mais il est toujours facile de contourner l'logging.

Plutôt que de conserver des files d'historique distincts, vous pouvez conserver un seul file d'historique et le sauvegarder régulièrement. Cela conservera la date à laquelle les commands ont été exécutées, mais pas le terminal.

Si vous devez avoir la certitude que les journaux correspondent aux commands exécutées, les files d'historique du shell ne sont pas les bons outils. Utilisez plutôt le daemon d'audit. Configurez-le pour save tous les appels execve .

 auditctl -A exit,always -S execve 

Voir les questions suivantes pour plus d'informations:

  • Journaliser chaque invocation de chaque programme SUID?
  • Process Monitor équivalent pour Linux?
  • Puis-je envoyer des journaux auditd à un autre ordinateur?

Je ne suis pas clair à 100% sur ce que vous requestz, mais voici comment j'ai un historique distinct pour chaque session. Il est essentiellement nommé d'après host et pty. C'est pour bash.

 # Unique history file per shell session. HISTSIZE=300 HISTFILE=$HOME/.bash_hist_${HOSTNAME/.*/}_$(basename $(tty)) SAVEHIST=500 export HISTCONTROL=ignoredups 

Ceci est dans un file ~/.bashrc . Je ne comprends pas ce que vous voulez dire par vous ne pouvez pas changer HISTFILE.

Un inconvénient est que vous ne pouvez pas prédire l'historique de session que vous obtiendrez. Mais pour vérifier, vous pouvez grep l'set complet:

 grep something ~/.bash_hist_* 

Mais vous gardez le context d'une session dans un file séparé.