Why Kubernetes security hardening is harder than the default install suggests
Kubernetes security hardening is the work of setting each security-relevant part of a cluster on purpose, documenting that choice and proving it holds. For a self-hosted cluster in your own data center or cloud account, that covers the API server, workloads, network traffic, Secrets and audit logs. If a cluster is running or about to go live and an assessor or internal risk team asks for evidence, the questions are which settings the cluster has, who owns each one and where the proof is kept.
The default install is built to work first, so it is not a hardened baseline. Out of the box, a cluster may allow broad workload permissions, leave pod-to-pod traffic open until network policies are added, and expose API server settings that need deliberate review. Hardening spans several layers: API server exposure and flags, Pod Security Standards enforced per namespace by Pod Security Admission, least-privilege RBAC, network policies, Secrets protection and audit logging. Each control needs a named owner, a documented target setting and evidence that the setting is in place. A control without an owner tends to drift, and a correctly configured control without evidence is difficult to show to an assessor.
Secrets are the item teams most often miss. According to the Kubernetes Secrets good practices documentation, Secrets are stored unencrypted in etcd by default. Administrators should configure encryption at rest on the API server, restrict list and watch access to Secrets through least-privilege RBAC, and consider an external store accessed through the Secrets Store CSI Driver. Each option changes who holds encryption keys, how keys rotate and what evidence you can produce. Confirm with your team which approach fits your key management service and your audit scope before the cluster holds production data.
Hardening does not end at go-live. Kubernetes publishes minor releases about three times per year, and the project maintains the three most recent minor releases. Per the version skew policy, kube-apiserver must be upgraded one minor version at a time and ahead of kube-controller-manager, kube-scheduler and kubelets, and kubelets may be up to three minor versions older than the API server. Patch support for each minor release lasts about one year. Each upgrade can change defaults, deprecate APIs or alter how admission policies and add-ons behave, so plan to re-run your configuration checks and refresh evidence after every upgrade.
DeployOpen plans and implements these controls in your environment, prepares the configuration, policies and evidence an assessment will request, and records an owner for each control. DeployOpen does not issue audit reports, attestations or certifications. Independent auditors and certification bodies make those determinations. Agree early with your assessor on the framework, scope and evidence format they expect, and ask any implementation partner for a written list of controls, owners and evidence artifacts before work begins.
Which Kubernetes components and settings carry the hardening work
Most Kubernetes hardening is configuration spread across a few components, and each one usually has a different owner. The cards below name what each component controls, who typically owns it, and what to check before an assessment. They work as one control set: a strict admission policy can be undercut by an over-broad role binding, and a locked-down API server offers little protection if etcd data is readable.
Pod Security Admission labels
Pod Security Admission applies one of the three Pod Security Standards (Privileged, Baseline or Restricted) to each namespace through labels. The platform team usually sets these labels, while application teams own the pod specs that must pass them. Check that every namespace has an explicit enforce level, that privileged workloads are listed and justified, and that warn and audit modes are set so violations surface before enforcement tightens.
RBAC roles and bindings
Roles and RoleBindings define which identities can read or change which resources, at namespace or cluster scope. Platform or security engineers usually design the role model, and team leads approve bindings for their namespaces. Check for wildcard verbs and resources, cluster-admin bindings granted to people or service accounts, and rights to list or watch Secrets, because those rights return secret values to the caller even when encryption at rest is in place.
NetworkPolicy and the CNI plugin
NetworkPolicy objects declare which pods may send and receive traffic, but the CNI plugin is what enforces them. Application teams usually write the policies, and the platform team owns the CNI choice and its configuration. Confirm that the installed CNI enforces NetworkPolicy, since the API server accepts policy objects whether or not the network plugin acts on them. Check for a default-deny baseline in each namespace with explicit allow rules for DNS, ingress and monitoring.
kube-apiserver flags and exposure
kube-apiserver flags set authentication, authorization, admission and audit behavior, and the load balancer in front of it decides who can reach port 6443. The platform team usually owns the flags, while the network team owns the load balancer and its access rules. Check that the API endpoint is reachable only from networks that need it, that anonymous access is disabled or tightly scoped, and that the flags match your chosen authentication and audit design.
Audit policy and audit backend
The audit policy sets which API requests are recorded and at what detail level, and the audit backend stores those events. The security team usually defines what must be captured, while the platform team configures the API server and ships logs off the control plane nodes. Check that the policy records authentication failures, RBAC changes and Secrets access at metadata level without logging Secret payloads, and that retention matches what your regulator or auditor expects.
Encryption at rest and etcd access
Secrets are stored unencrypted in etcd by default, so encryption at rest is configured through an encryption configuration that the API server reads, often with a key management service as the key provider. Etcd client certificates control which components can read the underlying data directly. The platform team usually owns both settings, and the security team usually owns key management. Confirm the setup on your distribution, check key rotation, and limit etcd client access to API servers and named administrators.
Decisions that set the hardening baseline and their operational cost
This table compares the main hardening decisions for a Kubernetes cluster, the situations where each option fits and the ongoing work it creates for the platform team. Read each row as a trade-off: stricter settings reduce exposure but add exception handling, testing and troubleshooting effort. The main takeaway is that enforcement choices are cheap to set and expensive to keep consistent across teams, so agree the rollout path before enabling them.
| Decision | When it fits | Operational cost |
|---|---|---|
| Pod Security Standards: Restricted per namespace | New workloads and namespaces owned by teams that can build non-root, read-only filesystem images | Images and manifests may need rework; developers must learn the constraints; exceptions still need a documented owner |
| Pod Security Standards: Baseline or Privileged for legacy exceptions | Legacy workloads that cannot yet meet Restricted, such as some node agents or older databases | Each exception needs a review date, a narrower namespace and extra monitoring; exception lists grow unless someone owns them |
| Pod Security admission: enforce versus audit and warn modes | Enforce once namespaces are clean; audit and warn during rollout to see violations without blocking deployments | Audit and warn modes need someone reading the logs and warnings; enforce mode surfaces failed deployments to teams at release time |
| Default-deny NetworkPolicy | Environments with regulated data or many tenants where unexpected east-west traffic is unacceptable | Every application needs its traffic mapped before rollout; missing rules cause outages that are hard to trace without flow visibility |
| Allow-listing NetworkPolicy per application | Teams that want rules written with each application, and a faster path to first rollout | Rules drift as services change; reviews are needed to catch overly broad allow rules that defeat the purpose |
| CNI plugin enforces NetworkPolicy (confirm with the vendor) | Required for any NetworkPolicy control to take effect; confirm the chosen distribution and CNI support it | If the CNI does not enforce policies, objects are accepted but traffic is not restricted, so testing must prove enforcement |
| Private API endpoint | Operators reach the API from corporate networks, VPN or bastion hosts only | Pipelines and remote administrators need network paths or runners inside the network; access changes need network change control |
| Public API endpoint with source restrictions | Hosted control planes or distributed teams that need access from outside a fixed network | Allowed source ranges must be maintained as people and runners move; restrictions alone do not replace authentication and RBAC |
| Audit logs kept on nodes | Small single-cluster environments with low retention needs and no central log platform | Logs are lost if nodes are rebuilt; retention, rotation and evidence collection become manual |
| Audit logs forwarded to a central log store | Assessments that need tamper-resistant retention and cross-cluster review | Log pipeline, storage and access controls must be built and maintained; alerting rules need tuning to avoid noise |
How to sequence Kubernetes security hardening without breaking workloads
Hardening a cluster in the wrong order can break workloads that depend on settings changed too early. This sequence starts with inventory and API server exposure, moves through audit logging, Secrets encryption, access and pod and network controls, and ends with a documented baseline mapped to the framework your auditor uses. Each step closes with a check, so the next change starts from a verified state.
Inventory the cluster and workloads
Record the Kubernetes version, the kube-apiserver flags in use, which API endpoints are reachable from outside the cluster network, and every namespace and workload running in it. Confirm the cluster's version sits within the minor releases the project still supports, since upgrades may be needed before hardening. The platform team owns this work, and a security engineer reviews the exposure findings. The step closes when the inventory is signed off and each later change can be traced to a recorded starting state, so any rollback has a known target.
Restrict API server exposure and confirm access paths
Limit which networks can reach the kube-apiserver endpoint, usually through a load balancer allow list or a private endpoint in front of the API server on port 6443 for kubeadm-based installs. Confirm that kubelet and control plane ports accept traffic only from control plane and node addresses. Test from an unapproved network segment and from a node to confirm the restriction blocks what it should, while administrators and automation still connect. The step closes when a scripted connection test from each network zone passes, the results are saved as evidence, and the team has a tested rollback for the endpoint change.
Enable audit logging with a written policy
Write an audit policy that defines which requests and resources are logged and at what level, with Secrets recorded at the metadata level so request payloads never land in the log. Point the API server audit settings at a log path or webhook, and forward events to the log store your security team searches. Check it by making a test change, a failed authentication and a denied request, then confirming all three events appear in the log store with user, verb and resource fields populated. The step closes when those test events are searchable and the policy has been reviewed by the team that owns the log store.
Encrypt Secrets at rest in etcd
Kubernetes stores Secrets unencrypted in etcd by default, so configure an encryption provider in the API server configuration, using a key management service where your environment provides one. Take an etcd snapshot before the change, restart the API server on each control plane node in a controlled order, and then rewrite existing Secrets so they are stored under the new configuration. Verify by reading a test Secret directly from etcd and confirming it is not stored as plain text. The step closes when that check passes, and the etcd backups are confirmed to be encrypted or held under the same access controls.
Tighten RBAC to least privilege
List every ClusterRoleBinding and RoleBinding, flag wildcard verbs, resources and API groups, and find bindings to broad groups such as all authenticated users. Replace them with namespace-scoped roles that match each team's workloads, and remove default bindings nobody uses. Give list and watch access on Secrets particular attention, since those permissions expose Secret values. Apply changes in audit-first order: confirm with a permission check that each team's service accounts still perform their required actions, then remove the old bindings. The step closes when a query for wildcard grants returns only documented exceptions and each service account passes its permission test.
Stage Pod Security Admission in audit mode
Label each namespace with the Pod Security Standard level its workloads can meet, setting audit and warn modes to that level while enforce stays off. Collect warnings and audit events, then fix each manifest that triggers them, such as privilege escalation, host namespace use or missing security context settings. Work through the namespaces owned by each team, and record any exception with an owner and a reason. Switch the namespace to enforce only after its warnings are resolved. The step closes when a dry-run apply of each workload returns no violations and the enforce label is in place.
Apply default-deny network policies per namespace
Confirm the CNI plugin enforces NetworkPolicy before relying on it, because a plugin that ignores the objects gives false confidence. Apply a default-deny policy to one namespace at a time, starting with a non-critical one, then add allow rules for documented traffic such as ingress controller to application, application to database and DNS egress. Keep a rollback manifest ready for each namespace. The step closes when a test pod in an unlisted namespace cannot reach the protected service, the documented paths still work, and the test results are saved with the policy set.
Document the baseline and map controls
Record the cluster baseline: versions, API server settings, audit policy, encryption configuration, RBAC inventory, Pod Security labels and the NetworkPolicy set. Map each control to the control IDs of the framework your auditor uses, such as recommendation numbers in the CIS Kubernetes Benchmark or controls in your own assessment framework, and list any gaps with an owner. Auditors decide whether the evidence is sufficient, so ask them early which artifacts they expect. The step closes when every control has an owner, an evidence location and a mapped control ID, and a fresh scan of the cluster matches the recorded baseline.
What drives the effort and cost of hardening and how to keep each down
This table lists the factors that most change how much work Kubernetes security hardening takes, why each one adds effort, and what you can do to keep it contained. Use it to scope a quote, decide where to start and identify which drivers your own environment makes expensive. Effort is described qualitatively because it depends on the cluster inventory and the assessor's scope.
| Driver | Why it raises effort | How to keep it down |
|---|---|---|
| Number of namespaces and workloads | Every namespace needs a Pod Security Standard level, RBAC bindings and network policies, so effort grows with the inventory and with undocumented workloads nobody owns. | Inventory namespaces and workloads first, standardize labels and ownership, and retire unused namespaces before policies are written. |
| Workloads needing privileged or host access | Privileged containers, host networking, host paths and added Linux capabilities fall outside the Restricted standard and each needs a justification, a narrower alternative or a documented exception. | List every such workload early, ask owners whether the access is still needed, and isolate the remainder in a dedicated namespace with tighter controls. |
| Legacy manifests that do not meet Restricted | Older Deployments and Helm charts often set root users, writable root filesystems or missing security contexts, so each one needs rework and retesting before enforcement. | Run admission in audit or warn mode to find failing manifests, fix them in a batch by chart or template, and enforce namespace by namespace. |
| Number of teams and exceptions to track | Each team has its own release habits and each exception needs an owner, an expiry date and evidence that the risk was accepted, which becomes ongoing governance work. | Set one exception process with a template, a named owner and a review date, and limit who may approve exceptions. |
| CNI and distribution capabilities | Network policy enforcement, audit logging options and encryption at rest depend on the network plugin and distribution, so gaps may need extra components or compensating controls. | Confirm these capabilities with the distribution and CNI vendor before design, and choose components that already meet the required controls. |
| Number of clusters and environments | Each cluster repeats the baseline, the scans and the evidence collection, and drift between development, staging and production adds reconciliation work. | Define one hardening baseline as code, apply it to every cluster through the same pipeline and collect evidence from a single location. |
| Log retention and SIEM integration | Audit log retention periods, forwarding, parsing and alert rules must match the policies of your regulator and security operations team, and each SIEM connection needs testing. | Agree the retention period and required event types up front, forward audit logs through the existing collector and test alerts with sample events. |
| Compliance framework scope set by the assessor | The assessor decides which controls, clusters and environments are in scope, so a broad or unclear scope enlarges the evidence set and the number of checks to document. | Get the scope in writing before work starts, map each control to a specific cluster and artifact, and ask the assessor to confirm the evidence format. |
How Pod Security Standards change existing workloads
Pod Security Standards change existing workloads because Pod Security Admission checks pods at the point they are created or when a workload's pod template changes. Kubernetes defines three standards: Privileged, which places no restrictions; Baseline, which blocks the best-known privilege escalation paths; and Restricted, which applies the strictest settings. Each standard is applied per namespace through a label, so you choose the level for each namespace rather than for the whole cluster. Pods that are already running are generally left in place when you add the label, but they will fail the check the next time they are recreated. Confirm this behavior for your Kubernetes version in the official documentation before you plan a rollout window.
Restricted is where most existing workloads run into trouble. It typically blocks privileged containers, host namespaces (hostNetwork, hostPID and hostIPC), hostPath volumes, and settings that allow privilege escalation. It also expects containers to run as a non-root user, drop Linux capabilities and use a seccomp profile. Many public images and third-party Helm charts were written to run as root, so they fail this check without changes. Some workloads genuinely need elevated rights, such as node agents, network plugins, storage drivers and some monitoring agents. These belong in their own namespace, labeled at the Privileged level, with a documented owner, a written justification for each capability and a scheduled review. Keeping exceptions out of application namespaces stops them from quietly weakening the rest of the cluster.
Audit and warn modes let teams see violations before enforcement blocks anything. In warn mode, kubectl and other clients display a warning when a submitted pod would violate the chosen level, so developers see the problem during deployment. In audit mode, the API server records the violation as an annotation in the audit log, which gives the platform team an inventory across the namespace without disrupting traffic. A common approach is to set warn and audit to the target level on a namespace, review what appears, fix or document each finding, and only then set enforce. Ask the audit log to be kept off the cluster so that the evidence survives a cluster rebuild, and confirm the audit policy covers the namespaces in scope.
Before you change any labels, build an inventory of the workloads in each namespace and check each image's documented user, required capabilities and host access. Ask vendors and chart maintainers which settings their pods need and whether a Restricted-compatible version exists. Pilot the change in a staging cluster with the same admission settings, then roll it out namespace by namespace, starting with namespaces that have the fewest host-level dependencies. Record each exception with its owner and expiry date, because these records become evidence during audits and during later reviews of your Kubernetes security hardening controls. The effort depends mainly on how many third-party charts and operators your clusters run, so confirm that count with your team before estimating the work.
How hardening differs for self-managed, managed and air-gapped clusters
With kubeadm in your own data center or cloud account, you operate the control plane yourself, so you control the kube-apiserver flags, the audit policy file and the encryption configuration that protects Secrets in etcd. Most hardening work is therefore configuration and evidence work that your team owns end to end, and the cost of a gap is that nobody else will close it for you.
Focus your hardening effort on these points:
- API server flags: Set authentication, admission and TLS options explicitly in the static pod manifest, and record the reason for each non-default value.
- Audit policy: Write the audit policy file, set its log path and retention, and decide which requests at the Metadata and Request levels are captured.
- Encryption at rest: Create the EncryptionConfiguration, back up its key material separately from etcd, and plan the key rotation procedure.
- etcd access: Restrict client certificates and network access to etcd, since you manage those files on each control plane node.
- Upgrade ownership: Patch the control plane and nodes on your own schedule, which means your team tracks the three supported minor releases.
Before you sign off, confirm that every control plane flag and file in your build is captured in version-controlled configuration, so an auditor can see the same settings your nodes run.
In a managed Kubernetes service running in your cloud account, the provider operates the control plane, so some API server and etcd settings are fixed or hidden from you. Your hardening scope shifts toward node configuration, cluster add-ons, identity, network policy and the evidence the provider gives you. The CIS Kubernetes Benchmark includes recommendations for several managed services, but many control plane items will be marked as the provider's responsibility, so the applicable list depends on the platform you run.
Focus your hardening effort on these points:
- Confirm what is configurable: Check which audit logging, authentication and encryption options the service exposes, and which are provider-set and not changeable.
- Secrets encryption: Confirm whether the service encrypts etcd by default, whether you can supply your own key management service key, and who holds and rotates that key.
- Node and image settings: Harden worker node images, Pod Security Admission settings and node pool configuration, since these remain yours to set.
- Provider evidence: Ask which attestations, shared responsibility documents and control logs the provider supplies, and whether they cover the control plane controls you rely on.
- Version lifecycle: Confirm the provider's support window for each minor release and how it schedules control plane upgrades against your own change windows.
Before you sign off, map each CIS recommendation to one of three owners: you, the provider or shared, and keep that mapping with your scan results.
An air-gapped cluster has no route to public registries, package repositories or vendor scanning services, so hardening depends on mirrored artifacts and offline paths. Controls that normally pull from the internet, such as image signature checks, vulnerability feed updates and log shipping to a hosted service, need an alternative that works inside the isolated network. The control plane itself can be set up without internet access, but every image and rule set it relies on must be brought in deliberately.
Focus your hardening effort on these points:
- Image mirroring: Mirror control plane images and every add-on image, including security scanners and admission controllers, into a private registry, and verify digests on import.
- Scanner and rule updates: Build an offline process to import vulnerability databases, benchmark rule sets and policy bundles, and record the date of each import.
- Log forwarding: Route audit logs and node logs to a collector inside the enclave, since external SaaS endpoints will be unreachable.
- Certificate handling: Plan how internal certificate authorities issue and renew control plane and admission webhook certificates without public validation.
- Offline upgrades: Stage each minor version's images and manifests through the same transfer process before the change window.
Before you sign off, test one full scan and one log export with the network cable disconnected, so you know the offline paths work before an auditor asks.
Controls to set first on the API server, access and workloads
These controls decide who can reach the cluster, what identities can do once authenticated, and what a compromised workload can touch. Set them before tuning anything else, because each one narrows the blast radius of the others. Where a control overlaps with identity, multi-tenancy or secret storage, the sibling topics cover the detailed design.
Restrict API server exposure on port 6443
The kube-apiserver listens on port 6443, and in a highly available kubeadm layout a TCP load balancer sits in front of it. Limit which source ranges can reach that load balancer and keep control plane nodes off public addresses where your network allows. Check the rules from outside your management network, not only in the cloud console, and confirm that worker nodes and administrators reach the endpoint through the paths you intended.
Remove cluster-admin bindings for people and automation
Review every ClusterRoleBinding that references cluster-admin, including those created for CI pipelines, controllers and former staff. Replace them with namespace-scoped Roles that grant only the verbs and resources each identity uses. Check for wildcard verbs and resources, and for permissions to create pods or bind roles, because both can be used to escalate privileges indirectly.
Disable anonymous access and review authenticators
Confirm that anonymous requests are rejected or limited to the discovery endpoints you need, and that the API server is not started with flags that grant broad unauthenticated access. Then list every enabled authentication method: X.509 client certificates, bearer tokens, OpenID Connect, webhook token authentication and any authenticating proxy. Each method you leave on is a path someone must monitor and govern.
Enforce Pod Security Restricted on namespaces
Pod Security Admission applies one of three standards per namespace: Privileged, Baseline or Restricted. Apply Restricted to workload namespaces and to the default namespace, where stray workloads often land. Test with warn and audit modes first to find pods that run as root, mount host paths or request privilege escalation, then move to enforce once the owning teams have fixed their manifests.
Apply default-deny network policies
Network policies only take effect when the cluster's network plugin enforces them, so confirm that your CNI supports them before writing rules. Create a default-deny policy for ingress and egress in each namespace, then add explicit allow rules for the traffic each application needs, including DNS. Treat the first rollout as a discovery exercise, because blocked egress often breaks workloads that depend on undocumented services.
Encrypt Secrets at rest with an external key
Secrets are stored unencrypted in etcd by default. Configure an encryption provider for the Secret resource in the API server configuration, and keep the key-encryption key in a key management service or hardware module outside etcd, so a snapshot of etcd alone does not expose plaintext values. Verify by reading a Secret directly from etcd after the change, and plan how existing Secrets are rewritten and how keys are rotated.
Audit requests to Secrets and RBAC
Write an audit policy that records metadata for reads and writes to Secrets and records full request details for create, update, patch and delete operations on Roles, RoleBindings, ClusterRoles and ClusterRoleBindings. Route the audit log off the control plane node to storage the cluster operators cannot silently edit, and test that a sample privilege change produces a retrievable record.
How to test that hardening works and fails safely
Each hardening control needs a test that tries to defeat it and records the result. Start with admission. Create a privileged pod and a pod with a hostPath mount in a namespace labeled to enforce the Restricted Pod Security Standard, and confirm the API server rejects both through Pod Security Admission. Run the same manifests in a Baseline namespace so the rejection can be traced to the namespace label alone. For network isolation, deploy a test service in one namespace, apply a default-deny NetworkPolicy in a second namespace, and confirm a client pod there cannot reach the service. Then confirm the CNI enforces the policy. A plugin that ignores NetworkPolicy will accept the manifest and do nothing, so this test is the only proof that the policy works.
For RBAC, create a service account bound only to a read-only role in one namespace. Confirm with an authorization check that it cannot list Secrets, then attempt the list with that identity's token and confirm the same denial. For encryption at rest, write a test Secret, read it directly from etcd using the check described in the Kubernetes documentation, and confirm the stored value is not readable plaintext. A Secret written before encryption was enabled stays unencrypted until it is rewritten, so recreate test data after every configuration change. For audit, perform a Secret read and an RBAC change, then confirm both events appear in the audit log with the expected user, verb and resource. Finally, attempt to reach the API endpoint from a host outside the permitted address ranges, both directly and through the load balancer on port 6443.
Testing failure modes matters as much as testing success. In a non-production cluster, fill the audit log destination and observe whether the API server blocks requests or drops events. The answer depends on your audit backend configuration and must be confirmed against your distribution's documentation. A silent drop breaks your evidence trail, while a blocking mode can stall the control plane. Stop an admission webhook and check its failurePolicy: Fail rejects matching requests while Ignore admits them unchecked. Built-in Pod Security Admission does not depend on a webhook, so it keeps enforcing during a webhook outage. For a lost encryption key, restore an etcd snapshot into a scratch cluster that lacks the key, confirm the Secrets are unreadable, and confirm the key is stored separately from the snapshots.
Use the CIS Kubernetes Benchmark as a reference checklist for these tests. Map each recommendation to a test above, run an assessment tool against the cluster, and record the output. Interpret every finding against your distribution. Managed services and kubeadm clusters expose different settings, and some recommendations cannot be changed on a managed control plane. A scan score alone proves little, so keep the test scripts, timestamps and results under version control so the same evidence can be rerun after each upgrade. Ask any implementation partner for the test plan in writing, including who runs the failure drills and how a failed test enters the remediation schedule.
What to monitor, patch, document and keep as audit evidence
Hardening decays unless someone watches it. The cards below cover what to check each week, how patching changes the baseline, and which records to keep so an auditor can trace each control to its evidence. DeployOpen prepares this evidence, but auditors decide whether the controls conform.
Audit log volume and forwarding failures
Kube-apiserver audit logs only help if they reach your log platform. Track event volume per cluster over time, because a sudden drop often means a policy change or a broken collector. Alert on forwarding failures and on gaps between the API server and the log store. Confirm that the audit policy still records Secrets access and RBAC changes at the level your baseline requires, and test that a sample event arrives in the log store after each change to the policy or collector.
Admission rejections and exceptions
Pod Security Admission and any policy engine log every rejected workload. Review rejection counts by namespace and by team to find where workloads conflict with the Baseline or Restricted profile, and where a namespace is running privileged workloads without a reason. Each approved exemption should appear in the exception register with an owner, a reason and an expiry date. Compare the live exemptions with that register, and treat any unlisted exemption as a finding to resolve.
RBAC drift and cluster-admin bindings
Roles and bindings change through GitOps pipelines, kubectl and controllers, so the live state can drift from what was reviewed. Compare live ClusterRoleBindings and RoleBindings against the repository on a schedule, and alert on any new binding to cluster-admin. Also check for wildcard verbs, list or watch access to Secrets, and service accounts that gained permissions after deployment. Each unexpected binding needs a named owner and a change record that explains why it exists.
Certificate and encryption key status
Control plane certificates, kubelet client certificates and the key used for encryption at rest all expire or need rotation. Track the expiry date of each certificate and confirm that the encryption configuration on the API server still names the active key. Ask your key management service how key rotation applies to Secrets already stored in etcd, and document who holds recovery access. Schedule renewals well before the deadline, because an expired control plane certificate can stop the API server from serving requests.
Re-check hardening after each upgrade
The Kubernetes project maintains the three most recent minor releases. As of September 2026 these were 1.37 (end of life October 28, 2027), 1.36 (June 28, 2027) and 1.35 (February 28, 2027), according to the Kubernetes releases page. Upgrade one minor version at a time, with kube-apiserver first, and allow kubelets to lag the API server by no more than three minor versions. After each step, rerun the benchmark checks and confirm that admission, audit and encryption settings survived the change.
Baseline, change records and retained evidence
Keep the control baseline as a versioned document that maps each hardening setting to the manifest or configuration that enforces it. Record every change to the baseline, admission policy or exception in a change record that names the approver. Retain scan results and audit logs for the period your assessment requires, in storage that cluster administrators cannot edit. DeployOpen prepares this evidence, but auditors decide whether the controls conform.
Questions teams ask before hiring help with Kubernetes security hardening
What drives the cost of Kubernetes security hardening?
The cost depends mostly on how many clusters are in scope, how many workloads run on them, and how far the existing configuration is from the target. Main cost components: assessment of current settings, changes to RBAC, Pod Security, network policies, Secrets encryption and audit logging, testing in staging, and handover documentation. Costs rise with multi-cluster estates, custom admission policies, legacy workloads that need privileges, and compliance scopes that require extra evidence. Some work is one-time, such as the first hardening pass. Other work recurs, such as re-running benchmark scans after upgrades. Ask any provider for a quote that separates one-time and recurring work, names who performs each task, and lists the clusters and namespaces covered.
How long does Kubernetes security hardening take to complete?
Duration depends on the size of the estate, how much of the cluster is already documented, and how many teams must approve changes. The main drivers are the number of clusters and namespaces, the number of workloads that must move to stricter Pod Security levels, the state of existing RBAC bindings, and whether the team must rebuild or patch components first. Testing in a staging environment usually takes longer than the configuration itself because each change must be checked against running applications. Ask for a written timeline with milestones, a list of assumptions about access and approvals, and the points where your team must review or sign off.
Can our internal team harden the cluster without outside help?
Yes, many platform teams can do this with the right skills and time, and the Kubernetes documentation and the CIS Kubernetes Benchmark give a clear starting point. The harder part is usually capacity and experience: changes to admission policies, RBAC and network rules can break workloads, and someone must test each change before production. Check whether your team has people who understand the API server, etcd, the kubelet and your distribution's defaults, and whether they can run a staging cluster for testing. An outside partner can supply a fixed scope, a second set of reviews and a written handover, but your team still needs to own the cluster afterward.
What does hardening work need from our own team?
Hardening needs named people from several groups, and the work slows when access is late. Typical requirements: administrative access to the clusters in scope, read access to manifests and Helm values, named owners for each workload or namespace, access to the log store for audit events, and a clear compliance scope that states which frameworks and controls the evidence must support. You will also need a change approval path and a staging environment. Confirm these items before work starts, and agree who can approve a change that might stop a production workload.
Does hardening a Kubernetes cluster make it compliant with audits?
No. Hardening makes the cluster's configuration closer to what many control frameworks expect, and it produces evidence such as scan results, configuration records and logs. However, compliance is decided by independent auditors or certification bodies, not by the hardening work or the people who performed it. Your organization still needs a defined scope, documented policies, operating procedures and evidence collected over time. Ask your auditor which controls apply to the cluster, which evidence they will accept, and whether they expect a specific benchmark, such as the CIS Kubernetes Benchmark, to be applied.
Is a default Kubernetes installation secure enough for regulated workloads?
No. A default installation leaves several important settings for the administrator to choose. For example, Kubernetes stores Secrets unencrypted in etcd by default, so encryption at rest must be configured deliberately. Other defaults that need review include the permissions granted to service accounts, the Pod Security level applied to namespaces, the absence of network policies, the API server exposure and the audit logging configuration. The exact defaults depend on the distribution and version, so confirm them in your own environment with a configuration scan and by reviewing the cluster's live settings.
How does security hardening change after a Kubernetes upgrade?
Each upgrade can change defaults, deprecate settings, and alter how components read configuration, so hardening must be checked again after every minor release. Kubernetes asks operators to upgrade the kube-apiserver one minor version at a time, and kubelets can trail the API server by up to three minor versions under the version skew policy. Review the release notes for changes to Pod Security, admission, authentication and audit logging, then repeat the benchmark scan and the RBAC review in staging. Confirm with your distribution vendor whether it supports the versions you plan to run.
Does the CIS Kubernetes Benchmark apply to our Kubernetes distribution?
Partly. The CIS Kubernetes Benchmark covers upstream Kubernetes and several managed services, but not every recommendation applies to every distribution or hosting model. Some recommendations concern control plane components that a managed service runs for you, and others concern settings you can change. Before scanning, list which checks apply to your distribution, which are handled by your provider, and which need documented exceptions. Keep the scan output and exception decisions as evidence, since auditors will ask how each finding was resolved or accepted.
How DeployOpen works on this
DeployOpen plans, implements, hardens, documents and supports open-source Kubernetes inside your own cloud accounts, data centers or air-gapped networks. For security hardening, we agree a written scope first, apply controls to your cluster, then hand over configuration, evidence and runbooks your team can operate and audit.
How we scope
- Engagements are fixed-scope, with the cluster list, distribution and controls agreed in writing before work starts.
- We confirm which Pod Security Standard level each namespace must meet and which workloads need exceptions.
- We record the RBAC, network policy, Secrets and audit logging controls in scope and the evidence each one should produce.
How we build
- We apply Pod Security Admission, least-privilege RBAC and network policies in staging before any production change.
- We configure encryption at rest for Secrets and check that list and watch access is limited by RBAC.
- We restrict API server exposure, set audit logging and test each control against the written scope, recording results.
How we hand over
- You receive hardening configuration as code, the mapping of each control to its evidence, and the test results.
- We document runbooks for patching, key rotation, audit log review and handling exceptions to Pod Security levels.
- We walk your platform and security teams through the controls so they can run, change and re-test them without us.
How we support
- Ongoing support, upgrades and continuous testing are available as a retainer, covering changes after handover.
- Kubernetes minor releases have a limited support window, so we can plan and rehearse hardening changes for each upgrade.
- Ask us to confirm which controls depend on your distribution and which evidence your auditor or regulator expects.

