You just ran your Docker image through a vulnerability scanner, and it came back clean. Zero CVEs. You deploy it to your Kubernetes cluster and sleep soundly. A week later, your cluster is hijacked for crypto-mining. What happened?
The hard truth for DevOps engineers is that a secure container image means nothing if the runtime environment is left wide open. Standard vulnerability scanners look for known software flaws (CVEs) inside the image itself. They completely miss configuration drift and dangerous runtime parameters at the Kubernetes orchestration layer. If a highly secure container is deployed with root access to the host node, it's game over.
Why Vulnerability Scanners Miss Kubernetes Misconfigurations
Most CI/CD pipelines use static image scanning. They check if your Node.js or Python libraries have outdated versions. But Kubernetes configurations—defined in your Pod or Deployment YAML files—dictate how that container behaves once it's alive.
According to the Red Hat State of Kubernetes Security Report, nearly 70% of respondents experienced a security issue directly related to misconfigurations rather than software vulnerabilities. Let's fix the most dangerous defaults right now.
Top Dangerous Defaults & How to Fix Them
Below are three critical Kubernetes container misconfigurations, complete with the vulnerable YAML and the corrective code snippets you need to implement.
1. Running Containers as Root (Privileged Escalation)
By default, many containers run as the root user. If an attacker breaches the application, they get root access inside the container. From there, escaping to the underlying Kubernetes node is trivial.
The Fix: Explicitly forbid root execution and privileged escalation using the securityContext block.
# VULNERABLE: No security context defined
apiVersion: v1
kind: Pod
metadata:
name: web-app
spec:
containers:
- name: web
image: nginx:latest
# SECURE: Dropping privileges
apiVersion: v1
kind: Pod
metadata:
name: web-app
spec:
containers:
- name: web
image: nginx:latest
securityContext:
runAsNonRoot: true
runAsUser: 1000
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
2. Missing CPU and Memory Resource Limits
If you do not define resource limits, a single compromised container (or just a memory leak) can consume all the CPU and RAM on the host node. This starves out other critical services, resulting in a self-inflicted Denial of Service (DoS) attack.
The Fix: Always set requests (what the container needs to start) and limits (the absolute maximum it can use) as recommended by official Kubernetes documentation.
# VULNERABLE: Unbounded resources
spec:
containers:
- name: api-service
image: api:v1.2
# SECURE: Capped resource limits
spec:
containers:
- name: api-service
image: api:v1.2
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
3. Writable Root Filesystems
If an attacker manages to exploit a vulnerability in your app (like a file upload flaw), their next step is usually downloading malicious scripts (like crypto-miners or reverse shells) to the container's file system.
The Fix: Make the root filesystem read-only. If your application legitimately needs to write temporary data, mount an ephemeral emptyDir volume just for that specific path.
# SECURE: Read-only file system with specific write path
spec:
containers:
- name: secure-app
image: myapp:latest
securityContext:
readOnlyRootFilesystem: true
volumeMounts:
- mountPath: /tmp
name: tmp-volume
volumes:
- name: tmp-volume
emptyDir: {}
Automating Audits with CIS Benchmarks
Manually checking YAML files is impossible at scale. To ensure these misconfigurations don't sneak into production, you need to align with the CIS Kubernetes Benchmark. This is the industry-standard consensus on securing K8s components.
Tooling Recommendation
Don't wait for deployment to find out your configurations are bad. Integrate Open Policy Agent (OPA) Gatekeeper or Kyverno directly into your CI/CD pipeline. These policy engines will automatically reject any kubectl apply commands that don't include resource limits or attempt to run as root, enforcing security as code before the container ever reaches the cluster.
References & Further Reading
- Kubernetes Official Documentation: Pod Security Standards. Baseline and restricted policies for securing pods.
- Red Hat: State of Kubernetes Security Report. Industry analysis on the prevalence of configuration errors versus CVE exploits.
- Center for Internet Security (CIS): CIS Kubernetes Benchmark. Comprehensive guidelines for automated cluster auditing and policy enforcement.
Technical Discussion & Feedback (0)
Leave a Comment (Authenticated Users)