Introduction à la technologie eBPF

Abstract

Le résumé

Avec l’eBPF, les programmeurs peuvent exécuter des bytecodes personnalisés dans le noyau sans modifier ni charger les modules du noyau ( Kernel ). l’eBPF est étroitement lié au noyau. Introduisons d’abord quelques concepts de base connexes.

Le système Linux est divisé en espace noyau et espace utilisateur.

  • L’espace du noyau est le cœur du système d’exploitation et dispose d’un accès illimité et complet à tout le matériel, comme la mémoire, le stockage et le processeur. Étant donné que le noyau a une telle super autorité, il est tenu d’être strictement protégé, ne permettant que le code le plus fiable de s’exécuter.

  • L’espace utilisateur exécute des processus non-noyau - tels que E/S, systèmes de fichiers, etc. Ces processus ont un accès limité au matériel via des appels système exposés par le noyau. En d’autres termes, les programmes de l’espace utilisateur doivent être filtrés dans l’espace noyau.

L’interface des appels système peut répondre à la plupart des besoins, et les développeurs ont encore besoin de plus de flexibilité face au nouveau matériel, aux systèmes de fichiers, aux protocoles réseau et même aux appels système personnalisés.

Que se passe-t-il si le code utilisateur veut accéder directement au matériel sans modifier le code source du noyau ? Un Linux Kernel Module (LKM) peut être utilisé. L’espace utilisateur doit généralement accéder à l’espace du noyau via des appels système, tandis que LKM est directement chargé dans le noyau et fait partie du noyau. L’une des fonctionnalités les plus précieuses de LKM est qu’il peut être chargé au moment de l’exécution sans compiler le noyau ni redémarrer la machine.

LKM est très utile, mais présente également beaucoup de risques. Le noyau et l’espace utilisateur sont différents et ont des considérations de sécurité différentes. L’espace du noyau est réservé au code privilégié comme le noyau du système d’exploitation. Les appels système connectent le noyau et l’espace utilisateur, permettant à l’espace utilisateur d’effectuer les opérations appropriées sur le matériel. En d’autres termes, LKM peut planter le noyau. La relation étroite entre le module et le noyau fait monter en flèche les coûts de sécurité et de mise à niveau.

Qu’est-ce que l’eBPF - Extended Berkeley Packet Filter

eBPF est une nouvelle méthode d’accès aux au matériel et les services du noyau Linux. Cette nouvelle technologie a été utilisée pour le réseautage, les erreurs, le suivi et les pare-feu.

Cette technologie peut exécuter des programmes en sandbox ( isolation ) dans un contexte privilégié tel que le noyau du système d’exploitation. Il est utilisé pour étendre en toute sécurité et efficacement les capacités du noyau sans qu’il soit nécessaire de modifier le code source ou de charger des modules du noyau.

Comment fonctionne l’eBPF

Les programmes eBPF sont pilotés par des événements et attachés à un chemin de code. Le chemin du code contient des déclencheurs spécifiques appelés hooks qui exécutent tous les programmes eBPF attachés lorsqu’ils sont transmis. Certains exemples de hooks incluent les événements réseau, les appels système, les entrées de fonction et les points de trace du noyau.

Au déclenchement, le code est d’abord compilé dans le bytecode BPF. À son tour, le bytecode est vérifié avant son exécution, pour s’assurer qu’il ne crée pas de boucle. Cette étape empêche le programme de compromettre le noyau Linux accidentellement ou exprès.

Une fois qu’un programme est déclenché à un hook, il effectue ensuite des appels d’assistance. Ces appels d’assistance sont des fonctions qui équipent eBPF de nombreuses fonctionnalités pour accéder à la mémoire. Les appels d’assistance doivent être prédéfinis par le noyau, mais la liste des fonctions existantescontinue de croître.

l’eBPF a été initialement utilisé pour augmenter l’observabilité et la sécurité lors du filtrage des paquets réseau. Cependant, au fil du temps, c’est devenu un moyen de rendre l’implémentation du code fourni par l’utilisateur plus sûre, plus pratique et plus performante.

Les avantages de l’eBPF

l’eBPF est généralement utilisé pour tracer les processus de l’espace utilisateur.

C’est une méthode sûre et utile pour assurer :

Vitesse et performances  : l’eBPF peut déplacer le traitement des paquets de l’espace noyau vers l’espace utilisateur. De même, eBPF est un compilateur à la volée / Juste à temps (JIT). Une fois le bytecode compilé, l’eBPF est invoqué plutôt qu’une nouvelle interprétation du bytecode pour chaque méthode.

Faible intrusion : Lorsqu’il est utilisé comme débogueur, l’eBPF n’a pas besoin d’arrêter un programme pour observer son état.

Sécurité :  Les programmes sont effectivement placés dans un sandbox, ce qui signifie que le code source du noyau reste protégé et inchangé. L’étape de vérification garantit que les ressources ne sont pas saturées par des programmes qui exécutent des boucles infinies.

Commodité  : Créer du code qui relie les fonctions du noyau demande moins de travail que de créer et de maintenir des modules du noyau.

Traçage unifié : l’eBPF vous offre un cadre unique, puissant et accessible pour les processus de traçage. Cela augmente la visibilité et la sécurité.

Programmabilité : L’utilisation d’eBPF permet d’augmenter la richesse des fonctionnalités d’un environnement sans ajouter de couches supplémentaires. De même, puisque le code est exécuté directement dans le noyau, il est possible de stocker des données entre les événements eBPF au lieu de les vider comme le font d’autres traceurs.

Expressivité l’eBPF est expressif, capable d’exécuter des fonctions que l’on ne trouve généralement que dans les langages de haut niveau.

les bonnes pratiques d’eBPF

Étant donné que l’eBPF est une technologie tellement nouvelle, beaucoup de choses restent inexplorées. Les meilleures pratiques concernant l’eBPF évoluent à mesure que la technologie prend de l’importance. Bien qu’il n’existe aucun ensemble défini de meilleures pratiques, vous pouvez faire certaines choses pour garantir des programmes efficaces et efficients.

Si vous utilisez l’eBPF pour votre écosystème, je vous recommande de :

  • Utilisez LLVM Clang pour compiler le C en bytecode.

    Lorsque l’eBPF est entré en scène pour la première fois, il a fallu coder et assembler le programme à la main. Ensuite, les développeurs ont utilisé l’assembleur du noyau pour générer du bytecode.
    Heureusement, il n’est plus nécessaire de le faire. Clang fournit une infrastructure pour le frontend et les outils en langage C.

  • Utilisez les outils BCC lors de l’écriture de programmes BPF.

    La [BPF Compiler Collection](https://github.com/iovisor/bcc) (BCC) est une boîte à outils qui peut vous aider à créer des programmes efficaces de traçage et de manipulation du noyau. Il est particulièrement adapté aux tâches liées à l'analyse des performances et au contrôle du trafic réseau.
    

© 2022 - Sofiane Hamlaooui - Making the world a better place 🌎