CIS-Härtungsleitfaden
Dieses Dokument bietet verbindliche Anleitungen zur Härtung einer Produktionsinstallation von SUSE® Rancher Prime: RKE2. Es skizziert die Konfigurationen und Kontrollen, die erforderlich sind, um die Kubernetes-Benchmark-Kontrollen des Center for Internet Security (CIS) zu erfüllen.
Für weitere Details zur Bewertung eines gehärteten Clusters anhand des offiziellen CIS-Benchmarks verweisen Sie bitte auf den entsprechenden CIS-Selbstbewertungsleitfaden:
-
CIS Selbstbewertungsleitfaden v1.11 für RKE2 v1.29 und neuer
-
CIS Selbstbewertungsleitfaden v1.10 für RKE2 v1.29-v1.31
-
CIS Selbstbewertungsleitfaden v1.9 für RKE2 v1.27-v1.29
RKE2 ist so konzipiert, dass es "standardmäßig gehärtet" ist und die Mehrheit der Kubernetes CIS-Kontrollen ohne Modifikation besteht. Es gibt einige bemerkenswerte Ausnahmen, die eine manuelle Intervention erfordern, um den CIS-Benchmark vollständig zu bestehen:
-
RKE2 wird das Host-Betriebssystem nicht modifizieren. Daher müssen Sie, der Betreiber, einige Änderungen auf Host-Ebene vornehmen.
-
Bestimmte CIS-Kontrollen für Netzwerkrichtlinien und Pod-Sicherheitsstandards (oder Pod-Sicherheitsrichtlinien (PSP) in RKE2-Versionen vor v1.25) schränken die Funktionalität des Clusters ein. Sie müssen sich dafür entscheiden, dass RKE2 diese für Sie konfiguriert. Um sicherzustellen, dass diese Anforderungen erfüllt werden, kann RKE2 mit dem
profile-Flag gestartet werden, das aufcisodercis-1.23gesetzt ist, je nach RKE2-Version.
|
Dieser Leitfaden geht davon aus, dass RKE2 installiert wurde, aber noch nicht läuft. Wenn Sie RKE2 bereits gestartet haben, müssen Sie den RKE2-Dienst beenden. |
Anforderungen auf Host-Ebene
Es gibt drei Bereiche von Anforderungen auf Host-Ebene: Kernel-Parameter, kubelets protect-kernel-defaults und die Konfiguration des etcd-Prozesses/-Verzeichnisses. Diese werden in diesem Abschnitt skizziert.
Kernel-Parameter
Der CIS-Benchmark erfordert die Konfiguration bestimmter spezifischer Kernel-Parameter. Wenn RKE2 installiert ist, erstellt es eine sysctl-Konfigurationsdatei, um die erforderlichen Parameter entsprechend festzulegen. Es konfiguriert jedoch nicht automatisch den Host, um diese Konfiguration zu verwenden. Sie müssen dies manuell tun. Der Speicherort der Konfigurationsdatei hängt von der verwendeten Installationsmethode ab.
Wenn RKE2 über RPM, YUM oder DNF (die Standardmethode auf Betriebssystemen, die RPMs verwenden, wie CentOS) installiert wurde, führen Sie die folgenden Befehle aus:
sudo cp -f /usr/share/rke2/rke2-cis-sysctl.conf /etc/sysctl.d/60-rke2-cis.conf
sudo systemctl restart systemd-sysctl
Wenn RKE2 über das Tarball (die Standardmethode auf Betriebssystemen, die keine RPMs verwenden, wie Ubuntu) installiert wurde, führen Sie die folgenden Befehle aus:
sudo cp -f /usr/local/share/rke2/rke2-cis-sysctl.conf /etc/sysctl.d/60-rke2-cis.conf
sudo systemctl restart systemd-sysctl
Wenn Ihr System das Verzeichnis systemd-sysctl.service und/oder das Verzeichnis /etc/sysctl.d nicht hat, sollten Sie sicherstellen, dass die Sysctls beim Booten angewendet werden, indem Sie den folgenden Befehl beim Start ausführen:
sudo sysctl -p /usr/local/share/rke2/rke2-cis-sysctl.conf
Bitte führen Sie diesen Schritt nur bei frischen Installationen durch, bevor Sie RKE2 tatsächlich verwenden, um Kubernetes bereitzustellen. Viele Kubernetes-Komponenten, einschließlich CNI-Plugins, richten ihre eigenen Sysctls ein. Das Neustarten des systemd-sysctl-Dienstes in einem laufenden Kubernetes-Cluster kann unerwartete Nebenwirkungen haben.
Kubelet-Parameter protect-kernel-defaults ist auf true gesetzt.
Dies ist ein Kubelet-Flag, das dazu führt, dass das Kubelet beendet wird, wenn die erforderlichen Kernel-Parameter nicht gesetzt sind oder auf Werte gesetzt sind, die von den Standardwerten des Kubelets abweichen.
RKE2 wird das Flag automatisch auf true setzen, wenn das Flag profile gesetzt ist.
|
|
RKE2 wird auch die gleichen Kernel-Parameter überprüfen, die das Kubelet überprüft, und mit einem Fehler beenden, der den gleichen Regeln wie das Kubelet folgt. Dies geschieht zur Erleichterung, um dem Betreiber zu helfen, schneller und einfacher zu erkennen, welche Kernel-Parameter die Kubelet-Standardeinstellungen verletzen.
etcd ist ordnungsgemäß konfiguriert.
Der CIS-Benchmark verlangt, dass das etcd-Datenverzeichnis dem Benutzer und der Gruppe etcd gehört. Dies erfordert implizit, dass der etcd-Prozess als der Hostbenutzer etcd ausgeführt wird. Um dies zu erreichen, unternimmt RKE2 mehrere Schritte, wenn es mit einem gültigen cis oder cis-1.XX Profil gestartet wird:
-
Überprüfen Sie, ob der Benutzer und die Gruppe
etcdauf dem Host existieren. Wenn nicht, beenden Sie mit einem Fehler. -
Erstellen Sie das Datenverzeichnis von etcd mit
etcdals Benutzer- und Gruppenbesitzer. -
Stellen Sie sicher, dass der etcd-Prozess als Benutzer und Gruppe
etcdausgeführt wird, indem Sie dasSecurityContextdes statischen Pods von etcd entsprechend einstellen.
In einigen Linux-Distributionen wird der Befehl useradd keine Gruppe erstellen. Das -U-Flag ist unten aufgeführt, um dies zu berücksichtigen. Dieses Flag weist useradd an, eine Gruppe mit demselben Namen wie der Benutzer zu erstellen.
sudo useradd -r -c "etcd user" -s /sbin/nologin -M etcd -U
|
Der Benutzer und die Gruppe |
RKE2-Konfiguration
-
v1.29 und neuer
-
v1.25 - v1.28
-
v1.24 und älter
profile: "cis"
# For cis-1.11 only, not needed on cis-1.9/cis-1.10
kube-apiserver-arg:
- 'service-account-extend-token-expiration=false'
Allgemeine CIS-Konfiguration
profile: "cis"
Die Verwendung des allgemeinen cis-Profils stellt sicher, dass der Cluster den CIS-Benchmark (rke2-cis-1.XX-Profil-hardened) besteht, der mit der Kubernetes-Version verbunden ist, die RKE2 ausführt. Zum Beispiel wird RKE2 v1.26.XX mit dem profile: cis den rke2-cis-1.8-profile-hardened in Rancher bestehen.
Die Verwendung des allgemeinen cis-Profils stellt sicher, dass Upgrades auf RKE2 keine Änderung der bestehenden Konfiguration erfordern. Alle notwendigen Änderungen, um den anwendbaren CIS-Benchmark zu bestehen, werden automatisch angewendet.
Eine grobe Zuordnung der RKE2-Versionen zu den CIS-Benchmark-Versionen ist wie folgt:
RKE2 Minors |
Anwendbarer CIS-Benchmark |
Profil-Flag |
1.27-1.28 |
1.9 |
|
1.26 |
1.8 |
|
1.25 |
1.7 |
|
1.24 |
1.24 |
|
1.23 |
1.23 |
|
1.19-1.22 |
1.6 |
|
profile: "cis-1.23"
Die Konfigurationsdatei muss config.yaml heißen und in /etc/rancher/rke2 platziert werden. Das Verzeichnis muss vor der Installation von RKE2 erstellt werden.
Wenn das profile Flag gesetzt ist, geschieht Folgendes:
-
v1.25 und neuer
-
v1.24 und älter
-
Überprüft, ob die Anforderungen auf Host-Ebene erfüllt sind. Wenn dies nicht der Fall ist, wird RKE2 mit einem fatalen Fehler beendet, der die nicht erfüllten Anforderungen beschreibt.
-
Konfiguriert den etcd-statischen Pod so, dass er als etcd-Benutzer und -Gruppe ausgeführt wird, wie im etcd-Härtungsleitfaden erläutert.
-
Wendet Netzwerkrichtlinien an, die es dem Cluster ermöglichen, die zugehörigen Kontrollen zu bestehen.
-
Wendet restriktivere Dateiberechtigungen (600 vs. 644) auf Agenten-Manifeste und andere Konfigurationsdateien an.
-
Konfiguriert den Pod-Sicherheits-Zulassungscontroller, um den eingeschränkten Modus in allen Namespaces durchzusetzen, mit Ausnahme der Namespaces
kube-system,cis-operator-systemundtigera-operator. Diese Namespaces sind ausgenommen, um System-Pods zu ermöglichen, ohne Einschränkungen zu laufen, was für den ordnungsgemäßen Betrieb des Clusters erforderlich ist. Für weitere Informationen zur PSA-Konfiguration siehe die Standard-Pod-Sicherheitszulassungs-Konfigurationen. Für weitere Informationen zu Pod-Sicherheitsstandards verweisen Sie bitte auf die offizielle Dokumentation.
-
Überprüft, ob die Anforderungen auf Host-Ebene erfüllt sind. Wenn dies nicht der Fall ist, wird RKE2 mit einem fatalen Fehler beendet, der die nicht erfüllten Anforderungen beschreibt.
-
Wendet Netzwerkrichtlinien an, die es dem Cluster ermöglichen, die zugehörigen Kontrollen zu bestehen.
-
Konfiguriert Laufzeit-Pod-Sicherheitsrichtlinien, die es dem Cluster ermöglichen, die zugehörigen Kontrollen zu bestehen.
Kubernetes-Laufzeitanforderungen
Die Laufzeitanforderungen, um den CIS-Benchmark zu bestehen, konzentrieren sich auf Pod-Sicherheit und Netzwerkrichtlinien. Der Großteil davon wird automatisch von RKE2 behandelt, wenn ein gültiges cis-1.XX Profil verwendet wird, aber einige zusätzliche Eingriffe des Betreibers sind erforderlich.
Podsicherheit
RKE2 läuft immer mit einem gewissen Maß an Pod-Sicherheit.
-
v1.25 und neuer
-
v1.24 und älter
In v1.25 und neuer werden Pod-Sicherheitszulassungen (PSA) für die Podsicherheit verwendet. Eine Standard-Konfigurationsdatei für die Pod-Sicherheitszulassung wird beim Start des Clusters wie folgt hinzugefügt:
Mit dem cis/cis-1.23 Profil:
-
RKE2 wird einen eingeschränkten Pod-Sicherheitsstandard über eine Konfigurationsdatei anwenden, die den
restrictedModus im gesamten Cluster durchsetzt, mit Ausnahme derkube-system,cis-operator-systemundtigera-operatorNamespaces, um den erfolgreichen Betrieb der System-Pods sicherzustellen.
Ohne das cis/cis-1.23 Profil:
-
RKE2 wird einen uneingeschränkten Pod-Sicherheitsstandard über eine Konfigurationsdatei anwenden, die den
privilegedModus im gesamten Cluster durchsetzt, was einen völlig uneingeschränkten Modus für alle Pods im Cluster ermöglicht. Siehe die Pod-Sicherheitsrichtlinien-Seite für weitere Details.
In v1.24 und älteren Versionen ist der PodSecurityPolicy Zulassungscontroller immer aktiviert. Eine Richtlinie wird basierend auf dem Profil angewendet, das an RKE2 übergeben wird.
Mit dem cis-1.6 Profil:
-
RKE2 wird eine viel restriktivere Reihe von Richtlinien einführen. Diese Richtlinien erfüllen die Anforderungen, die in Abschnitt 5.2 des CIS-Benchmarks dargelegt sind.
Ohne das cis-1.6 Profil:
-
RKE2 wird eine uneingeschränkte Richtlinie einführen, die es Kubernetes ermöglicht, so zu arbeiten, als ob der
PodSecurityPolicyZulassungscontroller nicht aktiviert wäre. Siehe die Pod-Sicherheitsrichtlinien-Seite für weitere Details.
|
Die Komponenten des Kubernetes-Steuerungssystems und kritische Ergänzungen wie CNI, DNS und Ingress werden als Pods im |
Netzwerkrichtlinien
Wenn mit einem gültigen "cis-1.XX" Profil ausgeführt, wird RKE2 NetworkPolicies einführen, das den CIS-Benchmark für die integrierten Namespaces von Kubernetes besteht. Diese Namespaces sind: kube-system, kube-public und default.
Das verwendete NetworkPolicy wird nur Pods innerhalb desselben Namespaces erlauben, miteinander zu kommunizieren. Es gibt einige bemerkenswerte Ausnahmen, zum Beispiel dass DNS-Anfragen aufgelöst werden dürfen.
-
DNS-Anfragen dürfen den DNS-Server erreichen.
-
HTTP/s-Anfragen dürfen den ingress-nginx-Dienst erreichen.
-
HTTPs-Anfragen dürfen den metrics-server erreichen.
-
Anfragen an das Ingress-NGINX-Webhook auf dem angegebenen Pod durch den Ingress-NGINX-Pod (normalerweise 8443)
-
HTTPs-Anfragen an den RKE2-Snapshot-Validierungs-Webhook
|
Operator-Intervention erforderlich
Betreiber müssen Netzwerkrichtlinien wie gewohnt für zusätzliche erstellte Namespaces verwalten. |
Konfigurieren Sie das default Dienstkonto
|
Setzen Sie |
Kubernetes stellt ein default Dienstkonto zur Verfügung, das von Cluster-Workloads verwendet wird, bei denen kein spezifisches Dienstkonto dem Pod zugewiesen ist. Wo der Zugriff auf die Kubernetes-API von einem Pod erforderlich ist, sollte ein spezifisches Dienstkonto für diesen Pod erstellt und diesem Dienstkonto Rechte gewährt werden. Das default Dienstkonto sollte so konfiguriert werden, dass es kein Dienstkonto-Token bereitstellt und keine expliziten Rechtezuweisungen hat.
Für jeden Namespace, einschließlich default und kube-system bei einer Standard-RKE2-Installation, muss das default Dienstkonto diesen Wert enthalten:
automountServiceAccountToken: false
RKE2 wird den Wert automatisch korrekt für die Namespaces kube-system, cis-operator-system, kube-node-lease und tigera-operator setzen.
|
Operator-Intervention erforderlich
Für vom Cluster-Operator erstellte Namespaces kann das folgende Skript und die Konfigurationsdatei verwendet werden, um das Die folgende Konfiguration muss in einer Datei mit dem Namen
Erstellen Sie eine Bash-Skriptdatei mit dem Namen
Führen Sie dieses Skript aus, um die |
API-Server-Auditkonfiguration
Die CIS-Anforderungen 1.2.22 bis 1.2.25 beziehen sich auf die Konfiguration von Auditprotokollen für den API-Server. Wenn RKE2 mit dem gesetzten profile Flag gestartet wird, konfiguriert es automatisch gehärtete --audit-log- Parameter im API-Server, um diese CIS-Prüfungen zu bestehen.
Die Standard-Audit-Richtlinie von RKE2 ist so konfiguriert, dass Anfragen im API-Server nicht protokolliert werden. Dies geschieht, um den Cluster-Operatoren Flexibilität zu ermöglichen, eine Audit-Richtlinie anzupassen, die ihren Prüfungsanforderungen und -bedürfnissen entspricht, da diese spezifisch für die Umgebung und Richtlinien jedes Benutzers sind.
Eine Standard-Audit-Richtlinie wird von RKE2 erstellt, wenn es mit dem gesetzten profile Flag gestartet wird. Die Richtlinie ist in /etc/rancher/rke2/audit-policy.yaml definiert.
apiVersion: audit.k8s.io/v1
kind: Policy
metadata:
creationTimestamp: null
rules:
- level: None
|
Operator-Intervention erforderlich
Um das Protokollieren von Anfragen an den API-Server zu starten, muss mindestens der Parameter Nach der Anpassung der Audit-Richtlinie muss RKE2 neu gestartet werden, um die neue Konfiguration zu laden.
|
Die Audit-Protokolle des API-Servers werden in /var/lib/rancher/rke2/server/logs/audit.log geschrieben.
Bekannte Probleme
Die folgenden Kontrollen werden vom Standard-RKE2 derzeit nicht erfüllt. Jede Lücke wird erklärt und es wird erläutert, wie sie behoben wird.
Kontrolle 1.1.12
Stellen Sie sicher, dass der Eigentümer des etcd-Datenverzeichnisses auf etcd:etcd gesetzt ist.
Erläuterung
etcd ist ein hochverfügbarer Schlüssel-Wert-Speicher, der von Kubernetes-Implementierungen für die persistente Speicherung aller seiner REST-API-Objekte verwendet wird. Dieses Datenverzeichnis sollte vor unbefugtem Lesen oder Schreiben geschützt werden. Es sollte im Besitz von etcd:etcd sein.
bei Vorfällen
Dies kann behoben werden, indem ein etcd Benutzer und eine Gruppe erstellt werden, wie oben beschrieben.
Kontrolle 5.1.5
Stellen Sie sicher, dass Standard-Dienstkonten nicht aktiv verwendet werden.
Erläuterung
Kubernetes stellt ein default Dienstkonto zur Verfügung, das von Cluster-Workloads verwendet wird, bei denen kein spezifisches Dienstkonto dem Pod zugewiesen ist.
Wo der Zugriff auf die Kubernetes-API von einem Pod erforderlich ist, sollte ein spezifisches Dienstkonto für diesen Pod erstellt und diesem Dienstkonto Rechte gewährt werden.
Das default Dienstkonto sollte so konfiguriert sein, dass es kein Dienstkonto-Token bereitstellt und keine expliziten Rechtezuweisungen hat.
Dies kann behoben werden, indem das automountServiceAccountToken Feld auf false für das default Dienstkonto in jedem Namespace aktualisiert wird.
Fazit
Wenn Sie diese Anleitung befolgt haben, wird Ihr RKE2-Cluster so konfiguriert sein, dass er den CIS Kubernetes Benchmark besteht. Sie können unsere CIS-Selbstbewertungsleitfäden einsehen, um zu verstehen, wie wir jeden der Benchmarks überprüft haben und wie Sie dasselbe in Ihrem Cluster tun können.