This page introduces the CIS Kubernetes Benchmark, provides an assessment, and explains what Google Distributed Cloud connected does to address the recommendations.
The CIS Benchmark
The Center for Internet Security (CIS) releases benchmarks for best practice security recommendations. The CIS Kubernetes Benchmark provides a set of recommendations for configuring Kubernetes to support a strong security posture. The Benchmark is tied to a specific Kubernetes release. The CIS Kubernetes Benchmark is written for the open source Kubernetes distribution and intended to be as universally applicable across distributions as possible.
Versions
The following table lists the versions of Distributed Cloud connected, Kubernetes, and the CIS Kubernetes Benchmark that were used to perform the assessment described in this document:
| Distributed Cloud connected version | Kubernetes version | CIS Kubernetes Benchmark version | 
|---|---|---|
| 1.4.0 - Local Control Plane | 1.25 | 1.70 | 
Accessing the Benchmark
The CIS Kubernetes Benchmark is available on the CIS website.
Recommendation levels
In the CIS Kubernetes Benchmark,
| Level | Description | 
|---|---|
| Level 1 | Recommendations intend to: | 
| Level 2 | Extends the Level 1 profile. Recommendations exhibit one or more of the following characteristics: | 
Assessment status
An assessment status is included for every recommendation. The assessment status indicates whether the given recommendation can be automated or requires manual steps to implement. Both statuses are equally important and are determined and supported as defined below:
| Scoring | Description | 
|---|---|
| Automated | Represents recommendations for which assessment of a technical control can be fully automated and validated to a pass/fail state. Recommendations will include the necessary information to implement automation. | 
| Manual | Represents recommendations for which assessment of a technical control cannot be fully automated and requires all or some manual steps to validate that the configured state is set as expected. The expected state can vary depending on the environment. | 
Status on Distributed Cloud connected local control plane clusters
| # | Recommendation | Level | Status | 
|---|---|---|---|
| 1 | Control Plane Security Configuration | ||
| 1.1 | Control Plane Node Configuration Files | ||
| 1.1.1 | Ensure that the API server pod specification file permissions are set to 644or more restrictive (Automated) | L1 | Pass | 
| 1.1.2 | Ensure that the API server pod specification file ownership is set to root:root(Automated) | L1 | Pass | 
| 1.1.3 | Ensure that the controller manager pod specification file permissions are set to 644or more restrictive (Automated) | L1 | Pass | 
| 1.1.4 | Ensure that the controller manager pod specification file ownership is set to root:root(Automated) | L1 | Pass | 
| 1.1.5 | Ensure that the scheduler pod specification file permissions are set to 644or more restrictive (Automated) | L1 | Pass | 
| 1.1.6 | Ensure that the scheduler pod specification file ownership is set to root:root(Automated) | L1 | Pass | 
| 1.1.7 | Ensure that the etcd pod specification file permissions are set to 644or more restrictive (Automated) | L1 | Pass | 
| 1.1.8 | Ensure that the etcd pod specification file ownership is set to root:root(Automated) | L1 | Pass | 
| 1.1.9 | Ensure that the Container Network Interface file permissions are set to 644or more restrictive (Manual) | L1 | Equivalent Control | 
| 1.1.10 | Ensure that the Container Network Interface file ownership is set to root:root(Manual) | L1 | Pass | 
| 1.1.11 | Ensure that the etcd data directory permissions are set to 700or more restrictive (Automated) | L1 | Equivalent Control | 
| 1.1.12 | Ensure that the etcd data directory ownership is set to etcd:etcd(Automated) | L1 | Equivalent Control | 
| 1.1.13 | Ensure that the admin.conffile permissions are set to600or more restrictive (Automated) | L1 | Pass | 
| 1.1.14 | Ensure that the admin.conffile ownership is set toroot:root(Automated) | L1 | Pass | 
| 1.1.15 | Ensure that the scheduler.conffile permissions are set to644or more restrictive (Automated) | L1 | Pass | 
| 1.1.16 | Ensure that the scheduler.conffile ownership is set toroot:root(Automated) | L1 | Equivalent Control | 
| 1.1.17 | Ensure that the controller-manager.conffile permissions are set to644or more restrictive (Automated) | L1 | Pass | 
| 1.1.18 | Ensure that the controller-manager.conffile ownership is set toroot:root(Automated) | L1 | Equivalent Control | 
| 1.1.19 | Ensure that the Kubernetes PKI directory and file ownership is set to root:root(Automated) | L1 | Equivalent Control | 
| 1.1.20 | Ensure that the Kubernetes PKI certificate file permissions are set to 644or more restrictive (Manual) | L1 | Equivalent Control | 
| 1.1.21 | Ensure that the Kubernetes PKI key file permissions are set to 600(Manual) | L1 | Pass | 
| 1.2 | API Server | ||
| 1.2.1 | Ensure that the --anonymous-authargument is set to false (Manual) | L1 | Pass | 
| 1.2.2 | Ensure that the --token-auth-fileparameter is not set (Automated) | L1 | Pass | 
| 1.2.3 | Ensure that the --DenyServiceExternalIPsis not set (Automated) | L1 | Fail | 
| 1.2.4 | Ensure that the --kubelet-client-certificateand--kubelet-client-keyarguments are set as appropriate (Automated) | L1 | Pass | 
| 1.2.5 | Ensure that the --kubelet-certificate-authorityargument is set as appropriate (Automated) | L1 | Pass | 
| 1.2.6 | Ensure that the --authorization-modeargument is not set to AlwaysAllow (Automated) | L1 | Pass | 
| 1.2.7 | Ensure that the --authorization-modeargument includes Node (Automated) | L1 | Pass | 
| 1.2.8 | Ensure that the --authorization-modeargument includes RBAC (Automated) | L1 | Fail | 
| 1.2.9 | Ensure that the admission control plugin EventRateLimit is set (Manual) | L1 | Pass | 
| 1.2.10 | Ensure that the admission control plugin AlwaysAdmit is not set (Automated) | L1 | Pass | 
| 1.2.11 | Ensure that the admission control plugin AlwaysPullImages is set (Manual) | L1 | Fail | 
| 1.2.12 | Ensure that the admission control plugin SecurityContextDeny is set if PodSecurityPolicy is not used (Manual) | L1 | Warn | 
| 1.2.13 | Ensure that the admission control plugin ServiceAccount is set (Automated) | L1 | Pass | 
| 1.2.14 | Ensure that the admission control plugin NamespaceLifecycle is set (Automated) | L1 | Pass | 
| 1.2.15 | Ensure that the admission control plugin NodeRestriction is set (Automated) | L1 | Pass | 
| 1.2.16 | Ensure that the --secure-portargument is not set to0(Automated) | L1 | Pass | 
| 1.2.17 | Ensure that the --profilingargument is set to false (Automated) | L1 | Pass | 
| 1.2.18 | Ensure that the --audit-log-pathargument is set (Automated) | L1 | Fail | 
| 1.2.19 | Ensure that the --audit-log-maxageargument is set to30or as appropriate (Automated) | L1 | Fail | 
| 1.2.20 | Ensure that the --audit-log-maxbackupargument is set to10or as appropriate (Automated) | L1 | Fail | 
| 1.2.21 | Ensure that the --audit-log-maxsizeargument is set to100or as appropriate (Automated) | L1 | Fail | 
| 1.2.22 | Ensure that the --request-timeoutargument is set as appropriate (Manual) | L1 | Fail | 
| 1.2.23 | Ensure that the --service-account-lookupargument is set to true (Automated) | L1 | Pass | 
| 1.2.24 | Ensure that the --service-account-key-fileargument is set as appropriate (Automated) | L1 | Pass | 
| 1.2.25 | Ensure that the --etcd-certfileand--etcd-keyfilearguments are set as appropriate (Automated) | L1 | Pass | 
| 1.2.26 | Ensure that the --tls-cert-fileand--tls-private-key-filearguments are set as appropriate (Automated) | L1 | Pass | 
| 1.2.27 | Ensure that the --client-ca-fileargument is set as appropriate (Automated) | L1 | Pass | 
| 1.2.28 | Ensure that the --etcd-cafileargument is set as appropriate (Automated) | L1 | Pass | 
| 1.2.29 | Ensure that the --encryption-provider-configargument is set as appropriate (Manual) | L1 | Pass | 
| 1.2.30 | Ensure that encryption providers are appropriately configured (Manual) | L1 | Pass | 
| 1.2.31 | Ensure that the API Server only makes use of Strong Cryptographic Ciphers (Manual) | L1 | Pass | 
| 1.3 | Controller Manager | ||
| 1.3.1 | Ensure that the --terminated-pod-gc-thresholdargument is set as appropriate (Manual) | L1 | Pass | 
| 1.3.2 | Ensure that the --profilingargument is set to false (Automated) | L1 | Pass | 
| 1.3.3 | Ensure that the --use-service-account-credentialsargument is set to true (Automated) | L1 | Pass | 
| 1.3.4 | Ensure that the --service-account-private-key-fileargument is set as appropriate (Automated) | L1 | Pass | 
| 1.3.5 | Ensure that the --root-ca-fileargument is set as appropriate (Automated) | L1 | Pass | 
| 1.3.6 | Ensure that the RotateKubeletServerCertificate argument is set to true (Automated) | L2 | Pass | 
| 1.3.7 | Ensure that the --bind-addressargument is set to127.0.0.1(Automated) | L1 | Pass | 
| 1.4 | Scheduler | ||
| 1.4.1 | Ensure that the --profilingargument is set to false (Automated) | L1 | Pass | 
| 1.4.2 | Ensure that the --bind-addressargument is set to127.0.0.1(Automated) | L1 | Pass | 
| 2 | ** etcdNode Configuration** | ||
| 2.1 | Ensure that the --cert-fileand--key-filearguments are set as appropriate (Automated) | L1 | Pass | 
| 2.2 | Ensure that the --client-cert-authargument is set to true (Automated) | L1 | Pass | 
| 2.3 | Ensure that the --auto-tlsargument is not set to true (Automated) | L1 | Pass | 
| 2.4 | Ensure that the --peer-cert-fileand--peer-key-filearguments are set as appropriate (Automated) | L1 | Pass | 
| 2.5 | Ensure that the --peer-client-cert-authargument is set to true (Automated) | L1 | Pass | 
| 2.6 | Ensure that the --peer-auto-tlsargument is not set to true (Automated) | L1 | Pass | 
| 2.7 | Ensure that a unique Certificate Authority is used for etcd (Manual) | L2 | Pass | 
| 3 | Control Plane Configuration | ||
| 3.1 | Authentication and Authorization | ||
| 3.1.1 | Client certificate authentication should not be used for users (Manual) | L2 | Pass | 
| 3.2 | Logging | ||
| 3.2.1 | Ensure that a minimal audit policy is created (Manual) | L1 | Pass | 
| 3.2.2 | Ensure that the audit policy covers key security concerns (Manual) | L2 | Fail | 
| 4 | Worker Node Security Configuration | ||
| 4.1 | Worker Node Configuration Files | ||
| 4.1.1 | Ensure that the kubelet service file permissions are set to 644or more restrictive (Automated) | L1 | Fail | 
| 4.1.2 | Ensure that the kubelet service file ownership is set to root:root(Automated) | L1 | Pass | 
| 4.1.3 | If proxy kubeconfig file exists ensure permissions are set to 644or more restrictive (Manual) | L1 | Pass | 
| 4.1.4 | If proxy kubeconfig file exists ensure ownership is set to root:root(Manual) | L1 | Pass | 
| 4.1.5 | Ensure that the --kubeconfigkubelet.conffile permissions are set to644or more restrictive (Automated) | L1 | Pass | 
| 4.1.6 | Ensure that the --kubeconfigkubelet.conffile ownership is set toroot:root(Automated) | L1 | Pass | 
| 4.1.7 | Ensure that the certificate authorities file permissions are set to 644or more restrictive (Manual) | L1 | Fail | 
| 4.1.8 | Ensure that the client certificate authorities file ownership is set to root:root(Manual) | L1 | Pass | 
| 4.1.9 | Ensure that the kubelet --configconfiguration file has permissions set to644or more restrictive (Automated) | L1 | Fail | 
| 4.1.10 | Ensure that the kubelet --configconfiguration file ownership is set toroot:root(Automated) | L1 | Pass | 
| 4.2 | Kubelet | ||
| 4.2.1 | Ensure that the --anonymous-authargument is set to false (Automated) | L1 | Pass | 
| 4.2.2 | Ensure that the --authorization-modeargument is not set to AlwaysAllow (Automated) | L1 | Pass | 
| 4.2.3 | Ensure that the --client-ca-fileargument is set as appropriate (Automated) | L1 | Pass | 
| 4.2.4 | Ensure that the --read-only-portargument is set to0(Manual) | L1 | Fail | 
| 4.2.5 | Ensure that the --streaming-connection-idle-timeoutargument is not set to0(Manual) | L1 | Pass | 
| 4.2.6 | Ensure that the --protect-kernel-defaultsargument is set to true (Automated) | L1 | Pass | 
| 4.2.7 | Ensure that the --make-iptables-util-chainsargument is set to true (Automated) | L1 | Pass | 
| 4.2.8 | Ensure that the --hostname-overrideargument is not set (Manual) | L2 | Pass | 
| 4.2.9 | Ensure that the --event-qpsargument is set to0or a level which ensures appropriate event capture (Manual) | L1 | Equivalent Control | 
| 4.2.10 | Ensure that the --tls-cert-fileand--tls-private-key-filearguments are set as appropriate (Manual) | L1 | Pass | 
| 4.2.11 | Ensure that the --rotate-certificatesargument is not set to false (Automated) | L1 | Pass | 
| 4.2.12 | Verify that the RotateKubeletServerCertificate argument is set to true (Manual) | L1 | Pass | 
| 4.2.13 | Ensure that the Kubelet only makes use of Strong Cryptographic Ciphers (Manual) | L1 | Fail | 
Failures and equivalent controls for Distributed Cloud connected local control plane clusters
| # | Recommendation | Level | Status | Value | Justification | 
|---|---|---|---|---|---|
| 1 | Control Plane Security Configuration | ||||
| 1.1.9 | Ensure that the Container Network Interface file permissions are set to 644or more restrictive (Manual) | L1 | Equivalent Control | 755 | None. | 
| 1.1.11 | Ensure that the etcddata directory permissions are set to700or more restrictive (Automated) | L1 | Equivalent Control | 755 | The etcddata directory has the default755permissions but its subdirectories use700. | 
| 1.1.12 | Ensure that the etcddata directory ownership is set toetcd:etcd(Automated) | L1 | Equivalent Control | 2003:2003 | The etcddata directory,/var/lib/etcd, is owned by2003:2003due to rootless control-plane for enhanced security. | 
| 1.1.16 | Ensure that the scheduler.conffile ownership is set toroot:root(Automated) | L1 | Equivalent Control | 2002:2002 | scheduler.confis owned by2002:2002due to rootless control-plane for enhanced security. | 
| 1.1.18 | Ensure that the controller-manager.conffile ownership is set toroot:root(Automated) | L1 | Equivalent Control | 2001:2001 | controller-manager.confis owned by2001:2001due to rootless control-plane for enhanced security. | 
| 1.1.19 | Ensure that the Kubernetes PKI directory and file ownership is set to root:root(Automated) | L1 | Equivalent Control | Varies | The PKI directory, /etc/kubernetes/pki, is owned byroot:root; the files inside the directory have various owners. This is due to rootless control-plane for enhanced security. | 
| 1.1.20 | Ensure that the Kubernetes PKI certificate file permissions are set to 644or more restrictive (Manual) | L1 | Equivalent Control | 644 | This is due to rootless control-plane for enhanced security. | 
| 1.2 | API Server | ||||
| 1.2.3 | Ensure that the --DenyServiceExternalIPsis not set (Automated) | L1 | Fail | ||
| 1.2.9 | Ensure that the --authorization-modeargument includes RBAC (Automated) | L1 | Fail | Event Rate Limit admission controller is a Kubernetes alpha feature. Google Distributed Cloud does not support non-GA features. | |
| 1.2.11 | Ensure that the admission control plugin AlwaysAdmitis not set (Automated) | L1 | Fail | ||
| 1.2.12 | Ensure that the admission control plugin AlwaysPullImagesis set (Manual) | L1 | Fail | The AlwaysPullImagesadmission controller provides some protection for private registry images in non-cooperative multitenant clusters at the cost of making container registries single points of failure for creating new pods across the entire cluster. Distributed Cloud clusters do not enable theAlwaysPullImagesadmission controller, which leaves it up to cluster administrators to implement admission policy to make this tradeoff for themselves. | |
| 1.2.18 | Ensure that the --audit-log-pathargument is set (Automated) | L1 | Fail | Distributed Cloud captures audit logs but does not use this flag for auditing. See Audit Logging for more information. | |
| 1.2.19 | Ensure that the --audit-log-maxageargument is set to30or as appropriate (Automated) | L1 | Fail | Distributed Cloud captures audit logs but does not use this flag for auditing. See Audit Logging for more information. | |
| 1.2.20 | Ensure that the --audit-log-maxbackupargument is set to10or as appropriate (Automated) | L1 | Fail | Distributed Cloud connected captures audit logs but does not use this flag for auditing. See Audit Logging for more information. | |
| 1.2.21 | Ensure that the --audit-log-maxsizeargument is set to100or as appropriate (Automated) | L1 | Fail | Distributed Cloud connected captures audit logs but does not use this flag for auditing. See Audit Logging for more information. | |
| 1.2.22 | Ensure that the --request-timeoutargument is set as appropriate (Manual) | L1 | Fail | Distributed Cloud connected captures audit logs but does not use this flag for auditing. See Audit Logging for more information. | |
| 3 | Control Plane Configuration | ||||
| 3.2.2 | Ensure that the audit policy covers key security concerns (Manual) | L2 | Fail | ||
| 4 | Worker Node Security Configuration | ||||
| 4.1.1 | Ensure that the kubelet service file permissions are set to 644or more restrictive (Automated) | L1 | Fail | 755 | |
| 4.1.7 | Ensure that the certificate authorities file permissions are set to 644or more restrictive (Manual) | L1 | Fail | ||
| 4.1.9 | Ensure that the kubelet --configconfiguration file has permissions set to644or more restrictive (Automated) | L1 | Fail | 644 | |
| 4.2.4 | Ensure that the --read-only-portargument is set to0(Manual) | L1 | Fail | Distributed Cloud connected clusters set the --read-only-portargument to10255for collecting kubelet metrics. | |
| 4.2.9 | Ensure that the --event-qpsargument is set to0or a level which ensures appropriate event capture (Manual) | L1 | Equivalent Control | Distributed Cloud clusters manage kubelet server TLS using the –rotate-server-certificatesflag. | |
| 4.2.13 | Ensure that the Kubelet only makes use of Strong Cryptographic Ciphers (Manual) | L1 | Fail | 
Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License. For details, see the Google Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.
Last updated 2025-10-24 UTC.