Skip to main content
Version: 1.32.1

CIS Kubernetes Benchmark Compliance

SIGHUP Distribution (SD) is compliant with our opinionated implementation of the Center for Internet Security (CIS) Kubernetes Benchmark, ensuring alignment with its core security best practices while adapting to our architectural design principles.

The CIS Kubernetes Benchmark v1.11.0 is our current reference. It provides guidance for establishing a secure configuration posture for the latest released Kubernetes version. The benchmark covers all major cluster areas: control plane components, etcd storage and permissions, worker node configuration, authentication and authorization, network policies, and pod security. Being compliant assures that SIGHUP Distribution clusters are provisioned following vetted security standards, helping protect against common misconfigurations and threats.

πŸ” Testing our clusters​

To verify and maintain compliance, we integrated Aqua Security’s kube-bench into our release pipelines. kube-bench automatically audits a Kubernetes deployment against the CIS Benchmark by checking API server flags, kubelet configuration, file permissions, and many other checks.

We currently use cis-1.11 kube-bench config, which implements CIS Benchmark checks that target Kubernetes versions from 1.29 to 1.32.
Although not officially supported by the CIS Benchmark v1.11, most recommendations for a secure Kubernetes v1.32 cluster hold true also for a Kubernetes v1.33 cluster. As part of our validation process, we have carefully reviewed the changes introduced in the latest CIS Benchmark and Kubernetes 1.33 release, ensuring that no relevant control discrepancies or breaking changes are present. Our testing confirms that kube-bench runs successfully and produces consistent results on Kubernetes 1.33, with no compatibility issues identified.

πŸ—οΈ Secure by default for on-premises​

Our on-premises installer ships with hardened defaults that implement CIS Kubernetes Benchmark recommendations, aligned with SIGHUP’s architectural choices and cluster-specific configurations. As a result, every on-premises cluster provisioned with our installer meets our CIS-compliant security baseline, validated against our adapted kube-bench profiles.

CIS documentation explicitly states that configuration files and paths can vary by deployment tool and platform, and that references should be adapted to the current environment. We follow this guidance, and the kube-bench validation configs used by our on-premises installer are available here:
SIGHUP kube-bench profiles (on-premises) β†’ sighupio/installer-on-premises/utils/kube-bench.

πŸ›‘οΈ Compliance results overview​

The CIS Kubernetes Benchmark covers a wide set of checks across all cluster components.
SIGHUP Distribution ensures that the vast majority of these controls are met out-of-the-box for on-premises clusters.

πŸ”‘ Key enforced controls​

SIGHUP Distribution guarantees strong defaults that align with CIS recommendations, including:

  • Secure configuration files
    Critical Kubernetes component (API server, controller manager, scheduler, kubelet) files (static manifests, configuration files, PKI files) have restrictive permissions (600 or 700) and correct ownership (root:root or etcd:etcd).

  • Admission control policies
    Essential admission plugins such as NamespaceLifecycle, NodeRestriction, and ServiceAccount are enabled by default to enforce isolation and security boundaries.

  • Audit and logging configuration
    Audit logs are enabled with sane defaults for retention, rotation, and size to ensure traceability of key events.

  • Worker node security
    Kubelet and kube-proxy settings follow best practices, including proper TLS validation, disabled unauthenticated access, and secure file permissions.

These measures collectively reduce the attack surface and enforce a consistent security posture across clusters.

πŸ“Š Summary by category​

The following table summarizes the kube-bench results that you can expect for a SIGHUP Distribution installation that uses the default configuration. For every Item that does not get a PASS result, we explain the reasoning behind it in the section right below the table.

CategoryPASSWARNFAILINFO
Control Plane54204
Etcd7000
Authentication & Authorization1103
Worker Node20204
Total825011

⚠️ Accepted warnings​

While no critical checks fail, running the test will result in some items marked as WARN or INFO.
WARN items are typically related to controls that require manual intervention or cluster-specific configuration. These are checks that cannot be enforced automatically and are therefore left to the cluster administrator to review and apply as needed.
INFO items often represent best-practice recommendations (not really scored) or non-actionable checks that fall outside the scope of our distribution.
Here's a more detailed list of the mentioned items

