Kubernetes-Engine sichern
Dieses Thema enthält Sicherheitsempfehlungen für die Verwendung der Kubernetes-Engine von Oracle Cloud Infrastructure (auch als OKE bezeichnet).
Mehrmandantenfähige Cluster
Gegenseitig vertrauenswürdige Workloads
Es wird zum gegenwärtigen Zeitpunkt nicht empfohlen, sich gegenseitig nicht vertrauende Workloads im selben Cluster auszuführen. Beispiel: Sie sollten die folgenden Workloads nicht im selben Cluster ausführen:
- Entwicklungs-Workloads und Produktions-Workloads
- Control Plane und Data Plane
- Workloads, die beliebigen Kundencode ausführen
Workloads mit unterschiedlichen Vertrauensstufen
Verwenden Sie separate Cluster, wenn mehrere Mandanten, Teams oder Benutzer mit unterschiedlichen Trustebenen auf dasselbe Cluster zugreifen. Wie in nachfolgenden Abschnitten erwähnt, bieten Kubernetes und OKE Methoden zur Isolierung von Workloads. Für eine erweiterte Mehrmandantenfähigkeit sind diese Methoden derzeit jedoch nicht ausreichend.
Kubelets haben Lesezugriff auf Ressourcen
Ein Kubelet, das auf einem Worker-Knoten in einem von OKE erstellten Cluster ausgeführt wird, kann keine Ressourcen ändern, die nicht zum Knoten des Kubelets gehören. Weitere Informationen finden Sie in der Kubernetes-Dokumentation unter NodeRestriction Zulassungscontroller.
Beachten Sie insbesondere bei der Ausführung von mehrmandantenfähigen Workloads, dass ein Kubelet Ressourcen, die nicht zu seinem Knoten gehören, zwar nicht ändern kann, das Kubelet diese Ressourcen jedoch trotzdem lesen kann. Zu diesen Ressourcen können gehören:
- Dienste
- endpoints
- Knoten
- Pods
- Secrets, Konfigurationszuordnungen und persistente Volumes, die an den Knoten des Kubelets gebunden sind
Weitere Informationen finden Sie unter Knotenautorisierung verwenden in der Kubernetes-Dokumentation.
Secrets-at-Rest in etcd verschlüsseln
Informationen zur Konfiguration der Secret-Verschlüsselung finden Sie unter Kubernetes-Secrets-at-Rest in etcd verschlüsseln.
Rollenbasierte Zugriffskontrolle (Role-Based Access Control, RBAC)
Kubernetes bietet eine integrierte Komponente für die rollenbasierte Zugriffskontrolle (Role-Based Access Control, RBAC), die einen eingehenden Benutzer oder eine eingehende Gruppe einem Set von Berechtigungen zuordnet, die in Rollen gebündelt sind. Diese Berechtigungen kombinieren Verben (Abrufen, Erstellen, Löschen) mit Ressourcen (Pods, Services, Knoten) und können einem Namespace oder Cluster zugeordnet werden. Es wird ein Set vorkonfigurierter Rollen bereitgestellt, die eine angemessene Standardtrennung der Verantwortlichkeiten bieten, je nachdem, welche Aktionen ein Kunde durchführen möchte.
Es ist wichtig zu verstehen, wie Updates an einem Objekt zu Aktionen an anderen Stellen führen können. Beispiel: Ein Benutzer kann möglicherweise keine Pods direkt erstellen, aber wenn er berechtigt ist, ein Deployment zu erstellen, das in seinem Namen Pods erstellt, kann er diese Pods indirekt erstellen. Ebenso führt das Löschen eines Knotens aus der API dazu, dass die für diesen Knoten geplanten Pods beendet und auf anderen Knoten neu erstellt werden. Die vorkonfigurierten Rollen sind ein Kompromiss zwischen Flexibilität und allgemeinen Anwendungsfällen. Sie sollten jedoch stärker eingeschränkte Rollen sorgfältig prüfen, um eine versehentliche Eskalation von Berechtigungen zu vermeiden. Wenn die vorkonfigurierten Rollen Ihren Anforderungen nicht entsprechen, können Sie Rollen speziell für Ihre Anwendungsfälle erstellen.
Sie sollten immer das Least-Privilege-Prinzip beachten, um sicherzustellen, dass Benutzer und Kubernetes-Service-Accounts die minimal erforderlichen Berechtigungen haben. Standardmäßig haben alle Benutzer mit der Berechtigung USE CLUSTER in Oracle Cloud Infrastructure IAM oder einem beliebigen Kubernetes-Service-Account keinen Zugriff auf die Kubernetes-API, mit Ausnahme der Discovery-Rollen. In Informationen zu Zugriffskontrolle und Kubernetes-Engine (OKE) erhalten Sie Informationen zur Integration von IAM in OKE.
Sie müssen die OCID des Principals verwenden, wenn Sie RBAC-Bindings erstellen (z.B. Benutzer-OCID, Instanz-OCID und Servicename).
Clustersicherheit
Sie können die Vorgänge steuern, die Pods für ein Cluster ausführen dürfen, das Sie mit der Kubernetes-Engine erstellt haben, indem Sie Podsicherheits-Policys für das Cluster einrichten. Pod-Sicherheits-Policys bieten Ihnen die Möglichkeit, sicherzustellen, dass Pods sicherheitsbezogene Bedingungen erfüllen, bevor sie von einem Cluster akzeptiert werden können. Sie können Pod-Sicherheits-Policys beispielsweise für folgende Zwecke verwenden:
- Speicheroptionen begrenzen, die Pods zur Verfügung stehen
- Host-Networking und Ports begrenzen, auf die Pods zugreifen können
- verhindern, dass Pods als Root-Benutzer ausgeführt werden
- verhindern, dass Pods im privilegierten Modus ausgeführt werden
Nachdem Sie eine Pod-Sicherheits-Policy für ein Cluster definiert haben, müssen Sie den anfordernden Benutzer oder Pod zur Verwendung der Policy autorisieren, indem Sie Rollen und Bindings erstellen. Sie können dann angeben, ob ein Cluster die definierten Pod-Sicherheits-Policys durchsetzen soll, indem Sie den PodSecurityPolicy-Zulassungscontroller des Clusters aktivieren.
Weitere Informationen finden Sie unter Podsicherheits-Policys mit Kubernetes Engine (OKE) verwenden.
Das Upstream-Kubernetes-Projekt veraltete Podsicherheits-Policys in Kubernetes-Version 1.21 und entfernte das Feature in Kubernetes-Version 1.25. Folglich unterstützt Kubernetes Engine keine Podsicherheits-Policys und den PodSecurityPolicy-Zulassungscontroller in Clustern, auf denen Kubernetes-Version 1.25 und höher ausgeführt wird.
Wenn Sie ähnliche Funktionen benötigen, sollten Sie stattdessen Kubernetes-Podsicherheitsstandards und den Zulassungscontroller PodSecurity verwenden (zusammen mit den Policys "Berechtigt", "Baseline" und "Eingeschränkt"). Standardmäßig aktiviert Kubernetes Engine den PodSecurity-Zulassungscontroller in Clustern, auf denen Kubernetes-Version 1.23 und höher ausgeführt wird, um Podsicherheitsstandards zu unterstützen. Weitere Informationen zu den Sicherheitsstandards für Kubernetes-Pods und dem Zulassungscontroller PodSecurity finden Sie unter Pod Security Standards in der Kubernetes-Dokumentation.
Alternativ können Sie auch andere Alternativen verwenden, die im Kubernetes-Ökosystem entwickelt werden, um Richtlinien durchzusetzen.
Wenn Sie sich entscheiden, von Podsicherheits-Policys und dem PodSecurityPolicy-Zulassungscontroller zur Verwendung von Podsicherheitsstandards und dem PodSecurity-Zulassungscontroller zu wechseln, finden Sie weitere Informationen unter Von PodSecurityPolicy zum integrierten PodSecurity-Zulassungscontroller migrieren in der Kubernetes-Dokumentation. Beachten Sie, dass die Migration vor dem Erstellen eines neuen Clusters mit Kubernetes-Version 1.25 oder vor dem Upgrade eines vorhandenen Kubernetes-Clusters der Version 1.24 zur Ausführung von Kubernetes-Version 1.25 abgeschlossen werden muss. Beachten Sie außerdem, dass die Konsole eine praktische Möglichkeit bietet, die Verwendung des Zulassungscontrollers PodSecurityPolicy in vorhandenen Kubernetes-Clustern zu deaktivieren, die von der Kubernetes-Engine erstellt und verwaltet werden (siehe Zulassungscontroller PodSecurityPolicy mit der Konsole deaktivieren).
Knotenpoolsicherheit
Knotenpool-Compartments
Knotenpools in einem Cluster können Compartments umfassen. Die Verwendung mehrerer Compartments bietet zwar eine bequeme Möglichkeit, Worker-Knoten zu gruppieren und zu verwalten, jedoch keine Isolierung zwischen den Worker-Knoten im Cluster. Jede Workload kann unabhängig vom Compartment über einen beliebigen Knotenpool geplant werden. Ein gültiger Anwendungsfall für die Verwendung von mehr als einem Compartment für einen Knotenpool wäre die einfache Erstellung dynamischer Gruppen und IAM-Policys für Worker-Knoten. Ein ungültiger Anwendungsfall für mehrere Compartments wäre es, jeden Knotenpool, der eine Kunden-Workload ausführt, in ein separates Compartment einzufügen, unter der Annahme, dass die Compartments eine Art Sicherheitsbegrenzung oder Isolierung bieten.
Knotenpool-Subnetze
Es wird empfohlen, für Knotenpools nur private Subnetze zu verwenden. Ein Servicegateway muss so konfiguriert sein, dass es Zugriff auf Oracle Cloud Infrastructure-Services ermöglicht. Ein Servicegateway kann nicht verwendet werden, wenn die Subnetze über ein Internetgateway öffentlich zugänglich sind. Verwenden Sie ein NAT-Gateway , wenn Ihre privaten Subnetze Zugriff auf das Internet benötigen.
Steuern, auf welche Knoten Pods zugreifen dürfen
Standardmäßig kann ein Pod auf jedem Knoten im Cluster geplant sein. Kubernetes bietet ein umfassendes Set an Policys, mit denen die Positionierung von Pods auf Knoten gesteuert wird, sowie die den Endbenutzern zur Verfügung stehende Taint-basierte Pod-Platzierung und -Entfernung. Bei vielen Clustern kann die Verwendung dieser Policys zum Trennen von Workloads eine Konvention sein, die Autoren annehmen oder über Tools durchsetzen. Diese Platzierungskontrollen sind in einer mehrmandantenfähigen Umgebung nicht geeignet, wenn Benutzer mit Deployment-Fähigkeiten nicht vertrauenswürdig sind. Wenn nicht vertrauenswürdige Benutzer Code bereitstellen, sollten Sie ein Cluster pro nicht vertrauenswürdiger Gruppe in Betracht ziehen.
Zugriff auf Instanz-Principals begrenzen
Standardmäßig können alle Pods auf einem Knoten über den Instanzmetadaten-Endpunkt auf die Instanz-Principal-Zertifikate zuzugreifen. Um eine Berechtigungseskalation über Instanz-Principals zu vermeiden, sollten Sie Workloads in allen Knotenpools mit unterschiedlichen dynamischen Gruppen isolieren, sodass Pods in einem bestimmten Knotenpool die minimal erforderlichen Berechtigungen haben.
Beispiel: Angenommen, Sie verfügen über die beiden folgenden Workloads, die jeweils unterschiedliche Zugriffsberechtigungen erfordern:
- LogArchiver - benötigt Zugriff zur Verwaltung von Buckets und Objekten in Object Storage
- HostMonitor: benötigt Zugriff auf die Compute-API, um Instanzen zu verwalten
Die einfachste Methode wäre, sie im selben Knotenpool zu planen und dem Instanz-Principal alle erforderlichen Zugriffsberechtigungen zuzuweisen. Dies erhöht jedoch die Auswirkung im Falle einer Beeinträchtigung der Sicherheit einer der Workloads. Ein besserer Ansatz wäre, die Workloads in separaten Knotenpools mit den begrenzten Zugriffsberechtigungen zu planen, die die Instanz-Principals für die jeweilige Workload benötigen.
Container-Zugriff auf Instanzmetadaten blockieren
Die bevorzugte Methode, den Zugriff zu blockieren, ist die Verwendung eines Netzwerk-Policy-Plug-ins mit der Standard-Policy "Alle ablehnen". Dann würden Sie den Zugriff auf Pods und Netzwerke, die NetworkPolicy-Ressourcen in Kubernetes verwenden, ausdrücklich über Labelselektoren erteilen. Wenn kein Netzwerk-Policy-Plug-in installiert ist, können Sie eine IPTables-Regel verwenden, um den Zugriff von allen Pods auf dem Host einzuschränken. Es wird empfohlen, diese Methode nicht zum Blockieren einer Untergruppe von Pods auf einem Host zu verwenden.
Wichtig: NetworkPolicys und die folgende IPTable-Regel gelten nur für Container im Pod-Overlay-Netzwerk. Die im Hostnetzwerk ausgeführten Container und Services sind von keiner der folgenden Optionen betroffen:
iptables --insert FORWARD 1 --in-interface veth+ --destination 169.254.0.0/16 --jump DROP
Netzwerksicherheit
Pods, die in Ihrem OKE-Cluster ausgeführt werden, müssen häufig mit anderen Pods im Cluster oder mit Services außerhalb des Clusters kommunizieren. Kubernetes Engine bietet mehrere Optionen, um die Kommunikation mit und von den Workloads in Ihrem Cluster zu sichern. Um die beste Netzwerksicherheit zu erreichen, sollten Sie eine Kombination aus Netzwerk-Policys (zur Sicherung der Netzwerkkommunikation auf Pod-Ebene) und Sicherheitslisten (zur Sicherung der Netzwerkkommunikation auf Hostebene) verwenden.
Netzwerk-Policys
Mit Netzwerk-Policys in Kubernetes können Administratoren definieren, wie Gruppen von Pods mit anderen Pods im Cluster kommunizieren können. Mit Netzwerk-Policys können Sie auch definieren, wie Gruppen von Pods mit Services außerhalb des Clusters kommunizieren können (Beispiel: Oracle Cloud Infrastructure-Services).
Um den Zugriff mit Netzwerk-Policys einzuschränken, müssen Sie ein Netzwerk-Plug-in installieren. Netzwerk-Plug-ins konfigurieren und setzen die Netzwerk-Policys durch, die in Kubernetes definiert sind. Es stehen zahlreiche Netzwerk-Plugin-Optionen zur Verfügung. Sie können die Anweisungen hier befolgen, um Calico in Ihrem Cluster zu installieren und zu konfigurieren. Die Aufgabe von Netzwerk-Policy-Plug-ins ist es, Zugriff auf den Host einzuschränken. Informationen zur Installation von Calico in OKE finden Sie unter Beispiel: Calico installieren und Netzwerk-Policys einrichten.
Knotenpool-Sicherheitslisten
Netzwerkadministratoren können Sicherheitslistenregeln in Knotenpool-Subnetzen definieren, um den Zugriff auf und von Worker-Knoten zu beschränken. Durch die Definition von Sicherheitslistenregeln können Administratoren Netzwerkeinschränkungen durchsetzen, die auf den Hosts in Ihrem Cluster nicht außer Kraft gesetzt werden können.
Da die gesamte Pod-to-Pod-Kommunikation in einem VXLAN-Overlay-Netzwerk auf den Worker-Knoten stattfindet, können Sie die Pod-to-Pod-Kommunikation nicht mit Sicherheitslistenregeln einschränken. Allerdings können Sie mit Sicherheitslisten den Zugriff auf Ihre und von Ihren Worker-Knoten einschränken.
Wichtig: Um sicherzustellen, dass das Cluster funktionieren kann, muss in den Knotenpool-Subnetzen ein Mindestset an Sicherheitslistenregeln vorhanden sein. Bevor Sie die Sicherheitslistenregeln ändern, finden Sie unter Example Network Resource Configurations weitere Informationen zum Mindestset an Sicherheitslistenregeln.
Best Practices bei der Workload-Sicherheit
Image-Digests anstelle von Tags verwenden
Es wird empfohlen, dass Sie Images nur mit den Image-Digests und nicht mit Tags abrufen (da Image-Tags veränderbar sind). Bei Image-Digests handelt es sich um den sha256-Digest des Image, mit dem Docker prüfen kann, ob das heruntergeladene Image Ihren Erwartungen entspricht.
Beispiel für Image-Digest-ID:
sha256:77af4d6b9913e693e8d0b4b294fa62ade6054e6b2f1ffb617ac955dd63fb0182
Rufen Sie das Image wie im folgenden Beispiel gezeigt ab:
docker pull acme@sha256:77af4d6b9913e693e8d0b4b294fa62ade6054e6b2f1ffb617ac955dd63fb0182
Mit dem folgenden Befehl können Sie alle Digests für Ihre lokalen Images anzeigen:
docker images --digests
Ressourcennutzung begrenzen
Die Ressourcenquota begrenzt die Anzahl oder Kapazität der einem Namespace gewährten Ressourcen. Sie wird meist verwendet, um die Menge an CPU, Speicher oder persistentem Datenträger zu begrenzen, die ein Namespace zuweisen kann. Sie kann aber auch steuern, wie viele Pods, Services oder Volumes in jedem Namespace vorhanden sein dürfen.
Grenzwertbereiche schränken die maximale oder minimale Größe einiger der oben genannten Ressourcen ein, um zu verhindern, dass Benutzer unangemessen hohe oder niedrige Werte für häufig reservierte Ressourcen wie Speicher anfordern, oder um Standardgrenzwerte anzugeben, wenn keine festgelegt sind.
Der Zugriff auf Ressourcenquotas kann über RBAC-Policys in Kubernetes eingeschränkt werden. Dadurch kann ein Administrator sicherstellen, dass Benutzer eines Clusters keine Ressourcen verwenden können, auf die sie keinen Zugriff haben sollten. Weitere Informationen finden Sie in der Kubernetes-Dokumentation unter Ressourcennutzung in einem Cluster begrenzen.
Tiller-Add-on deaktivieren
OKE bietet ein optionales Tiller-Add-on. Auf diese Weise können Sie Helm+Tiller ganz einfach installieren und nutzen, sodass Sie Kubernetes schnell bereitstellen und ausführen können. Dieses Add-on wird für Produktionscluster aufgrund der mit Tiller verknüpften Sicherheitsrisiken nicht empfohlen. Mit Tiller bereitgestellte Cluster verfügen nicht über eine Authentifizierung oder Autorisierung für API-Aufrufe an Tiller, was bedeutet, dass sie keine Zuordnung für Anforderungen bereitstellen können. Daher kann jeder Operator oder Service, der Tiller erreichen kann, seine APIs mit Tiller-Zugriff aufrufen.
Um die mit Tiller verknüpften Sicherheitsprobleme zu lösen, wurde Helm V3 entwickelt. Das Helm V3-Release hat Tiller vollständig aus Helm entfernt. Es wird empfohlen, Helm V3 zu verwenden, wenn Sie die von Helm+Tiller bereitgestellte Funktionalität nutzen möchten.
Um das Tiller-Add-on in einem vorhandenen Cluster zu deaktivieren, wenden Sie sich an Oracle Support.
Kubernetes-Dashboard-Add-on deaktivieren
OKE bietet ein optionales Kubernetes-Dashboard-Add-on für die einfache Installation des Kubernetes-Dashboards. Das Kubernetes-Dashboard wird von OKE mit dem für die Ausführung erforderlichen minimalen Set an Berechtigungen installiert. Sie können das Dashboard nur dann verwenden, wenn Sie zusätzliche Zugangsdaten angeben. Weitere Informationen finden Sie unter Mit dem Kubernetes-Dashboard auf Cluster zugreifen.
Das Dashboard ist besonders für neue Kubernetes-Benutzer hilfreich. Wir empfehlen jedoch nicht, dieses Add-on auf Produktionsclustern zu installieren, da keine erweiterbare Authentifizierungsunterstützung vorhanden ist. Folglich können Sie nicht angeben, dass Sie das Kubernetes-Dashboard installieren möchten, wenn Sie ein Cluster mit der Konsole erstellen. Wenn Sie das Kubernetes-Dashboard installieren möchten, erstellen Sie das Cluster mit der API, und setzen Sie das Attribut isKubernetesDashboardEnabled auf "true".
Wenn Sie das Kubernetes-Dashboard installieren, wird empfohlen, den Zugriff innerhalb des Clusters einzuschränken, anstatt es extern über einen Load Balancer oder einen Ingress-Controller zugänglich zu machen. Das Kubernetes-Dashboard ist ein häufiger Angriffsvektor, um sich Zugang zu einem Kubernetes-Cluster zu verschaffen.
Um das Kubernetes-Dashboard-Add-on für ein vorhandenes Cluster zu deaktivieren, wenden Sie sich an Oracle Support.