ebpf logo

Le monitoring est le pilier de tout système d’information, que ce soit ceux que l’on gère ou les applications que l’on utilise au quotidien comme Netflix, Amazon, Google ou Instagram.

Toutes ces plateformes ont un besoin critique : savoir à tout moment si l’application fait ce qu’elle est censée faire. Et détrompez-vous, quand on parle de monitoring, on ne parle pas seulement d’uptime ! On parle de performance, de sécurité, de débogage, et bien plus encore.

Si vous avez suivi mes articles ou ma récente chaîne Youtube, vous savez sûrement que les applications modernes reposent sur des architectures distribuées. L’application n’est plus hébergée sur un seul serveur, mais éclatée sur plusieurs machines, plusieurs datacenters, voire plusieurs pays !

Dans ce contexte, l’observabilité devient un défi de taille. Comment surveiller efficacement un puzzle éparpillé ? Et même si on surveille chaque serveur individuellement, comment s’assurer que l’ensemble fonctionne de façon optimale ?

Pour répondre à ça, il faut aller à la source, là où tout se passe, c’est a dire le système d’exploitation. C’est lui qui arbitre les ressources, les processus, le réseau et le stockage.

Vous l’aurez deviné, Linux est roi dans ce domaine, c’est l’OS standard des datacenters. Pour avoir une visibilité parfaite, il faut donc s’approcher au plus près du Kernel Linux. Mais il y a un petit probleme, on ne touche pas au Kernel n’importe comment. Ce que l’on peut y faire est très limité (et tant mieux !), car le Kernel est le cœur du système. Si on laisse n’importe qui y exécuter du code, on risque de tout casser, et pas qu’un peu…

C’est là que nous avons besoin d’un moyen sécurisé, performant et dynamique pour interagir avec le Kernel. C’est exactement là qu’eBPF entre en scène.

Le Kernel Linux

Avant de plonger dans eBPF et de comprendre pourquoi c’est une révolution (et croyez-moi, ça l’est), faisons un petit rappel sur ce que c’est le Kernel Linux.

Le kernel (ou noyau), selon Wikipédia, est défini comme suit : alt text

Un noyau de système d’exploitation, ou simplement noyau, ou kernel en anglais, est une des parties fondamentales de certains systèmes d’exploitation. Il gère les ressources de l’ordinateur et permet aux différents composants — matériels et logiciels — de communiquer entre eux.

En bref, un kernel est un programme qui fait la traduction entre ce que nous voulons faire (l’espace utilisateur ou user space) et ce que le matériel peut faire (l’espace noyau ou kernel space).

Lorsqu’on crée un fichier, qu’on lance une application ou qu’on envoie une requête réseau, on ne parle pas directement au matériel. En réalité, on demande au noyau de faire quelque chose pour nous via ce qu’on appelle un appel système (ou syscall).

Prenons l’exemple de l’écriture d’un fichier sur le disque. Votre explorateur de fichiers n’est qu’une “simple” interface graphique. Quand vous sauvegardez, il demande poliment au Kernel d’écrire les données. C’est le Kernel qui va faire le “sale boulot” c’est a dire, communiquer avec le disque dur, chercher un emplacement libre, écrire les bits, mettre à jour la table d’allocation… Tout ça de manière transparente pour vous.

Imaginez si l’on laissait chaque développeur gérer ça “à sa sauce” ! On aurait un système catastrophiquement lent, bourré de bugs et surtout très peu sécurisé. C’est pour ça que le rôle du Kernel est si crucial, il est le garant de la stabilité et de la sécurité.

Linux n’est pas le seul OS à avoir un kernel. Windows, MacOS, BSD en ont tous un. Mais Linux est spécial car c’est un kernel totalement Open Source. Cela veut dire qu’on peut consulter son code source, le modifier, et l’adapter à nos besoins spécifiques sans contrainte majeure. Et ça, c’est énorme !

C’est pour cela que Linux est devenu le kernel de référence pour les serveurs, les datacenters, et même nos smartphones et frigos (Android est basé sur Linux).

eBPF : Pourquoi et comment ?

Si vous avez suivi jusqu’a la, j’ai dit precedemment que le Kernel Linux est : “est le garant de la stabilité et de la sécurité”.

