This guide helps you evaluate the security of a Kubernetes cluster created using KubeOne against each control in the CIS Kubernetes Benchmark.
This guide corresponds to the following versions of KubeOne, CIS Benchmarks, and Kubernetes:
| KubeOne Version | Kubernetes Version | CIS Benchmark Version |
|---|---|---|
| 1.11.2 | 1.33.4 | 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 KubeOne 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: HIGH
Result: 🟢 Pass
Severity: HIGH
Result: 🟢 Pass
Severity: HIGH
Result: 🟢 Pass
Severity: HIGH
Result: 🟢 Pass
Severity: HIGH
Result: 🟢 Pass
Severity: LOW
Result: 🔴 Fail
Details: KubeOne inherits kubeadm local-etcd defaults, where /var/lib/etcd is created with root:root ownership instead of etcd:etcd, so this control remains a documented CIS hardening gap.
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: CRITICAL
Result: 🟢 Pass
Severity: CRITICAL
Result: 🟢 Pass
Severity: CRITICAL
Result: 🟢 Pass
Severity: MEDIUM
Result: 🔴 Fail
Details: KubeOne currently relies on unauthenticated API server health checks on /healthz, so this control remains a documented hardening gap.
Severity: LOW
Result: 🟢 Pass
Severity: LOW
Result: 🟢 Pass
Severity: LOW
Result: 🟢 Pass
Severity: HIGH
Result: 🟢 Pass
Severity: HIGH
Result: 🟢 Pass
Severity: LOW
Result: 🟢 Pass
Severity: HIGH
Result: 🟢 Pass
Severity: HIGH
Result: 🟢 Pass
Severity: HIGH
Result: 🔵 Pass (Additional Configuration Required)
Details: EventRateLimit is not enabled by default. It can be enabled in the KubeOne manifest with features.eventRateLimit.enable: true and features.eventRateLimit.config.configFilePath.
Severity: LOW
Result: 🟢 Pass
Severity: MEDIUM
Result: 🔵 Pass (Additional Configuration Required)
Details: AlwaysPullImages is not enabled by default. It can be enabled in the KubeOne manifest with features.alwaysPullImages.enable: true.
Severity: MEDIUM
Result: 🟢 Pass
Severity: LOW
Result: 🟢 Pass
Severity: LOW
Result: 🟢 Pass
Severity: LOW
Result: 🟢 Pass
Severity: HIGH
Result: 🟢 Pass
Severity: LOW
Result: 🟢 Pass
Severity: LOW
Result: 🔵 Pass (Additional Configuration Required)
Details: Audit logging is not enabled by default, it can be configured as described here
Severity: LOW
Result: 🔵 Pass (Additional Configuration Required)
Details: Audit logging is not enabled by default, it can be configured as described here
Severity: LOW
Result: 🔵 Pass (Additional Configuration Required)
Details: Audit logging is not enabled by default, it can be configured as described here
Severity: LOW
Result: 🔵 Pass (Additional Configuration Required)
Details: Audit logging is not enabled by default, it can be configured as described here
Severity: LOW
Result: 🟢 Pass
Severity: LOW
Result: 🟢 Pass
Severity: LOW
Result: 🟢 Pass
Severity: MEDIUM
Result: 🟢 Pass
Severity: LOW
Result: 🟢 Pass
Severity: LOW
Result: 🟢 Pass
Severity: LOW
Result: 🔵 Pass (Additional Configuration Required)
Details: Encryption configuration can be enabled as described here
Severity: MEDIUM
Result: 🟢 Pass
Severity: MEDIUM
Result: 🟢 Pass
Severity: MEDIUM
Result: 🟢 Pass
Severity: MEDIUM
Result: 🟢 Pass
Severity: MEDIUM
Result: 🟢 Pass
Severity: LOW
Result: 🟢 Pass
Severity: MEDIUM
Result: 🟢 Pass
Severity: CRITICAL
Result: 🟢 Pass
Severity: MEDIUM
Result: 🟢 Pass
Severity: CRITICAL
Result: 🟢 Pass
Severity: CRITICAL
Result: 🟢 Pass
Severity: CRITICAL
Result: 🟢 Pass
Severity: CRITICAL
Result: 🟢 Pass
Severity: HIGH
Result: 🟢 Pass
Severity: HIGH
Result: 🔵 Pass (Additional Configuration Required)
Details: KubeOne can be configured with OIDC authentication as described here
Severity: HIGH
Result: 🔵 Pass (Additional Configuration Required)
Details: Audit logging is not enabled by default, it can be configured as described here
Severity: HIGH
Result: 🔵 Pass (Additional Configuration Required)
Details: Audit logging is not enabled by default, it can be configured as described here
Severity: HIGH
Result: 🔵 Pass (Expected Cluster-Level Result)
Details: This control passes on control-plane nodes and fails only on static worker nodes, where kubeadm-created kubelet systemd drop-ins such as 10-kubeadm.conf keep 0644 permissions.
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 (Expected Cluster-Level Result)
Details: This control passes on control-plane nodes and fails only on static worker nodes, where Trivy reports /var/lib/kubelet/config.yaml with 0644 permissions.
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: 🔵 Pass (Expected Cluster-Level Result)
Details: KubeOne-managed nodes set this argument as part of OSM node identity handling, so this control is expected to be reported by the cluster-wide scan.
Severity: HIGH
Result: 🟢 Pass
Severity: CRITICAL
Result: 🔵 Pass (Expected Cluster-Level Result)
Details: KubeOne configures kubelet serving certificates through bootstrap with serverTLSBootstrap: true.
Severity: CRITICAL
Result: 🟢 Pass
Severity: CRITICAL
Result: 🟢 Pass
Severity: CRITICAL
Result: 🟢 Pass
Severity: HIGH
Result: 🔵 Pass (Expected Behavior)
Severity: HIGH
Result: 🔵 Pass (Expected Behavior)
Severity: HIGH
Result: 🔵 Pass (Expected Behavior)
Severity: HIGH
Result: 🟢 Pass
Severity: HIGH
Result: 🟢 Pass
The controls in this section are evaluated against the entire cluster. In a default KubeOne architecture, that includes kube-system workloads and static control-plane pods, so some results reflect required system components rather than user-workload policy.
Severity: HIGH
Result: 🔵 Pass (Expected Cluster-Level Result)
Details: This cluster-level result is driven by privileged system components such as canal, kube-proxy, and CSI node plugins.
Severity: HIGH
Result: 🟢 Pass
Severity: HIGH
Result: 🟢 Pass
Severity: HIGH
Result: 🔵 Pass (Expected Cluster-Level Result)
Details: This cluster-level result is driven by system networking and control-plane components that run with hostNetwork, including canal, kube-proxy, node-local-dns, and static control-plane pods.
Severity: HIGH
Result: 🔵 Pass (Expected Cluster-Level Result)
Details: This cluster-level result is reported for a mix of kube-system and static control-plane components that Trivy evaluates together under this control.
Severity: MEDIUM
Result: 🔵 Pass (Expected Cluster-Level Result)
Details: This cluster-level result is reported for system components in kube-system and the static control plane, some of which run as root or use upstream-default runtime users.
Severity: MEDIUM
Result: 🔵 Pass (Expected Cluster-Level Result)
Details: This cluster-level result is reported for DNS and networking components that Trivy flags under this capability control, including node-local-dns and coredns.
Severity: LOW
Result: 🔵 Pass (Expected Cluster-Level Result)
Details: This cluster-level result is reported for networking, storage, and control-plane components that retain additional Linux capabilities in their rendered manifests.
Severity: LOW
Result: 🔵 Pass (Expected Cluster-Level Result)
Details: This cluster-level result is reported for system components that retain explicitly assigned capabilities in support of networking, storage, DNS, or control-plane functions.
Severity: MEDIUM
Result: 🟢 Pass
Severity: MEDIUM
Result: 🔵 Pass (Expected Cluster-Level Result)
Details: This cluster-level result is driven by CNI, CSI, DNS, and control-plane components that mount hostPath volumes for node-level configuration, manifests, certificates, or socket access.
Severity: MEDIUM
Result: 🟢 Pass
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 (Expected Cluster-Level Result)
Details: This cluster-level result is reported for system components in kube-system and static control-plane pods that do not all declare an explicit seccomp profile in their rendered manifests.
Severity: HIGH
Result: 🔵 Pass (Expected Cluster-Level Result)
Details: This cluster-level result is reported for system components that use security-context exceptions or inherit upstream runtime defaults in kube-system and the control plane.
Severity: MEDIUM
Result: 🟢 Pass