Kubernetes Security Checklist 2026
A practitioner's checklist for securing Kubernetes clusters — covering RBAC, pod security, network policies, secrets, supply chain, and runtime monitoring.
About This Checklist
This is a practitioner’s checklist — not a compliance document. It covers the security controls that actually prevent breaches in production Kubernetes clusters, ordered by impact.
Use it as a gap analysis tool: go through each section, mark what you’ve implemented, and prioritize what you haven’t.
Cluster Configuration
API Server
- API server not publicly accessible — Use private endpoint or restrict to known IPs. The Kubernetes API is the highest-value target.
- Audit logging enabled — Log all API requests (at minimum: metadata level for reads, request level for writes).
- Anonymous auth disabled —
--anonymous-auth=falseunless you specifically need unauthenticated health checks. - RBAC enabled — Default in modern clusters, but verify.
--authorization-mode=RBAC. - Admission controllers active — At minimum:
NodeRestriction,PodSecurity. ConsiderAlwaysPullImagesfor production.
etcd
- Encrypted at rest — etcd stores all cluster state including secrets. Enable encryption at rest with a KMS provider.
- Not accessible from worker nodes — etcd should only accept connections from API servers.
- mTLS between etcd peers — All etcd communication uses mutual TLS.
Kubelet
- Anonymous auth disabled —
--anonymous-auth=falseon all kubelets. - Webhook authorization —
--authorization-mode=Webhookso API server authorizes kubelet requests. - Read-only port disabled —
--read-only-port=0. The read-only port (10255) exposes pod info without auth.
RBAC and Identity
Principles
- No cluster-admin bindings for service accounts — If a pod is compromised, cluster-admin means game over.
- Namespace-scoped roles by default — Use
RoleandRoleBinding, notClusterRoleandClusterRoleBinding, unless cross-namespace access is truly needed. - No wildcard permissions —
resources: ["*"]andverbs: ["*"]are effectively admin. Be specific. - Service account tokens not auto-mounted — Set
automountServiceAccountToken: falseon pods that don’t need API access (most don’t).
Audit
- Inventory all ClusterRoleBindings —
kubectl get clusterrolebindings -o wide. Review who/what has cluster-level permissions. - Inventory service accounts with secrets access — Pods that can read secrets in any namespace are high-risk.
- Remove default service account permissions — The
defaultservice account in each namespace shouldn’t have any role bindings.
Pod Security
Pod Security Standards
- Enforce Restricted profile — For production namespaces, enforce the
restrictedPod Security Standard. This prevents privileged containers, host namespaces, and dangerous capabilities. - Baseline for system workloads — Use
baselineprofile for namespaces running infrastructure (monitoring, logging) that needs some elevated access. - Warn mode for migration — Use
warnenforcement initially to discover violations without breaking workloads.
apiVersion: v1
kind: Namespace
metadata:
name: production
labels:
pod-security.kubernetes.io/enforce: restricted
pod-security.kubernetes.io/warn: restricted
Container Security Context
- Run as non-root —
runAsNonRoot: trueand specify a numericrunAsUser. - Read-only root filesystem —
readOnlyRootFilesystem: true. Write to mounted volumes only. - Drop all capabilities —
capabilities: { drop: ["ALL"] }. Add back only what’s specifically needed. - No privilege escalation —
allowPrivilegeEscalation: false. - Seccomp profile — Apply
RuntimeDefaultseccomp profile to restrict syscalls.
securityContext:
runAsNonRoot: true
runAsUser: 1000
readOnlyRootFilesystem: true
allowPrivilegeEscalation: false
capabilities:
drop: ["ALL"]
seccompProfile:
type: RuntimeDefault
Network Policies
- Default deny all ingress — Start with deny-all, then explicitly allow needed communication.
- Default deny all egress — Prevents compromised pods from reaching the internet or other internal services.
- Allow only necessary pod-to-pod communication — Frontend → backend → database. Not frontend → database.
- DNS egress allowed — Pods need to reach kube-dns (port 53). Don’t accidentally block DNS.
- Restrict egress to specific external endpoints — If a pod needs to reach an external API, allow that specific IP/CIDR only.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
Secrets Management
- External secrets manager — Use AWS Secrets Manager, GCP Secret Manager, HashiCorp Vault, or similar. Don’t rely solely on Kubernetes secrets (base64 is not encryption).
- etcd encryption — If using native K8s secrets, encryption at rest is mandatory. Verify with
kubectl get --raw /apis/encryption. - No secrets in environment variables — Mount as files instead. Environment variables appear in process listings and crash dumps.
- No secrets in container images — Secrets baked into images persist in registry history forever.
- RBAC restricts secret access — Only pods that need a secret should have RBAC to read it. Audit with:
kubectl auth can-i get secrets --as=system:serviceaccount:namespace:sa-name.
Supply Chain Security
Image Security
- Private registry — Pull production images from your own registry, not public Docker Hub.
- Image scanning — Scan images for known CVEs before deployment. Block critical/high severity.
- Image signing — Sign images and verify signatures at admission (Cosign + policy engine).
- No
latesttag — Pin to specific image digests or version tags.latestis mutable and unpredictable. - Minimal base images — Use distroless or Alpine. Fewer packages = fewer vulnerabilities = smaller attack surface.
Admission Control
- Image allowlist — Only permit images from approved registries (policy engine or ValidatingWebhook).
- Vulnerability threshold — Block deployment of images with critical CVEs.
- Resource limits required — Prevent resource exhaustion (CPU/memory bombs).
Monitoring and Runtime Security
- Container runtime monitoring — Detect unexpected processes, file access, network connections at runtime (Falco, Tetragon, or cloud-native equivalent).
- API audit logs shipped to SIEM — Kubernetes audit logs are your primary detection source for cluster attacks.
- Alert on privilege escalation attempts — New ClusterRoleBindings, exec into pods, secret access from unexpected service accounts.
- Alert on anomalous network traffic — Pods communicating with unexpected destinations.
- Node integrity monitoring — Detect unauthorized changes to node configurations.
Ingress and Service Exposure
- TLS termination at ingress — All external traffic encrypted. No plaintext HTTP in production.
- No NodePort services in production — Use LoadBalancer or Ingress. NodePort exposes on every node’s IP.
- WAF in front of ingress — Web Application Firewall for internet-facing services.
- Rate limiting — At ingress controller level, not just application level.
- No services with
type: LoadBalancerunless intentional — Each one gets a public IP. Review all LoadBalancer services:kubectl get svc -A --field-selector spec.type=LoadBalancer.
Multi-Tenancy
If running multiple teams/applications on one cluster:
- Namespace isolation — Each team/application in its own namespace.
- Network policies between namespaces — Default deny cross-namespace traffic.
- Resource quotas per namespace — Prevent one team from exhausting cluster resources.
- Separate service accounts per workload — Not one SA per namespace shared across deployments.
Automated Scanning with Kloudle
Manually checking these items across multiple clusters doesn’t scale. Kloudle runs 140+ Kubernetes-specific checks covering:
- RBAC analysis (overprivileged roles, cluster-admin bindings)
- Pod security context validation
- Network policy coverage
- Secret management practices
- Container security configurations
- Ingress and service exposure
Scans run on schedule and surface findings with specific remediation steps.
Scan Your Kubernetes Clusters → | Learn About Sovereign CSPM →
Secure Your Clusters
306 Kubernetes security checks covering RBAC, pod security, network policies, and more.
Sovereign CSPM
Kubernetes scanning on your infrastructure.
BlogHow to onboard Kubernetes to Kloudle
Learn how to securely connect your Kubernetes cluster to Kloudle for comprehensive security monitoring. This step-by-step guide covers cluster access setup, RBAC configuration, and best practices for Kubernetes security monitoring in Kloudle.
BlogKubernetes Pod Security: Who Else is in Your Pod? - KubeSec Enterprise Talk Analysis
A comprehensive walkthrough of the KubeSec Enterprise Online talk on Kubernetes pod security, covering container isolation, security risks, and best practices for securing your Kubernetes workloads.
Academy5 important security settings you need to review for your GKE clusters
There are some very important settings related to security that you should regularly review in your Google Kubernetes Engine based K8S clusters