Aktivitätsanalyse an Kubernetes-Ports: Potenzielles Backdooring durch die Kubelet-API

26.11.2018

Kürzlich haben wir bei Rapid7 Labs gesteigerte Aktivität an Ports zur Verwaltung eines Kubernetes-Clusters festgestellt. In diesem Beitrag geben wir einige Hintergrundinformationen zu Kubernetes und erläutern, in welcher Verbindung das System zu den Vorgängen steht.

Zudem geben wir Tipps, wie man ein Kubernetes-Cluster sichern kann.

Dieser Tage wird Software immer häufiger über Containerdienste wie Docker verfügbar gemacht. Container machen es Entwicklern leicht, in der Entwicklung und Produktion Programmierumgebungen nachzubilden. Je intensiver Container genutzt werden, desto größer ist die Notwendigkeit, die Bereitstellung dieser Container für alle Softwaredienste zu verwalten. An dieser Stelle kommt Kubernetes ins Spiel. Kubernetes ist ein Open-Source-System, das Sie bei der Automatisierung der Container-Bereitstellung unterstützt.

Eine der Schlüsselkomponenten der Kubernetes-Umgebung ist das Kubelet. Auf jedem Knoten des Kubernetes-Clusters läuft ein Kubelet. Es überwacht und verwaltet die Container, die mithilfe der YAML- und JSON-Spezifikationen von Kubernetes erstellt werden. Zudem steuert das Kubelet einen HTTP-Server, der eine REST-API zur Kontrolle und Überwachung des Knotens freigibt.

Standardmäßig lässt das Kubelet den Webserver über Port 10250 laufen. Die Sicherheit des Kubelets ist allerdings nicht gebrauchsfertig konfiguriert; es liegt in der Verantwortung des Benutzers, eine Authentifizierung für den HTTP-Server einzurichten.

In der Dokumentation von Kubernetes steht dazu Folgendes:

„Standardmäßig werden Anfragen durch den HTTPS-Endpunkt des Kubelets, die nicht durch andere konfigurierte Authentifizierungsmethoden abgelehnt werden, als anonyme Anfragen behandelt und ihnen wird der Benutzername ‚system:anonymous‘ und die Gruppe ‚system:unauthenticated‘ zugewiesen.

Anschließend wird jede Anfrage, die erfolgreich authentifiziert wird (einschließlich anonymer Anfragen), autorisiert. Der Standard-Autorisierungsmodus ist AlwaysAllow, er genehmigt alle Anfragen.“

Aus diesem Grund ist ein nicht konfigurierter Kubernetes-Cluster standardmäßig anfällig gegen Angriffe von außen. Die API enthält PUT-, POST- und DELETE-Anfragen für zahlreiche Ressourcen, einschließlich einer Ressource, die die Remote-Ausführung von Containern möglich machen kann! Ein leitender Sicherheitstechniker von Handy hat Anfang des Jahres eine solche Angriffsmethode aufgedeckt und anhand einer Konzeptstudie demonstriert.

Kürzlich haben wir bei Rapid7 Labs festgestellt, dass seit Mai 2018 eine steile Zunahme der Aktivität an Port 10250 zu verzeichnen ist. Offenbar scannen zunehmend mehr Bots nach dem HTTP-Traffic-Server. Die Analyse anderer Kubernetes-Ports ergab kein ähnlich hohes Traffic-Aufkommen, zeigt jedoch, dass auch diese Ports gelegentlich ins Visier genommen werden. Entsprechend ergänzt Rapid7 Labs seine Sonar-Studien um die Kubernetes-Ports 10250, 10255 und 6443, um die Anfälligkeit dieser Schwachstelle gegen Bedrohungen aus dem Internet nachvollziehen zu können.

Diagramm i

Diagramm i

Das Diagramm i zeigt die Honeypot-Zugriffsmuster seit Januar. Hier sehen wir, wie die Zahl der Verbindungen pro Tag von einzigartigen IPv4s ungefähr im Mai beginnt, stark anzusteigen.

Diagramm ii

Diagramm ii

Diagramm iii

Diagramm iii

Diagramm iv

Diagramm iv

Die Diagramme ii, iii und iv zeigen die Zugriffsmuster einiger anderer Kubernetes-Standardports. Die Aktivität ist hier nicht so stark ausgeprägt wie an Port 10250, doch es wird deutlich, dass auch sie gelegentlich gescannt werden. Deshalb ist es wichtig, diese Ports ebenfalls zu sichern.

Fazit: Am besten ist es, die Kubernetes-Cluster zu prüfen und nachzusehen, ob die Autorisierungen korrekt konfiguriert wurden. Um Ihr Cluster zu sichern, können Sie für Ihre Kubelets eine Authentifizierung durch Bearer-Tokens oder x509-Zertifikate einrichten. Zudem können Sie das Kubelet mit der Flag --anonymous-auth=false einleiten, um zu verhindern, dass alle Anfragen standardmäßig akzeptiert werden. Konfigurieren Sie auch die Autorisierung, sobald Sie die Authentifizierung aktiviert haben. Sofern Sie sich entscheiden, ohne Authentifizierung auszukommen, können Sie durch die Autorisierung sicherstellen, dass anonyme Benutzer nur begrenzten API-Zugriff haben. Weitere Informationen erhalten Sie in der Dokumentation von Kubernetes hier und hier. Auch die Auseinandersetzung mit den Problemstellungen im GitHub-Repository von Kubernetes wird empfohlen.