Laut der aktuellsten Umfrage der Cloud Native Computing Foundation (CNCF) ist der Einsatz von Containern in Produktivumgebungen seit 2016 um außerordentliche 300 % gestiegen. Bei der Wahl des richtigen Container Orchestrators ist man sich einig – Kubernetes hat sich als De-factor-Standard etabliert.
Leider ist der Aufbau einer sicheren Kubernetes Umgebung nicht ganz trivial und hält bei der Konfiguration einige Fallstricke bereit. Das Center for Internet Security (CIS) veröffentlicht seit 2017 die CIS Benchmarks, bestehend aus einer Reihe von Konfigurationsempfehlungen für Kubernetes, die dabei helfen sollen, ein höheres Sicherheitsniveau zu erreichen. Ein ähnliches Ziel verfolgen NSA und CISA mit dem Kubernetes Hardening Guide, welcher dieses Jahr erstmals veröffentlicht wurde. Beide Guides unterscheiden sich in der Umsetzung und deutlich im Umfang. Eine Gegenüberstellung soll zeigen, wo die Unterschiede liegen und ob die wichtigsten Sicherheitsaspekte abgedeckt werden.
Das Scannen von Container Images auf bekannte Vulnerabilities ist eigentlich ein Best Practice im Container Security Umfeld, wird aber nur von 44 % der Developer befolgt. Das Problem dabei ist, dass Pods und Images keine automatischen Updates erhalten, wenn neue Vulnerabilities bekannt werden. Images und Pods sollten deshalb regelmäßig auf Vulnerabilities gescannt werden. Oft werden Images aber nur initial beim Push in die Registry gescannt. Je stabiler eine Applikation läuft, desto seltener wird sie upgedatet und desto seltener wird dementsprechend auch ein Scan durchgeführt.
Es wird die Nutzung eines Kubernetes Admission Controllers empfohlen. Dabei handelt es sich um eine Kubernetis native Komponente, die API Requests abhören und verarbeiten kann. Somit kann vor der Erstellung eines Pods ein Vulnerability Scan Request angefordert werden. Je nachdem wie das Ergebnis ausfällt, kann darauf reagiert werden, noch bevor das Objekt tatsächlich existiert.
Hier wird ebenfalls die Verwendung eines Kubernetes Admission Controllers genannt, um Image Policies im Cluster durchzusetzen. Es wird empfohlen Regeln so zu konfigurieren, dass nur freigegebene Images im Cluster zur Ausführung kommen können. Images müssen regelmäßig geprüft werden, wenn diese Updates erhalten.
Das große Problem bleibt bestehen. Ein Scan wird so zwar bei jedem neuen Deployment und bei jedem Update durchgeführt, wird eine Applikation allerdings lange Zeit nicht upgedatet, weil sie beispielsweise sehr stabil läuft, dann gibt es keine weiteren Scans. Es sollte deshalb ein Prozess etabliert werden, der das regelmäßige Scannen von Pods und Images im Kubernetes Cluster sicherstellt.
Einige der populärsten Images, die auf DockerHub zu finden sind, werden in Containern standardmäßig mit dem „root“-User ausgeführt. Tatsächlich werden „Containerized Applications“ von Kubernetes kaum in ihren Aktionen eingeschränkt. Dementsprechend schwerwiegend ist die erfolgreiche Kompromittierung eines Pods bzw. Containers in einem Kubernetes Cluster, da der Angreifer dann mit entsprechend vielen Rechten im Cluster ausgestattet ist.
Grundsätzlich dürfen Pods innerhalb eines Kubernetes Clusters ohne Einschränkungen untereinander kommunizieren, egal ob sich diese im gleichen oder in verschiedenen Namespaces befinden. In der Theorie ist das gesamte Cluster nur so sicher wie das schwächste Glied in der Kette. Erhält ein Angreifer Zugriff auf den am wenigsten sicheren Pod, dann hat er im Grunde Zugriff auf alle Pods des Clusters.
Die Kommunikation einzelner Komponenten im Cluster untereinander sollte mit Hilfe von Kubernetes Netzwerk Policies geregelt und einschränkt werden. Damit kann beispielsweise sichergestellt werden, dass das Frontend nur mit dem Backend respektive eine Datenbank nur mit dem Backend kommunizieren darf. Wichtig ist, dass das in Kubernetes eingesetzte Netzwerk Plugin die Nutzung von Netzwerk Policies unterstützt.
Netzwerk Segmentierung ist wichtig, um sicherzustellen, dass nur Container miteinander kommunizieren können, die dies tatsächlich auch tun sollen. Dies soll mit Hilfe von Netzwerk Policies sichergestellt werden, die in Kubernetes vom Netzwerk Plugin durchgesetzt werden. Aus diesem Grund ist es wichtig ein Netzwerk Plugin einzusetzen, welches sowohl Ingress als auch Egress Netzwerk Policies unterstützt. Es sollten für alle Namespaces des Clusters Netzwerk Policies definiert werden, um unerlaubten Datenverkehr zu blockieren. Ebenso muss gewährleistet sein, dass zulässiger Datenverkehr erlaubt ist.
Ein Kubernetes Cluster besteht aus einer oder mehreren Control Plane(s) und Worker Node(s). Auf der bzw. den Control Plane(s) befinden sich Komponenten, die für die Steuerung des gesamten Clusters verantwortlich sind. Wenn ein Angreifer Zugriff auf die Control Plane erlangt, kann er folglich das gesamte Cluster kontrollieren.
Da Secrets sensitive Informationen enthalten und grundsätzlich keine Verschlüsselung besitzen, wird ein externes Secret Storage und Management System empfohlen.
Mechanismen zur Authentifizierung und Autorisierung helfen dabei den Zugriff auf Cluster Ressourcen zu steuern. Die Authentifizierung von Nutzern ist kein Feature, das in Kubernetes standardmäßig zur Verfügung steht, es gibt allerdings verschiedene Möglichkeiten, um ein Cluster um diese Funktionalität zu erweitern.
Aktionen, die im Cluster durchgeführt werden, können mit Hilfe von Audit Logs protokolliert werden. Das ist wichtig, um die Sicherheit in Kubernetes gewährleisten zu können. Zusätzlich kann damit die Nutzung von CPU und Speicher Ressourcen im Cluster überwacht werden.
In der Standardkonfiguration ist das Audit Logging in Kubernetes nicht aktiv und sollte eingeschaltet werden. Außerdem wird empfohlen Logging auf Host Level, Application Level und wenn zutreffend auf Cloud Level durchzuführen, um ein Gesamtbild der Umgebung zu erhalten. Es wird weiterhin empfohlen Kubernetes Logs per Webhook an eine SIEM Plattform zu senden, um diese effektiv auswerten und weiterverarbeiten zu können.
Logging ist wichtig, um potenziell unautorisierte Zugriffe feststellen zu können, dementsprechend wird empfohlen dieses per Konfiguration zu aktivieren. Es sollte außerdem die Speichernutzung der Audit Logs beobachtet werden, da diese sehr schnell eine große Menge an Speicherplatz einnehmen können.
Ungefähr dreimal im Jahr erscheint eine neue Kubernetes Version. Nur die aktuellste Version sowie die beiden vorherigen Versionen werden mit Sicherheitsupdates versorgt.
Sicherheit ist ein fortlaufender Prozess, deshalb ist es wichtig alle Komponenten mit Patches, Updates und Upgrades zu versorgen und auf einem aktuellen Stand zu halten.
Im CIS Benchmark werden dazu keine Empfehlungen angegeben.
Darüber hinaus gibt der CIS Benchmark einige weitere Empfehlungen an, was die Konfiguration von Kubernetes betrifft, die so im Detail im Kubernetes Hardening Guide nicht zu finden sind. Daraus ergibt sich dann auch der sehr große Unterschied im Umfang der beiden Guides (CIS: 59 Seiten; NSA/CISA: 299 Seiten). Wen die weiteren Punkte interessieren, der kann natürlich selbst einen Blick in den aktuellen CIS Benchmark werfen, für alle anderen stellt Aqua Security eine kurze Zusammenfassung bereit.
Um wieder auf die Einstiegsfrage zurückzukommen, wie sicher Kubernetes ist – es ist nicht sicher genug! Jedenfalls ist das so, wenn man sich nicht weiter mit der Konfiguration befasst.
Der Kubernetes Hardening Guide von NSA und CISA spricht viele Punkte an, die beachtet werden sollten, um Kubernetes sicherer zu machen. Die großen Themen finden sich in beiden Guides wieder, dennoch ist der CIS Benchmark etwas ausführlicher und detaillierter. Der Guide von NSA und CISA enthält aber auch ein paar Aspekte, die so im CIS Benchmark noch nicht zu finden waren. Aus meiner Sicht macht es keinen Sinn sich nur auf die Informationen aus dem einen oder dem anderen zu verlassen. Sowohl CIS Benchmark als auch Kubernetes Hardening Guide stellen eine wertvolle Ressource dar, um die Sicherheit im Kubernetes Umfeld gewährleisten zu können.