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
- Le script va télécharger les sources de bash sur ftp.gnu.org.
- Le script va aussi télécharger l’ensemble des patchs depuis la sortie du bash et patcher les sources avant la compilation.
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