Aller au contenu principal

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.

Cliquer pour accéder au site officiel de bpftrace

Figure 1 : Liste des sondes (probes) accessible avec bpftrace

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.