Ein Upgrade auf Kubernetes 1.36 betrifft nicht nur API-Kompatibilität, Control-Plane-Komponenten und Node-Images. Vor dem Rollout solltest Du RBAC, Pod-Isolation, Admission-Regeln und Cloud-Identity gezielt prüfen. Besonders relevant ist das, wenn Dein Cluster Prometheus, Fluent Bit, OpenTelemetry Collector, AWS-Controller oder eigene Plattform-Operatoren nutzt: Diese Komponenten arbeiten häufig mit weitreichenden Service-Account-Rechten.
Warum Kubernetes 1.36 Security auf Deine Roadmap gehört
Behandle Kubernetes 1.36 Security als eigenes Arbeitspaket im Upgrade-Plan. Die wichtigsten Kontrollfragen sind konkret: Welche Service-Accounts dürfen Kubelet-Endpunkte lesen? Welche Pods laufen weiterhin mit Host-UIDs? Welche Defaults ergänzt Admission-Control? Welche AWS-Rechte hängen an Kubernetes-Service-Accounts?
Prüfe vor dem Upgrade die Release Notes Deiner Kubernetes-Distribution und Deiner Managed-Kubernetes-Plattform. Nicht jedes Feature ist in jedem Cluster automatisch aktiv; Feature-Gates, API-Versionen und Default-Werte können sich zwischen Upstream-Kubernetes, EKS, AKS, GKE und selbst betriebenen Clustern unterscheiden.
Wenn Dein Team Runbooks, Pod Security Admission und API-Server-Mechanismen gemeinsam nachvollziehen soll, passen Grundlagen aus Cloud-Native-Schulungen und IT-Security-Schulungen als Ergänzung zur praktischen Upgrade-Vorbereitung.
Kubelet RBAC nodes/proxy prüfen und breite Rechte ersetzen
Die Kubelet-API ist sicherheitskritisch, weil sie je nach Endpunkt Pod-Informationen, Node-Metriken, Container-Logs und Zugriffspfade im Umfeld laufender Container bereitstellt. Ein pauschales nodes/proxy in ClusterRoles gibt Monitoring- und Observability-Komponenten oft mehr Zugriff, als sie für Scraping, Health Checks oder Log-Abfragen benötigen.
Prüfe, ob Dein Kubernetes-1.36-Cluster feinere Kubelet-Subresources unterstützt und welche Defaults Deine Distribution setzt. Ersetze nodes/proxy dort durch gezieltere Rechte wie nodes/metrics, nodes/stats oder nodes/log, wo die jeweilige Komponente nur diese Endpunkte benötigt. Behalte nodes/proxy nur für begründete Ausnahmefälle bei und dokumentiere den Owner.
kubectl get clusterroles -o yaml | grep -n 'nodes/proxy' -B 6 -A 10
kubectl get clusterrolebindings -o wide
kubectl get rolebindings -A -o wide
kubectl auth can-i get nodes/proxy --as system:serviceaccount:observability:prometheus
kubectl auth can-i get nodes/metrics --as system:serviceaccount:observability:prometheus
Praktische Kubelet-RBAC-Checkliste
- Identifiziere alle ClusterRoles mit
nodes/proxyund notiere die gebundenen Service-Accounts. - Ordne jeden Service-Account einem Anwendungsfall zu, zum Beispiel Prometheus-Scraping, Node-Log-Sammlung, Debugging-Tool oder Plattform-Operator.
- Ersetze breite Regeln durch gezielte Subresources wie
nodes/metricsundnodes/stats, wenn die Komponente nur Metriken liest. - Teste nach der Änderung Dashboards, Alert-Regeln, Log-Pipelines und Scrape-Targets, bevor Du die alte Rolle entfernst.
- Lege für verbleibende
nodes/proxy-Rechte ein Ablaufdatum oder einen Review-Termin fest.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: observability-kubelet-read
rules:
- apiGroups: ['']
resources: ['nodes/metrics', 'nodes/stats']
verbs: ['get']
Für Teams mit eigenen Metrik-Pipelines sind Monitoring- und Logging-Schulungen eine sinnvolle Ergänzung, wenn Prometheus-Rechte, Log-Sammler und Alerting-Regeln gemeinsam mit RBAC-Änderungen getestet werden.
Kubernetes User-Namespaces aktivieren und Grenzen dokumentieren
Kubernetes User-Namespaces trennen Container-UIDs von Host-UIDs. Dadurch ist ein Prozess, der im Container mit UID 0 läuft, nicht automatisch UID 0 auf dem Node. Für Pods mit User-Namespaces setzt Du in der Pod-Spezifikation hostUsers: false. Prüfe zusätzlich mit kubectl explain pod.spec.hostUsers, wie Deine Cluster-Version das Feld beschreibt.
apiVersion: v1
kind: Pod
metadata:
name: userns-smoke-test
spec:
hostUsers: false
securityContext:
runAsNonRoot: true
runAsUser: 1000
seccompProfile:
type: RuntimeDefault
containers:
- name: app
image: registry.example.com/app:1.0
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: ['ALL']
Führe den Rollout nicht nur mit einem Hello-World-Pod durch. Teste repräsentative Workloads mit emptyDir, ConfigMaps, Secrets, CSI-PersistentVolumes, fsGroup, Init-Containern und Sidecars. Achte besonders auf Images, die beim Start chown oder chmod ausführen, feste UIDs erwarten oder Dateien in beschreibbaren Image-Pfaden ablegen.
User-Namespaces sind Defense-in-Depth gegen Container-Escape-Szenarien. Sie ersetzen keine gehärteten Images, kein Least-Privilege-RBAC, keine NetworkPolicies, keine saubere Service-Account-Trennung und keinen vorsichtigen Umgang mit HostPath- oder CSI-Volumes.
MutatingAdmissionPolicy CEL für sicherere Defaults nutzen
MutatingAdmissionPolicy mit CEL eignet sich für einfache, nachvollziehbare Mutationen direkt im API-Server. Damit kannst Du beispielsweise Standardwerte ergänzen, ohne für jede kleine Änderung einen eigenen Mutating-Webhook mit TLS-Zertifikat, Deployment, Service, Verfügbarkeitsregeln und Fehlerbehandlung zu betreiben. Prüfe vor der Nutzung die API-Version und den Reifegrad in Deiner Kubernetes-1.36-Distribution.
Typische Plattform-Regeln sind Default-Labels für Ownership, ein Default-seccompProfile, Namespace-basierte Guardrails und sichere Workload-Defaults für neu erstellte Pods. ValidatingAdmissionPolicy lehnt unerwünschte Spezifikationen ab, Pod Security Admission setzt Pod-Sicherheitsprofile auf Namespace-Ebene durch, und MutatingAdmissionPolicy ergänzt fehlende Felder vor der Validierung.
apiVersion: admissionregistration.k8s.io/v1
kind: MutatingAdmissionPolicy
metadata:
name: default-seccomp
spec:
matchConstraints:
resourceRules:
- apiGroups: ['']
apiVersions: ['v1']
operations: ['CREATE']
resources: ['pods']
mutations:
- patchType: ApplyConfiguration
applyConfiguration:
expression: >
Object{spec: Object.spec{securityContext: Object.spec.securityContext{seccompProfile: Object.spec.securityContext.seccompProfile{type: 'RuntimeDefault'}}}}
Ergänze dazu eine MutatingAdmissionPolicyBinding mit Namespace-Selector, zum Beispiel für Namespaces mit dem Label platform.example.com/baseline=restricted. Teste jede Policy mit kubectl apply --dry-run=server und einem repräsentativen Pod-Manifest, bevor Du sie in produktiven Namespaces bindest.
PodSecurityPolicy-Denken aus dem Cluster-Design entfernen
PodSecurityPolicy ist seit Kubernetes v1.25 entfernt. Alte Helm-Values, Runbooks und Audit-Skripte, die noch policy/v1beta1 PodSecurityPolicy referenzieren, beschreiben kein gültiges Sicherheitsmodell für Kubernetes 1.36.
| Mechanismus | Aufgabe im Cluster |
|---|---|
| Pod Security Admission | Namespace-basierte Pod-Sicherheitslevel wie restricted durchsetzen |
| ValidatingAdmissionPolicy | Unerwünschte API-Objekte mit CEL-Regeln ablehnen |
| MutatingAdmissionPolicy | Fehlende sichere Defaults vor der Persistierung ergänzen |
| OPA Gatekeeper oder Kyverno | Zusätzliche Policy-Workflows, Reports und organisationsweite Regeln abbilden |
Behandle die PSP-Ablösung als Upgrade-Aufgabe. Du aktualisierst nicht nur Binaries, sondern ersetzt veraltete Annahmen in Plattform-Dokumentation, CI-Audits, Helm-Charts und Incident-Runbooks.
EKS-Praxis: EKS Pod Identity Best Practices ohne Secrets
EKS Pod Identity ordnet IAM-Rollen Kubernetes-Service-Accounts zu. Ein Pod erhält temporäre AWS-Zugangsdaten über diese Zuordnung, statt statische AWS-Keys als Umgebungsvariablen oder Kubernetes-Secret im Container zu tragen. Für Teams mit EKS-Plattformen ergänzen Amazon Web Services (AWS) Schulungen die Arbeit an IAM-Rollen, Service-Accounts und Cluster-RBAC.
aws eks list-pod-identity-associations --cluster-name CLUSTERNAME
kubectl get serviceaccounts -A
kubectl get pods -A -o custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name,SA:.spec.serviceAccountName
- Verwende einen eigenen Service-Account pro Workload und Namespace, statt mehrere Anwendungen über denselben Account laufen zu lassen.
- Beschränke IAM-Policies auf konkrete AWS-APIs und Ressourcen-ARNs, zum Beispiel auf einen S3-Bucket-Prefix oder eine DynamoDB-Tabelle.
- Prüfe Namespace-Grenzen, damit ein Deployment in
devnicht den Service-Account einer Produktionsanwendung verwendet. - Reduziere unnötigen IMDS-Zugriff von Pods, ohne den EKS Pod Identity Agent zu blockieren.
- Erzwinge per Admission-Policy, dass Workloads mit AWS-Zugriff ein dokumentiertes Owner-Label und einen freigegebenen Service-Account nutzen.
Verbinde Cloud-Identity und Cluster-Identity im selben Review. Ein Kubernetes-RoleBinding, das Deployments ändern darf, entscheidet indirekt darüber, welchen Service-Account und damit welche IAM-Rolle ein Angreifer nach einem Namespace-Kompromiss verwenden könnte.
Manifest-basierte Admission Control vorsichtig testen
Wenn Deine Kubernetes-1.36-Release-Notes manifest-basierte Admission-Konfiguration als Alpha-Feature ausweisen, teste sie nur außerhalb der Produktion. Der API-Server lädt Admission-Konfigurationen dabei vor der Verarbeitung normaler API-Requests; eine fehlerhafte Konfiguration kann deshalb den Start des API-Servers verhindern.
Versioniere die Manifest-Dateien in Git, dokumentiere die verwendeten kube-apiserver-Flags und beschreibe einen Recovery-Pfad. Der Recovery-Pfad sollte enthalten, wie Du ungültige Admission-Manifeste entfernst, den API-Server neu startest und den letzten funktionierenden Stand wiederherstellst.
Deine Kubernetes 1.36 Security Upgrade Checklist
- Auditiere ClusterRoles, Roles, RoleBindings und ClusterRoleBindings auf breites
nodes/proxy. - Plane feinere Kubelet-Autorisierung für Monitoring-, Logging- und Observability-Komponenten.
- Teste Kubernetes User-Namespaces mit repräsentativen Workloads, Init-Containern, Sidecars und Volume-Typen.
- Führe MutatingAdmissionPolicy CEL für Default-Labels, Default-Security-Contexts und Namespace-Guardrails ein, sofern Deine Distribution die API unterstützt.
- Entferne PSP-Annahmen aus Dokumentation, Helm-Values, CI-Prüfungen und Runbooks.
- Prüfe EKS Pod Identity, Kubernetes-Service-Accounts, IAM-Policies und vorhandene Secrets mit AWS-Zugangsdaten.
- Kontrolliere NetworkPolicies, Image-Härtung,
automountServiceAccountTokenund Service-Account-Token-Exposition. - Rolle Security-Baselines mit Infrastructure as Code aus und vergleiche produktive Cluster regelmäßig gegen Git-Definitionen, um Drift zu erkennen.
Beginne mit einem Read-only-Audit von RBAC, Service-Accounts und Admission-Regeln. Danach testest Du Kubelet-RBAC-Änderungen, User-Namespaces und CEL-Policies in einem Staging-Cluster mit denselben Add-ons, die auch in Produktion laufen.