This guide helps you evaluate the security of a Kubernetes cluster created using KKP against each control in the CIS Kubernetes Benchmark.
Please note: It is impossible to inspect the master nodes of managed clusters since from within the cluster(kubeconfig) one does not have access to such nodes. So for KKP, we can only check the worker nodes.
This guide corresponds to the following versions of KKP, CIS Benchmarks, and Kubernetes:
| KKP Version | Kubernetes Version | CIS Benchmark Version |
|---|---|---|
| 2.28.3 | 1.33.5 | CIS-1.23 |
Trivy was used to run the benchmark.
trivy k8s --compliance=k8s-cis-1.23 --report summary --timeout=1h --tolerations node-role.kubernetes.io/control-plane="":NoSchedule
Summary Report for compliance: CIS Kubernetes Benchmarks v1.23
Each control in the CIS Kubernetes Benchmark was evaluated. These are the possible results for each control:
🟢 Pass: The cluster passes the audit/control outlined in the benchmark.
🔵 Pass (Additional Configuration Required): The cluster passes the audit/control outlined in the benchmark with some extra configuration. The documentation is provided.
🔴 Fail: The audit/control will be fixed in a future KKP release.
Severity: HIGH
Result: 🟢 Pass
Severity: HIGH
Result: 🟢 Pass
Severity: HIGH
Result: 🟢 Pass
Severity: HIGH
Result: 🟢 Pass
Severity: HIGH
Result: 🟢 Pass
Severity: HIGH
Result: 🟢 Pass
Severity: CRITICAL
Result: 🟢 Pass
Severity: CRITICAL
Result: 🟢 Pass
Severity: HIGH
Result: 🟢 Pass
Severity: HIGH
Result: 🟢 Pass
Severity: CRITICAL
Result: 🟢 Pass
Severity: CRITICAL
Result: 🟢 Pass
Severity: CRITICAL
Result: 🟢 Pass
Severity: HIGH
Result: 🟢 Pass
Severity: HIGH
Result: 🟢 Pass
Severity: HIGH
Result: 🟢 Pass
Severity: HIGH
Result: 🟢 Pass
Severity: HIGH
Result: 🔵 Expected Fail (Architectural Requirement)
The --hostname-override flag is used to ensure consistent node naming across all cloud providers, matching the KKP machine deployment naming pattern. This is required for proper node identification by Cloud Controller Managers.
Severity: HIGH
Result: 🟢 Pass
Severity: CRITICAL
Result: 🟢 Pass
Severity: CRITICAL
Result: 🟢 Pass
Severity: CRITICAL
Result: 🟢 Pass
Severity: CRITICAL
Result: 🟢 Pass
KKP user clusters have specific RBAC configurations that are required for cluster operation. The following controls show failures due to architectural decisions that enable multi-cloud support in the clusters.
Severity: HIGH
Result: 🔵 Expected Fail (Architectural Requirement)
The following ClusterRoleBindings to cluster-admin are present by design:
cluster-admin - Default Kubernetes binding for system:masters groupcloud-controller-manager - Required for cloud provider integration (multiple cloud providers).<cluster-id>:cluster-admin - KKP cluster owner access.Severity: HIGH
Result: 🔵 Expected Fail (Architectural Requirement)
KKP cluster owners and editors have full access to secrets as part of their administrative role. This is by design to allow cluster management.
Severity: HIGH
Result: 🔵 Expected Fail (Architectural Requirement)
KKP uses wildcard permissions for cluster owners (system:kubermatic:owners) and editors (system:kubermatic:editors) ClusterRoles. This is an intentional design decision to provide full cluster management capabilities to authorized users.
Severity: HIGH
Result: 🟢 Pass
Severity: HIGH
Result: 🟢 Pass
KKP applies Pod Security Admission (PSA) labels to user cluster namespaces to enforce security standards:
Privileged System Namespaces:
| Namespace | enforce | audit | warn | Description |
|---|---|---|---|---|
| kube-system | privileged | baseline | privileged | Kubernetes core components (CNI, CSI, node-local-dns) |
| kube-public | privileged | baseline | privileged | Kubernetes public resources |
| kube-node-lease | privileged | baseline | privileged | Node heartbeat leases |
| cloud-init-settings | privileged | baseline | privileged | KKP cloud-init configuration |
Namespaces using baseline enforcement:
| Namespace | enforce | audit | warn | Description |
|---|---|---|---|---|
| default | baseline | baseline | baseline | User workloads |
| kubernetes-dashboard | baseline | baseline | baseline | KKP dashboard service |
Privileged system namespaces contain components (CNI, CSI, node-local-dns) that need hostNetwork, hostPath volumes, and elevated capabilities to function. Baseline-enforced namespaces block dangerous pod configurations while allowing standard workloads.
To verify compliance for namespaces using baseline enforcement:
trivy k8s --include-namespaces default,kubernetes-dashboard --compliance=k8s-cis-1.23 --report summary
Severity: HIGH
Result: 🔵 Pass (Baseline-Enforced Namespaces) / Expected Fail (Privileged System Namespaces)
Baseline-enforced namespaces (default, kubernetes-dashboard) block privileged containers. Privileged system namespaces need it for CNI (cilium), CSI drivers, and node-local-dns.
Severity: HIGH
Result: 🟢 Pass
Severity: HIGH
Result: 🟢 Pass
Severity: HIGH
Result: 🔵 Pass (Baseline-Enforced Namespaces) / Expected Fail (Privileged System Namespaces)
Baseline-enforced namespaces block hostNetwork. Privileged system namespaces need hostNetwork for CNI (cilium) and node-local-dns.
Severity: HIGH
Result: 🔵 Pass (Baseline-Enforced Namespaces) / Expected Fail (Privileged System Namespaces)
Workloads in baseline-enforced namespaces (dashboard-metrics-scraper) set allowPrivilegeEscalation: false. Components in privileged system namespaces require privilege escalation.
Severity: MEDIUM
Result: 🔵 Pass (Baseline-Enforced Namespaces) / Expected Fail (Privileged System Namespaces)
Workloads in baseline-enforced namespaces set runAsNonRoot: true and run as non-root users. Components in privileged system namespaces run as root.
Severity: MEDIUM
Result: 🔵 Pass (Baseline-Enforced Namespaces) / Expected Fail (Privileged System Namespaces)
Baseline-enforced namespaces drop NET_RAW. Components in privileged system namespaces (CNI) require this capability.
Severity: LOW
Result: 🔵 Pass (Baseline-Enforced Namespaces) / Expected Fail (Privileged System Namespaces)
Workloads in baseline-enforced namespaces drop all capabilities with capabilities.drop: ["ALL"]. Components in privileged system namespaces require various capabilities.
Severity: LOW
Result: 🔵 Pass (Baseline-Enforced Namespaces) / Expected Fail (Privileged System Namespaces)
Workloads in baseline-enforced namespaces drop all capabilities. Components in privileged system namespaces require various capabilities.
Severity: MEDIUM
Result: 🟢 Pass
Severity: MEDIUM
Result: 🔵 Pass (Baseline-Enforced Namespaces) / Expected Fail (Privileged System Namespaces)
Baseline-enforced namespaces do not use hostPath volumes. Components in privileged system namespaces (CNI, CSI) require hostPath for node-level operations.
Severity: MEDIUM
Result: 🔵 Pass (Baseline-Enforced Namespaces) / Expected Fail (Privileged System Namespaces)
Baseline-enforced namespaces do not use hostPorts. Components in privileged system namespaces require hostPorts.
Severity: MEDIUM
Result: Manual check required
Severity: MEDIUM
Result: 🟢 Pass
Severity: MEDIUM
Result: Manual check required
Severity: MEDIUM
Result: Manual check required
Severity: MEDIUM
Result: Manual check required
Severity: MEDIUM
Result: Manual check required
Severity: MEDIUM
Result: 🟢 Pass
Severity: HIGH
Result: 🔵 Pass (Baseline-Enforced Namespaces) / Expected Fail (Privileged System Namespaces)
Workloads in baseline-enforced namespaces (default, kubernetes-dashboard) have security contexts applied with runAsNonRoot, allowPrivilegeEscalation: false, and capabilities dropped. Components in privileged system namespaces require elevated privileges.
Severity: MEDIUM
Result: 🟢 Pass