GitHub ist sich selbst der größte Kunde – doch genau das kann zum Problem werden. Während der Plattformbetreiber eigene Updates testet, entsteht eine paradoxe Situation: Fällt github.com aus, ist auch der Zugriff auf den Quellcode blockiert. Diese scheinbar einfache Abhängigkeit war der Auslöser für ein neues Sicherheitskonzept. Statt auf klassische Spiegelungen setzte das Team auf eBPF, um Deployment-Skripte gezielt zu überwachen und kritische Netzwerkanfragen zu unterbinden.
Die Herausforderung: Kreisförmige Abhängigkeiten im Deployment-Prozess
Die Entwicklung eines neuen Bereitstellungssystems bei GitHub brachte unerwartete Komplexität ans Licht. Ein einfaches Beispiel zeigt das Dilemma: Bei einem MySQL-Ausfall müssen Konfigurationsänderungen auf den betroffenen Servern eingespielt werden. Doch das dafür zuständige Skript benötigt möglicherweise ein Tool, das seinerseits auf GitHub zugreift – genau in dem Moment, in dem die Plattform nicht erreichbar ist.
Drei Arten von Abhängigkeiten stellen dabei besonders hohe Risiken dar:
- Direkte Abhängigkeiten: Das Skript ruft explizit ein Open-Source-Tool von GitHub ab. Bei einem Ausfall kann die Bereitstellung nicht abgeschlossen werden.
- Versteckte Abhängigkeiten: Ein auf dem Server installiertes Hilfsprogramm prüft automatisch auf Updates – und scheitert, wenn GitHub nicht erreichbar ist.
- Vorübergehende Abhängigkeiten: Ein internes API-Aufruf initiiert eine Kettenreaktion: Ein Dienst holt sich ein Tool von GitHub, was das ursprüngliche Skript blockiert.
Traditionelle Lösungen wie das vollständige Sperren des Zugriffs auf github.com kommen nicht infrage, da die Server weiterhin Produktionsverkehr verarbeiten müssen. GitHub suchte daher nach einem Ansatz, der präzise Kontrolle über Netzwerkanfragen einzelner Prozesse ermöglicht.
eBPF als Lösung: Netzwerkfilterung auf Prozessebene
Extended Berkeley Packet Filter (eBPF) bietet eine elegante Möglichkeit, Netzwerkaktivitäten auf Kernel-Ebene zu überwachen und gezielt zu blockieren. Der entscheidende Vorteil: eBPF-Programme lassen sich ohne Neukompilierung des Kernels laden und ausführen. GitHub konzentrierte sich auf den Programm-Typ BPF_PROG_TYPE_CGROUP_SKB, der es ermöglicht, Netzwerkverkehr von bestimmten Prozessgruppen (cGroups) zu filtern.
Die Implementierung folgt einem klaren Prinzip:
- Isolierung des Skripts: Der zu überwachende Prozess wird einer separaten cGroup zugeordnet.
- Filterung des Verkehrs: eBPF überwacht und blockiert gezielt ausgehende Anfragen an kritische Endpunkte wie github.com.
- Automatisierte Steuerung: Das System entscheidet dynamisch, welche Anfragen erlaubt oder unterbunden werden.
Diese Methode eliminiert kreisförmige Abhängigkeiten, ohne die Funktionalität der Server zu beeinträchtigen. Im Gegensatz zu herkömmlichen Firewalls arbeitet eBPF auf Prozessebene und kann somit flexibel auf sich ändernde Anforderungen reagieren.
Praktische Umsetzung: Ein Proof of Concept in Go
GitHub entwickelte ein Proof of Concept mit der Go-Bibliothek cilium/ebpf, die die Arbeit mit eBPF deutlich vereinfacht. Der Prozess umfasst drei zentrale Schritte:
- Kompilierung des eBPF-Programms: Die C-basierte eBPF-Logik wird in ein Kernel-freundliches Format übersetzt.
- Integration in Go: Die Bibliothek generiert automatisch Go-Strukturen für die Interaktion mit dem Kernel.
- Anbindung an cGroups: Das eBPF-Programm wird an eine spezifische cGroup geknüpft, um nur die gewünschten Prozesse zu überwachen.
Ein Ausschnitt aus dem Go-Code demonstriert die Einfachheit der Integration:
//go:generate go tool bpf2go -tags linux bpf cgroup_skb.c -- -I../headers
func main() {
objs := bpfObjects{}
if err := loadBpfObjects(&objs, nil); err != nil {
log.Fatalf("Fehler beim Laden der eBPF-Objekte: %v", err)
}
defer objs.Close()
link, err := link.AttachCgroup(link.CgroupOptions{
Path: "/sys/fs/cgroup/system.slice",
Attach: ebpf.AttachCGroupInetEgress,
Program: objs.CountEgressPackets,
})
if err != nil {
log.Fatal(err)
}
defer link.Close()
// ... Weitere Logik zur Überwachung und Filterung
}Die zugrundeliegende eBPF-Logik zählt ausgehende Pakete und kann bei Bedarf um Blockiermechanismen erweitert werden. Dieser modulare Aufbau ermöglicht es Teams, die Lösung an ihre spezifischen Anforderungen anzupassen.
Ausblick: eBPF als Standard für sichere Bereitstellungen
GitHubs Erfahrungen zeigen, dass eBPF eine robuste Methode bietet, um kreisförmige Abhängigkeiten in komplexen Systemen zu vermeiden. Die Technologie wird zunehmend in anderen Bereichen wie Sicherheit, Monitoring und Performance-Optimierung eingesetzt.
Für Entwicklerteams, die ähnliche Herausforderungen meistern müssen, bietet eBPF eine zukunftssichere Lösung: skalierbar, performant und ohne invasive Änderungen am System. Die Open-Source-Community arbeitet kontinuierlich an neuen Anwendungsfällen – ein spannendes Feld für technisch Interessierte.
KI-Zusammenfassung
Learn how GitHub engineers broke deployment circular dependencies using eBPF to isolate scripts and prevent outage-induced failures. Explore the tech behind this breakthrough.