Enregistrer toutes les commandes lancées par bash
Présentation succincte de bpftrace
Je suis en train d’apprendre à utiliser bpftrace. Bpftrace est une interface à eBPF, sous la forme d’un nouveau langage inspiré de la syntaxe d’awk, qui permet d’observer un système GNU/Linux.
Comme awk, il est possible de créer des commandes d’une seule ligne (des
unilignes), à lancer depuis un terminal, ou bien de créer des scripts en
utilisant un shebang spécifique: #!/usr/bin/env bpftrace
Surveiller bash
Le premier exemple du projet est un programme qui affiche la liste des commande lancées par tous les shells interactifs bash.
Mais ce script est incomplet lorsqu’on le compare au besoin réel d’un hébergeur.
Il n’affiche que le pid
du script et la valeur de retour: printf("%-6d %s\n", pid, str(retval));
.
On peut afficher très facilement l’id et le nom de l’utilisateur:
printf("%-6d %s %5d (%s) - ", pid, str(retval), uid, username);
.
On peut aussi vouloir afficher certaines variables d’environnement. Si on
peut accéder à toutes les variables d’environnement, en utilisant le fichier
/proc/pid/environ
, malheureusement bpftrace ne proprose pas d’outil
complexe pour manipuler les chaînes de caractères et ne supporte les boucles
que depuis la version 5.3 du noyau. Dès lors je n’ai pas cherché à aller
plus loin pour extraire les valeurs dont on a besoin.
Au final on obtient l’uniligne suivant:
bpftrace -e 'uretprobe:/bin/bash:readline { time("%H:%M:%S "); printf("%-6d %s %5d (%s) -", pid, str(retval), uid, username); cat("/proc/%d/environ", pid) ; printf("\n")}'
Il est possible de transformer les lignes produites par cet outil, afin d’extraire les variables d’environnement que l’on veut sauvegarder.
Comment mieux faire
La sonde utilisée ici est uretprobe:/bin/bash:readline
: on récupère la
valeur retour de la fonction readline appelée par bash. Un utilisateur qui
veut être discret pourra utiliser un autre shell, comme dash, pour lancer
d’autres commandes. Il faudrait donc créer une sonde différente pour chaque
type de shell, ou bien trouver une autre sonde commune à tous les shells.
Quoi qu’il en soit, bpftrace est un outil surpuissant pour surveiller ce qui se passe sur un serveur. La liste des exemples fournit une base solide pour développer ses propres sondes de surveillance.