Optimierung der Netzwerk- und Laufzeitsicherheit in Kubernetes durch den Einsatz von eBPF und Cilium
Teil 1: Einführung eBPF
In den letzten Jahren hat sich eBPF (extended Berkeley Packet Filter) als revolutionäre Technologie etabliert, welche die Landschaft von Netzwerk, Sicherheit und Observability in modernen Cloud Native Umgebungen neugestaltet. In diesem ersten Teil unserer Blogpostserie wollen wir einen Einblick in diese Technologie werfen. In den nächsten beiden Blogposts wird der Fokus auf Cilium und Tetragon liegen. Abschließend beleuchten wir im vierten Teil die Optimierung der Netzwerk- und Laufzeitsicherheit in Kubernetes durch den Einsatz von eBPF und Cilium.
Was ist eBPF?
eBPF ist eine Technologie, welche das dynamische Laden von ereignisbasierenden Anwendungen in den Linux Kernel ermöglicht. Ereignisse können zum Beispiel System Calls, Netzwerkpakete oder Kernel Funktionen sein. Im Gegensatz zu Linux Kernel Modulen wird eine eBPF Anwendung vor dem Laden in den Kernel auf ihre Funktionssicherheit geprüft. Wie wichtig diese Funktion ist, zeigte in diesem Jahre der globale Ausfall von Rechnersystemen, welcher durch falsche Speicherallokation in Treibern der Crowdstrike Software ausgelöst wurde. eBPF Maps sind ein weiterer wichtiger Baustein für eBPF Anwendungen, welcher in diesem Blogpost erläutert wird. Die Eigenschaften von eBPF machen die Technologie zu einem geeigneten Werkzeug für Sicherheit, Observability und Netzwerktechnik.
Anwendungsfälle
Netzwerktechnik
eBPF kann für Netzwerkfunktionen, wie Paketfilterung, Load Balancing oder Routing eingesetzt werden. Projekte, wie Cilium nutzen eBPF, um Netzwerke für hochskalierbare und containerbasierte Anwendungen zu konfigurieren.
Sicherheit
Mit eBPF können Anwendungen zur Echtzeitüberwachung des Betriebssystems oder für das Durchsetzen von Sicherheitsrichtlinien entwickelt werden. Das Projekt Falco nutzt zum Beispiel eBPF, um verdächtiges Verhalten von Anwendungen und Containern zu erkennen.
System Performance Monitoring
Tools wie bpftrace und perf nutzen eBPF, um Systemaufrufe zu verfolgen und damit die Ressourcennutzung zu überwachen. Dadurch können Performanceprobleme identifiziert und behoben werden.
Observability
Durch die Nutzung von Instrumentierungsmethoden des Kernels, erhält man mit eBPF tiefe Einblicke in das Verhalten von Anwendungen und Containern.
Architektur
Die Abbildung 1 verdeutlicht den Ablauf einer eBPF Anwendung. Die eBPF Anwendung wird in diesem Fall mit dem Python Framework bcc über den bpf System Call an den Verifier übergeben. Der Verifier überprüft die Funktionssicherheit der Anwendung. Ist diese gegeben, wird die Anwendung kompiliert und Teil des Linux Kernels. Die Abbildung zeigt, dass die eBPF Anwendung durch die System Calls sendmsg()
und recvmsg()
ausgelöst wird. Die Anwendung schreibt daraufhin Daten in eine eBPF Map. Die eBPF Map ist auch vom User Space erreichbar. Die Python Anwendung kann die Daten also weiterverarbeiten.
Im Folgenden sollen die Bausteine der eBPF Architektur erläutert werden.
Verifier
Der eBPF Verifier betrachtet jede mögliche Instruktion der eBPF Anwendung, um die Sicherheit dieser zu garantieren. Zusätzlich bereitet der Verifier die Anwendung durch Anpassungen am Bytecode zur Ausführung vor. In einem Probelauf der Anwendung, überwacht der Verifier die Register der eBPF Virtuellen Maschine. Für jeden Register wird eine Datenstruktur erstellt, welche unter anderem den Typ und den möglichen Wert des Registers speichert. Aufgrund dieser Informationen entscheidet der Verifier, ob es sich um sichere Instruktionen und damit eine sichere Anwendung handelt oder nicht. eBPF Anwendungen sind nur berechtigt eine Teilmenge von Kernel sowie Helper Funktionen auszuführen. Diese Teilmenge ist von dem Typ der eBPF Anwendung abhängig. Der Verifier erkennt zusätzlich, durch seine Informationen über die Register, ob Helper Funktionen mit den erwarteten Parametern aufgerufen werden. Im Gegensatz zum Compiler wird daher ein Fehler geworfen, wenn ein Pointer auf eine unerwartete Datenstruktur übergeben wird. Des Weiteren prüft der Verifier den Zugriff auf Speicheradressen, den Zugriff auf den Kontext der Anwendung, ob die Anwendung endet, also keine mögliche Dauerschleife existiert und ob die Anwendung einen Rückgabewert liefert.
Virtuelle Maschine
Die eBPF Virtuelle Maschine ist eine Softwareimplementierung eines Computers, welche eBPF Bytecode in Maschinencode der verwendeten CPU Architektur umwandelt. Wird eine eBPF Anwendung geladen, wird die Anwendung einmalig Just In Time (JIT) kompiliert. Es findet keine Interpretation statt. Dadurch ist die Performance der eBPF Anwendung identisch zu dem restlichen Kernel Code.
Maps
eBPF Maps sind Datenstrukturen, welche im Linux Kernel erstellt werden können. eBPF Anwendungen können auf diese zugreifen und diese als Speicherungsmöglichkeit nutzen. eBPF Maps können aber auch vom User Space erreicht werden. Dadurch werden die Maps zu einer Form von Schnittstelle zwischen User und Kernel Space. Ein Anwendungsfall ist es zum Beispiel, dass eine eBPF Anwendung Monitoringdaten sammelt, filtert und daraufhin in eine eBPF Map abspeichert. Ein Agent im User Space greift auf diese Daten zu und macht diese zum Beispiel weiter verfügbar für eine Datenbank wie Prometheus. Eine weitere Möglichkeit ist es eine eBPF Anwendung über eine Map zu konfigurieren.
Ereignistypen
Wie bereits erwähnt werden eBPF Anwendungen durch Ereignisse ausgelöst. Dem Entwickler stehen dabei unterschiedliche Ereignisstypen zur Auswahl. Ereignisstypen sind zum Beispiel Linux System Calls, Kprobes, Socket Operationen oder eXpress Data Path (XDP). Bei XDP ist ein Netzwerkpaket das auslösende Ereignis.
Optimierung der Netzwerk- und Laufzeitsicherheit
Verpassen Sie nicht die weiteren Beiträge dieser Serie. In den nächsten beiden Blogposts wird der Fokus auf Cilium und Tetragon liegen. Abschließend beleuchten wir im vierten Teil die Optimierung der Netzwerk- und Laufzeitsicherheit in Kubernetes durch den Einsatz von eBPF und Cilium.
Sie möchten mit eBPF-basierte Netzwerk- und Laufzeitsicherheit Ihre Kubernetes Umgebungen absichern? Sprechen Sie uns an! Weitere Details zu unserer Partnerschaft mit Isovalent und unserem Kubernetes Consulting Angeboten finden Sie hier.