IDCheck (summary)StatusMotivation
1.1.7Ensure correct permissions on etcd pod manifestINFONo pod specification file, since etcd runs as systemd service in our cluster
1.1.8Ensure correct ownership on etcd pod manifestINFONo pod specification file, since etcd runs as systemd service in our cluster
1.2.1Anonymos authentication set to falseINFOAnonymous authentication used for metrics scraping is safe under proper RBAC
1.2.11Admission plugin AlwaysPullImagesINFOAlwaysPullImages cannot be enforced by default; Waiting for upstream K8s release 1.34, where this issue will be addressed
1.2.27Encryption provider configWARNThe distribution can be configured to enable encryption at rest using the related field encryption configuration. We leave encryption provider selection and key management to the cluster administrator
1.2.28Encryption providers properly configuredWARNThe distribution can be configured to enable encryption at rest using the related field encryption configuration. We leave encryption provider selection and key management to the cluster administrator
3.1.1Client certificate authentication for usersINFOCertificate-based auth cannot be disabled by default
3.1.2Service account token authentication for usersWARNBest-practices suggestion, not scored. Policies already in place
3.1.3Bootstrap token authentication for usersINFOJoin token usage is limited to node bootstrap only
3.2.2Audit policy coverageINFODefault audit policy already satisfies benchmark requirements
4.1.3Ensure correct permissions on proxy kubeconfig fileINFOkube-proxy runs as a DaemonSet in the kube-system namespace, not as a local service. No proxy kubeconfig file is present on the nodes
4.1.4Ensure correct ownership for proxy kubeconfig fileINFOkube-proxy runs as a DaemonSet in the kube-system namespace, not as a local service. No proxy kubeconfig file is present on the nodes
4.2.7Ensure that the hostname-override argument is not setWARNRequired for kubeadm-based clusters where system hostname differs from FQDN. Nodes are registered with DNS-aligned names (e.g. master1.k8s.local) and TLS certificates, ensuring secure identity.
4.2.9Kubelet TLS certificate and key fileINFORotation of kubelet server certificates is enabled (4.2.11 PASS). Explicitly setting tls-cert-file and tls-private-key-file is unnecessary and would conflict with auto-rotation
4.2.14Ensure that the seccomp-default parameter is set to trueINFOOS management is out of scope. Core system pods already run with the RuntimeDefault seccomp profile, which provides baseline syscall filtering from the container runtime
4.2.15Ensure that the IPAddressDeny is set to anyWARNNew check introduced in CIS 1.11. Not yet adopted in SD on-premises installer, as it requires explicitly managing kubelet’s allowed IPs (API server, node, pod subnets). Will be evaluated and addressed in future releases.

We decided to exlude section 5 of the CIS Benchmark: Kubernetes Policies. These checks cover workload specific governance aspects (RBAC usage, Pod Security Standards, NetworkPolicies, Secrets management, etc.) that cannot be enforced generically by the installer. Instead, they are left to the cluster administrator to implement, according to context-specific requirements.

βœ… Passed CIS Controls​

Below is the complete list of CIS Benchmark checks successfully passed by SIGHUP Distribution.

πŸ•ΉοΈ Control Plane​

