Kernel hardening (KSPP)
Talos follows the recommendations of the Kernel Self-Protection Project (KSPP), a Linux kernel initiative that eliminates entire classes of vulnerabilities through kernel configuration and runtime settings. Kernel hardening in Talos operates at four levels:- Build-time kernel configuration — security properties compiled into the kernel that cannot be changed after the kernel is built
- Boot-time parameters — kernel flags enforced before userspace starts
- Runtime sysctl settings — kernel behavior restrictions applied at runtime
- Module and memory controls — restrictions on what code can run and how processes interact with memory
Build-time kernel configuration
The first layer of hardening happens before a node ever boots. Talos compiles its kernel with KSPP-recommended configuration options that are baked in and cannot be changed by userspace processes after the kernel is built. The table below lists specific kernel configuration choices that are part of this baseline:
Because these are compile-time decisions, they cannot be overridden through kernel command line arguments or sysctl settings at runtime.
Boot-time parameters
The kernel command line has default security settings that can be changed and affect the system at run time. The following parameters are set on every node at boot:init_on_free is disabled by default due to its performance impact, but can be enabled for environments with stricter memory safety requirements.
To verify the active kernel command line on a Talos node:
If you are using Omni, run
omnictl get kernelargsstatus <machine-id> -o yaml and check the spec.currentcmdline field to view the full active kernel command line for a machine.Runtime sysctl settings
Beyond boot parameters, Talos applies a stricter set of KSPP sysctl settings at runtime, starting from Talos v1.12 onwards. While boot parameters harden the kernel before userspace starts, sysctl settings control how the running kernel behaves, restricting what processes can observe and what they can do to each other. These cover three main areas: kernel pointer exposure,/proc access, and unprivileged BPF usage.
To view all active kernel parameter settings and their current values:
Module and memory controls
The final layer covers what code can be loaded into the kernel and how processes can interact with each other’s memory. Talos enforces two controls here, both on by default:- Kernel module signature verification (
module.sig_enforce=1): This control allows only cryptographically signed modules to be loaded into the kernel. It ensures that anything entering the kernel can be traced back to a trusted source, preventing tampering via unsigned drivers, a common persistence technique in compromised systems. - Process memory write restriction (
proc_mem.force_override=never): This control prevents any process from writing to/proc/PID/memof another process. Without it, a compromised process could modify another process’s memory directly, a technique commonly used in process injection attacks.
OS-level hardening
Talos’s architecture eliminates entire categories of OS-level risk that traditional Linux hardening guides address:
Because of this design, the majority of the CIS Distribution Independent Linux Benchmark does not apply to Talos nodes.
Checks that assume SSH, a shell, a package manager, or a writable filesystem are not relevant.
Kubernetes CIS benchmark compliance
The CIS Kubernetes Benchmark is a set of security recommendations that cover how Kubernetes components should be configured, the API server, etcd, controller manager, scheduler, and kubelet. The table below shows which of those recommendations Talos satisfies out of the box, without any operator configuration:
Most of these controls are enforced at the platform level, they cannot be accidentally disabled through misconfiguration.
This matters because it means Talos clusters start compliant and stay compliant across upgrades, without operator intervention.
However, knowing that Talos satisfies these controls by default and being able to prove it in an audit are two different things.
The next section covers how to run the CIS benchmark tooling against a Talos cluster, and critically, how to correctly interpret its output.
Running CIS benchmark checks with kube-bench
kube-bench is the standard open source tool for running automated CIS Kubernetes benchmark checks. It works by inspecting running processes, configuration files, and file permissions on your cluster nodes, then comparing them against the CIS benchmark requirements.
The important thing to understand before running it on Talos is that kube-bench was built for kubeadm-based clusters. It expects to find control plane configuration files in specific locations, /etc/kubernetes/manifests/, /etc/kubernetes/pki/, that do not exist on Talos. Talos manages control plane components through its own machine configuration API rather than static pod manifests, so these paths are intentionally absent.
This means that when you run kube-bench on Talos, you will see a number of [FAIL] results that are not real failures. They are false positives caused by the architectural difference between Talos and kubeadm. The steps below walk through how to run kube-bench correctly and how to tell the difference between a false positive and a genuine finding.
Step 1: Prepare the namespace
kube-bench requires elevated host privileges to inspect node processes and configurations. By default, Talos enforces Pod Security Admission at the baseline level, which blocks privileged pods from running. Before running kube-bench, label the target namespace to permit it:
Step 2: Select the correct benchmark version
kube-bench ships with benchmark configurations for different Kubernetes versions. Using the wrong version will produce inaccurate results. Match the benchmark to your cluster’s Kubernetes version:
To check your cluster version:
Step 3: Run kube-bench on control plane nodes
Create the following job to run benchmark checks against your control plane. Update the--benchmark flag to match the version you identified in the previous step:
kube-bench-master job and retrieve the logs from the job:
kubectl logs job/kube-bench-master retrieves all the logs from the job, to see only failures and warnings logs, run:
Step 4: Run kube-bench on worker nodes
Run a separate job to check worker node configuration:kube-bench-worker job:
Step 5: Interpret the results
Once you have the output, you need to read it in the context of Talos’s architecture. The failures fall into two categories: false positives caused by Talos’s design, and genuine findings that require attention.Control plane results (sections 1.1–1.4)
The kube-bench control plane output is organized into four sections: section 1.1 covers configuration file permissions, section 1.2 covers the API server, and sections 1.3 and 1.4 cover the controller manager and scheduler respectively. Section 1.1: Control plane configuration files (all false positives) Every check in section 1.1 will fail on Talos. This section is entirely concerned with file permissions and ownership of control plane configuration files, things like pod specification files and PKI certificates. kube-bench expects to find these at paths like/etc/kubernetes/manifests/ and /etc/kubernetes/pki/, which is where kubeadm-based clusters store them.
On Talos, machined, its init system designed specifically for Kubernetes, manages etcd and kubelet as system-level services. Control plane components, including the API server, controller manager, and scheduler, run as static pods, but their manifests are generated and managed internally by Talos instead of being written to /etc/kubernetes/manifests/ as kubeadm does. PKI is handled by trustd, Talos’s dedicated trust daemon, which manages certificate distribution across the cluster. Because Talos does not place manifests or PKI files at the paths that kube-bench expects, these checks fail not because the controls are missing, but because Talos’s architecture does not rely on those paths.
Section 1.2: API server (mixed results)
Section 1.2 checks how the API server is configured, its authentication settings, authorization modes, admission plugins, and TLS configuration. Most of these pass on Talos because Talos configures the API server correctly at bootstrap time. The failures are false positives caused by kube-bench looking for explicit flags in a manifest file that does not exist on Talos:
Some section 1.2 results are labeled
Manual by kube-bench, meaning kube-bench cannot verify them automatically. These represent optional hardening decisions that depend on your environment:
Sections 1.3 and 1.4: Controller manager and scheduler
Sections 1.3 and 1.4 check the security configuration of the controller manager and scheduler. Section 1.3 covers whether profiling is disabled, whether service account credentials are used, whether the root CA file is set, and whether kubelet server certificate rotation is enabled. Section 1.4 covers profiling and bind address on the scheduler. All of these pass on Talos except one warning:
Worker node results (sections 4.1–4.3)
The worker node output covers three sections: section 4.1 covers worker node configuration files, section 4.2 covers the kubelet, and section 4.3 covers kube-proxy. Section 4.1: Worker node configuration files (all false positives) Every check in section 4.1 will fail on Talos. kube-bench expects to find kubelet configuration at kubeadm-style paths,/etc/systemd/system/kubelet.service.d/10-kubeadm.conf, /etc/kubernetes/kubelet.conf, and /var/lib/kubelet/config.yaml. None of these paths exist on Talos nodes. Talos generates kubelet configuration at /etc/kubernetes/kubelet.yaml and manages the kubelet as a system service through machined. Because Talos does not use systemd, there is no systemd unit file for the kubelet, and because Talos manages configuration through its own API rather than kubeadm-style files, none of the paths kube-bench checks exist.
Section 4.2: Kubelet (mixed results)
Section 4.2 checks kubelet security settings. The three failures here are false positives, kube-bench cannot find the settings because it reads from the wrong configuration file path. The actual kubelet configuration at
/etc/kubernetes/kubelet.yaml on each worker node confirms all three settings are correctly configured by Talos:
The following section 4.2 results are labeled
Manual by kube-bench and represent optional hardening decisions:
Step 6: Produce a clean compliance report
Many organizations need to run CIS benchmarks on a regular cadence and produce audit reports. Because the section 1.1 and several section 1.2 failures on Talos are architectural false positives rather than real security gaps, including them in a report creates noise and requires manual explanation each time. kube-bench supports a--skip flag that lets you exclude specific checks by ID. The following commands skip all known Talos false positives, validated against a live cluster running Kubernetes 1.35 with benchmark cis-1.10.
When a check is skipped, kube-bench still lists it in the output but marks it [INFO] rather than [FAIL]. A clean run on Talos should produce:
[PASS]for all checks that Talos satisfies[INFO]for all skipped architectural false positives[WARN]forManualchecks that require your own assessment0 checks FAILin the summary
Verifying security state directly
kube-bench is useful for formal compliance reporting, but for day-to-day verification you can inspect Talos security state directly usingtalosctl. These commands give you a live view of what is active on any node without running a separate job:
FIPS 140-3 compliant builds
For organizations in regulated environments, Talos Linux is available as a FIPS 140-3 compliant build. FIPS builds run across bare metal, data center, edge, cloud, and air-gapped deployments, and the full Sidero stack including Omni and the Image Factory can be self-hosted to maintain control and oversight. Talos FIPS is currently available as an enterprise feature that requires a support contract for access. To get access, visit the Talos Linux FIPS 140-3 compliance page. To verify the FIPS state on a running node, use theRuntimeFIPSState API.