Ce qui veut dire que pour interagir avec lui, il faut respecter des règles strictes. C’est comme essayer de rentrer dans une banque, il y a des protocoles de sécurité très stricts qu’on doit absolument respecter. On ne peut pas juste entrer et commencer à faire ce qu’on veut.

Et donc pour notre besoin essentiel de monitoring, on doit quand meme pouvoir, capturer, analyser, agir (bloquer, alerter, etc) sur des événements qui se passent dans le Kernel.

Peut etre c’est pas clair, mais on veut “monitorer” le kernel, car tout ce qui se passe la-a-dedans est crucial pour comprendre le comportement de notre système. Dans l’espace application un attaquant peut plus ou moins cacher ces traces, mais toute actions qu’il fait doit absolument passer par le kernel. Donc si on peut “monitorer” le kernel, on a une visibilité quasi totale sur ce qui se passe dans notre système.

Historiquement, pour faire ça, on utilisait des modules Kernel. Ce sont des morceaux de code qu’on peut charger dynamiquement dans le kernel pour lui ajouter des fonctionnalités. C’est puissant, mais aussi très risqué. Un module mal écrit peut planter tout le système, causer des fuites de mémoire, ou pire, ouvrir des failles de sécurité.

L’autre solution un peu plus classique est de faire une Pull Request (PR) directement dans le code source du kernel maintenu par la communaute Linux. C’est la méthode la plus sûre, car le code est revu par des experts avant d’être intégré. Mais c’est aussi la plus lente et la moins flexible. Si on a besoin de quelque chose rapidement, on est bloqué.

Voila une image qui résume bien le cycle de vie d’une Pull Request dans le kernel Linux :

alt text

C’est la qu’eBPF (extended Berkeley Packet Filter) entre en jeu. eBPF est venue pour revolutionner la façon dont on interagit avec le kernel Linux.

eBPF est une technologie qui permet d’exécuter du code dans le kernel de manière sécurisée et performante, sans avoir besoin de charger des modules kernel ou de faire des PRs. C’est comme avoir une “sandbox” dans le kernel où on peut exécuter du code personnalisé. C’est en fait un genre de machine virtuelle intégrée au kernel Linux.

Avec eBPF, on peut écrire des programmes en C (ou d’autres langages via des compilateurs spécifiques) qui sont ensuite compilés en bytecode eBPF. Ce bytecode est vérifié par le kernel pour s’assurer qu’il est sûr à exécuter. Si tout est bon, le programme est chargé dans le kernel et peut interagir avec divers points d’attache (hooks) pour capturer des événements, analyser des données, ou même modifier le comportement du système.

Je sais pas si vous vous rendez compte, mais c’est une révolution ! On peut maintenant faire quasiment tout ce qu’on veut dans le kernel, de manière dynamique, sans risque de planter le système.

Ce point que je viens de ecrire, “sans risque de planter le système”, est crucial. eBPF a été conçu avec la sécurité en tête. Le bytecode est soumis à un processus de vérification rigoureux avant d’être exécuté. Cela garantit que le programme ne peut pas faire de choses dangereuses comme accéder à la mémoire non autorisée ou entrer dans des boucles infinies. Donc meme si on fait une erreur dans notre code eBPF, le kernel reste protégé. Et le code ebpf ne sera jamais executé s’il n’est pas validé par le verificateur.

alt text

Et alors ?

Ce genre de technologie ouvre des possibilités incroyables. Mais on ne va pas se voiler la face, eBPF n’est pas une technologie facile à maîtriser ni faite pour tout le monde.

Deja il faut avoir une tres forte culture du monitoring, du kernel Linux, et de la programmation bas niveau. Ce n’est pas quelque chose qu’on apprend en un jour.

Mais pour ceux qui s’y investissent, les récompenses sont énormes. eBPF permet de créer des outils de monitoring ultra-performants, des systèmes de sécurité avancés, et même des solutions de réseau innovantes.

Meme Windows est en train de developper son propre eBPF pour apporter ces avantages a son kernel ! C’est dire a quel point cette technologie est prometteuse. Donc c’est absolument quelque chose a garder a l’esprit si vous travaillez dans le domaine du systeme, du reseau, ou de la securite. eBPF est en train de changer la donne, et ceux qui sauront l’exploiter auront un avantage significatif.

Et sur ce, je vous remercie de m’avoir lu jusqu’au bout ! N’hésitez pas à partager vos pensées, questions ou expériences avec eBPF par message Linkedin !!