Activer syslog dans bash (qui fait quoi ?)

Le but

Le but est de pouvoir tracer l’ensemble des commandes rentrées par un utilisateur sur une machine Unix ou Linux (un peu à la mode de tacacs sur un routeur Cisco).

Pour cela rien de plus simple, il suffit d’activer le module syslog de bash avant de le compiler. Mais le hic est que bien souvent l’administrateur système doit être en root (ou avec les droits root: sudo) pour travailler. Et dans ce cas les logs sont de la forme:

Sep 20 20:12:49 -bash: HISTORY: PID=1722 UID=0 cat /var/log/syslog

Nous avons le « fait quoi » mais pas le « qui », on sait juste que c’est l’UID=0, soit root. Dans cet exemple je suis passé en « sudo -s » à partir de mon compte utilisateur.

J’ai donc décidé de modifier un peu le code source de bash pour ressortir les infos dont j’ai besoin et ainsi connaître le « qui ».

Sep 20 20:12:49 -bash: HISTORY: PID=1822 LOGIN=mickael COMMAND=cat /var/log/syslog

Explications du script d’auto install

Détection de votre version actuelle de bash

Le script va vous afficher la version de votre bash et vous demander si vous souhaitez le mettre à jour.

System: linux / Your bash version: 4.3
Do you execute update and install 'patch make gcc' ? Y/N

Paquets nécessaires

On va tout simplement installer les paquets qui pourront aider à compiler les sources de bash.

Mettre à jour et patcher bash

  1. Le script va télécharger les sources de bash sur ftp.gnu.org.
  2. Le script va aussi télécharger l’ensemble des patchs depuis la sortie du bash et patcher les sources avant la compilation.

screenshot-ftp-gnu-org-2017-01-15-17-34-20

Pour cela il faut renseigner les deux variables:firstpatch=« 1 » #pour bash44-001
lastpatch=« 5 » #pour bash44-005

Activation de syslog et patch pour le « qui »

Syslog (config-top_syslog.patch)

Rien de plus simple on décommente la bonne ligne.

-/* #define SYSLOG_HISTORY */
+#define SYSLOG_HISTORY

Avoir la trace de « qui » (bashhist_syslog.patch)

Ici on va juste changer un morceau du code source de bash pour changer la variable current_user.uid par getlogin().

- syslog (SYSLOG_FACILITY|SYSLOG_LEVEL, "HISTORY: PID=%d UID=%d %s", getpid(), current_user.uid, line);
+ syslog (SYSLOG_FACILITY|SYSLOG_LEVEL, "HISTORY: PID=%d LOGIN=%s COMMAND=%s", getpid(), getlogin(), line);

Après l’application des patchs, le script va compiler puis installer le nouveau bash.

Fin du script

Pour éviter tout désagrement lors de ce genre d’automatisme (surtout quand il s’agit de bash), le script va vous proposer de modifier les binaires bash vous-même (et quand vous le souhaiterez).

###################################
Please execute this commands
cd /bin
bash-4.4-NEW
mv bash-4.4-NEW bash
bash
/etc/init.d/rsyslog restart
###################################
  • Le nouveau bash est nommé: bash-4.4-NEW.
  • Une sauvegarde de votre ancien bash a été faite dans /bin: bash-4.3-OLD (libre à vous de le supprimer pour que personne ne puisse l’utiliser).

Il n’y a plus qu’à remplacer le binaire bash par le nouveau avec la commande « mv ».

Un petit bash –version pour vérifier la bonne prise en compte de ce nouveau bash.

mickael@srv1 :~/$ bash --version                                                                                                             
GNU bash (MIKA), version 4.4.5(1)-release (x86_64-unknown-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Nous avons bien la bone version 4.4.5 (avec les patchs). J’ai souhaité ajouter un message dans cette commande –version : « (MIKA) » modifiable avec la variable BASHPRINT. Cela va servir juste après.

Petits plus

Dans mon cas, je logue l’intégralité des commandes sur un graylog, il faut donc envoyer les commandes tracées vers le connecteur syslog de graylog.

Rsyslog

  • Le script va créer un fichier de log /var/log/tracecommands.log
  • Créer la configuration pour l’envoi des traces vers un syslog externe (variable: IPSYSLOG)
  • Créer le logrotate de tracecommands.log

Check Nagios

Au cas où une mise à jour de l’OS serait faite et que nous perdions notre bash modifié, j’ai souhaité vérifier la version de bash sur l’intégralité de mes serveurs.

Pour cela je vérifie que le petit message « (MIKA) » soit bien présent.

Vous trouverez le fichier: check_bash_version.sh qui est en fait un script servant pour nagios et passant par SNMP.

Résumé:

Avant:

srv1:~# bash --version
GNU bash, version 4.3.30(1)-release (x86-64-pc-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

 

Après:

GNU bash (MIKA), version 4.4.5(1)-release (x86_64-unknown-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

 

Avant:

Sep 20 20:12:49 -bash: HISTORY: PID=1722 UID=0 cat /var/log/syslog

Après:

Sep 20 20:12:49 -bash: HISTORY: PID=1822 LOGIN=mickael COMMAND=cat /var/log/syslog

Versions d’OS testées:

  • Debian Jessie 64bits
  • Debian Wheezy 32bits
  • Debian Wheezy 64bits
  • FreeBSD 7
  • FreeBSD 9
  • CentOS EL6

le lien github du projet

https://github.com/Mickaelh51/bash-autoinstaller-active-syslog

Publicité

Votre commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s

%d blogueurs aiment cette page :