IDDescription
1.1.1Ensure that the API server pod specification file permissions are set to 600 or more restrictive
1.1.2Ensure that the API server pod specification file ownership is set to root:root
1.1.3Ensure that the controller manager pod specification file permissions are set to 600 or more restrictive
1.1.4Ensure that the controller manager pod specification file ownership is set to root:root
1.1.5Ensure that the scheduler pod specification file permissions are set to 600 or more restrictive
1.1.6Ensure that the scheduler pod specification file ownership is set to root:root
1.1.9Ensure that the Container Network Interface file permissions are set to 600 or more restrictive
1.1.10Ensure that the Container Network Interface file ownership is set to root:root
1.1.11Ensure that the etcd data directory permissions are set to 700 or more restrictive
1.1.12Ensure that the etcd data directory ownership is set to etcd:etcd
1.1.13Ensure that the default administrative credential file permissions are set to 600
1.1.14Ensure that the default administrative credential file ownership is set to root:root
1.1.15Ensure that the scheduler.conf file permissions are set to 600 or more restrictive
1.1.16Ensure that the scheduler.conf file ownership is set to root:root
1.1.17Ensure that the controller-manager.conf file permissions are set to 600 or more restrictive
1.1.18Ensure that the controller-manager.conf file ownership is set to root:root
1.1.19Ensure that the Kubernetes PKI directory and file ownership is set to root:root
1.1.20Ensure that the Kubernetes PKI certificate file permissions are set to 644 or more restrictive
1.1.21Ensure that the Kubernetes PKI key file permissions are set to 600
1.2.2Ensure that the --token-auth-file parameter is not set
1.2.3Ensure that the --DenyServiceExternalIPs is set
1.2.4Ensure that the --kubelet-client-certificate and --kubelet-client-key arguments are set as appropriate
1.2.5Ensure that the --kubelet-certificate-authority argument is set as appropriate
1.2.6Ensure that the --authorization-mode argument is not set to AlwaysAllow
1.2.7Ensure that the --authorization-mode argument includes Node
1.2.8Ensure that the --authorization-mode argument includes RBAC
1.2.9Ensure that the admission control plugin EventRateLimit is set
1.2.10Ensure that the admission control plugin AlwaysAdmit is not set
1.2.12Ensure that the admission control plugin ServiceAccount is set
1.2.13Ensure that the admission control plugin NamespaceLifecycle is set
1.2.14Ensure that the admission control plugin NodeRestriction is set
1.2.15Ensure that the --profiling argument is set to false
1.2.16Ensure that the --audit-log-path argument is set
1.2.17Ensure that the --audit-log-maxage argument is set to 30 or as appropriate
1.2.18Ensure that the --audit-log-maxbackup argument is set to 10 or as appropriate
1.2.19Ensure that the --audit-log-maxsize argument is set to 100 or as appropriate
1.2.20Ensure that the --request-timeout argument is set as appropriate
1.2.21Ensure that the --service-account-lookup argument is set to true
1.2.22Ensure that the --service-account-key-file argument is set as appropriate
1.2.23Ensure that the --etcd-certfile and --etcd-keyfile arguments are set as appropriate
1.2.24Ensure that the --tls-cert-file and --tls-private-key-file arguments are set as appropriate
1.2.25Ensure that the --client-ca-file argument is set as appropriate
1.2.26Ensure that the --etcd-cafile argument is set as appropriate
1.2.29Ensure that the API Server only makes use of Strong Cryptographic Ciphers
1.2.30Ensure that the --service-account-extend-token-expiration parameter is set to false
1.3.1Ensure that the --terminated-pod-gc-threshold argument is set as appropriate
1.3.2Ensure that the --profiling argument is set to false
1.3.3Ensure that the --use-service-account-credentials argument is set to true
1.3.4Ensure that the --service-account-private-key-file argument is set as appropriate
1.3.5Ensure that the --root-ca-file argument is set as appropriate
1.3.6Ensure that the RotateKubeletServerCertificate argument is set to true
1.3.7Ensure that the --bind-address argument is set to 127.0.0.1
1.4.1Ensure that the --profiling argument is set to false
1.4.2Ensure that the --bind-address argument is set to 127.0.0.1

πŸ’Ύ Etcd​

IDDescription
2.1Ensure that the --cert-file and --key-file arguments are set as appropriate
2.2Ensure that the --client-cert-auth argument is set to true
2.3Ensure that the --auto-tls argument is not set to true
2.4Ensure that the --peer-cert-file and --peer-key-file arguments are set as appropriate
2.5Ensure that the --peer-client-cert-auth argument is set to true
2.6Ensure that the --peer-auto-tls argument is not set to true
2.7Ensure that a unique Certificate Authority is used for etcd

πŸ“ Authentication & Authorization​

IDDescription
3.2.1Ensure that a minimal audit policy is created

πŸ› οΈ Worker Node​

IDDescription
4.1.1Ensure that the kubelet service file permissions are set to 600 or more restrictive
4.1.2Ensure that the kubelet service file ownership is set to root:root
4.1.5Ensure that the --kubeconfig kubelet.conf file permissions are set to 600 or more restrictive
4.1.6Ensure that the --kubeconfig kubelet.conf file ownership is set to root:root
4.1.7Ensure that the certificate authorities file permissions are set to 644 or more restrictive
4.1.8Ensure that the client certificate authorities file ownership is set to root:root
4.1.9If the kubelet config.yaml configuration file is being used validate permissions set to 600 or more restrictive
4.1.10If the kubelet config.yaml configuration file is being used validate file ownership is set to root:root
4.2.1Ensure that the --anonymous-auth argument is set to false
4.2.2Ensure that the --authorization-mode argument is not set to AlwaysAllow
4.2.3Ensure that the --client-ca-file argument is set as appropriate
4.2.4Verify that if defined, the --read-only-port argument is set to 0
4.2.5Ensure that the --streaming-connection-idle-timeout argument is not set to 0
4.2.6Ensure that the --make-iptables-util-chains argument is set to true
4.2.8Ensure that the eventRecordQPS argument is set to a level which ensures appropriate event capture
4.2.10Ensure that the --rotate-certificates argument is not set to false
4.2.11Verify that the RotateKubeletServerCertificate argument is set to true
4.2.12Ensure that the Kubelet only makes use of Strong Cryptographic Ciphers
4.2.13Ensure that a limit is set on pod PIDs
4.3.1Ensure that the kube-proxy metrics service is bound to localhost

Heads-up on future updates​

The Kubernetes CIS Benchmark and kube-bench evolve alongside Kubernetes. We track new releases and update our validation and hardening accordingly, ensuring continued compliance.

πŸ“š Learn more​