Kubernetes How To

Kubernetes How To

Reading time1 min
#Kubernetes#Cloud#Security#PodSecurityPolicies#DevOps#ContainerSecurity

How to Master Kubernetes Pod Security Policies for Bulletproof Cluster Security

Most Kubernetes users overlook subtle security configurations that can cause major vulnerabilities. This guide breaks down pod security policies not just as rules, but as an essential toolkit to future-proof your cluster against increasingly sophisticated attacks.

As Kubernetes clusters become the backbone of cloud-native applications, securing pods correctly is crucial to prevent breaches and maintain compliance. Understanding and implementing pod security policies systematically can safeguard your infrastructure against escalating cyber threats.


What Are Kubernetes Pod Security Policies?

Pod Security Policies (PSPs) are a built-in Kubernetes resource that controls the security-sensitive aspects of a pod specification. Essentially, PSPs define a set of conditions that a pod must meet to be accepted by the cluster. These policies guard your cluster by restricting permissions granted to pods — things like privilege escalation, running as root, using host networking, or mounting sensitive volumes.

By mastering PSPs, you protect your workloads from privilege exploits and zero-day vulnerabilities often found in container images or application code.

Note: In Kubernetes v1.21+, PSPs are deprecated in favor of Pod Security Admission controllers or third-party tools like OPA Gatekeeper. However, understanding PSPs concepts remains valuable as many clusters still use them.


Why Should You Care About Pod Security Policies?

  • Prevent privilege escalation: Avoid pods running with unrestricted capabilities.
  • Limit access to node resources: Stop pods from mounting hostPath volumes or using host networking.
  • Enforce user and group constraints: Ensure pods run under non-root users.
  • Control capabilities: Drop or add Linux capabilities explicitly.
  • Maintain compliance: Meet industry standards like PCI-DSS, HIPAA, or GDPR.
  • Reduce attack surface: Minimize container privileges to reduce impact in case of compromise.

Step-by-Step Guide: How to Write and Apply Pod Security Policies

Let’s walk through creating a simple but effective PSP for your cluster.

1. Understand Key Fields in a PodSecurityPolicy

Before writing policies, get familiar with critical fields:

FieldDescription
privilegedWhether containers can run privileged
allowedCapabilitiesLinux capabilities you explicitly allow
runAsUserUser ID ranges containers can run as
seLinuxSELinux context constraints
volumesTypes of volumes allowed (hostPath, emptyDir)
hostNetworkWhether pods can use host network
hostPIDWhether pods can use host PID namespace

2. Create a Restrictive PodSecurityPolicy YAML

Here’s an example PSP that enforces least privilege for most workloads:

apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: restricted-psp
spec:
  privileged: false                          # No privileged containers allowed
  allowPrivilegeEscalation: false           # Block privilege escalation
  requiredDropCapabilities:
    - ALL                                   # Drop all extra capabilities by default
  volumes:
    - 'configMap'
    - 'emptyDir'
    - 'secret'
    - 'persistentVolumeClaim'                # Allowed volume types only
  hostNetwork: false                         # Disallow host networking
  hostIPC: false                             # Disallow host IPC namespace
  hostPID: false                             # Disallow host PID namespace
  runAsUser:
    rule: MustRunAsNonRoot                   # Containers cannot run as root user
  seLinux:
    rule: RunAsAny                           # Accept any SELinux context (adjust if applicable)
  fsGroup:
    rule: RunAsAny                           # Accept any FSGroup (adjust based on need)
  supplementalGroups:
    rule: RunAsAny                           # Accept any supplemental groups (optional)

3. Apply the PodSecurityPolicy

Save the above YAML as restricted-psp.yaml and apply it:

kubectl apply -f restricted-psp.yaml

4. Bind PSPs With RBAC Roles

PSPs alone won’t do anything unless associated with users or service accounts via Role-Based Access Control (RBAC).

Example role binding for default service accounts in the default namespace:

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: use-restricted-psp
  namespace: default
subjects:
- kind: ServiceAccount
  name: default               # Bind to default SA; adjust accordingly for your workloads 
roleRef:
  kind: ClusterRole
  name: restricted-psp        # This needs to match a ClusterRole referencing our PSP below 
  apiGroup: rbac.authorization.k8s.io

You also need a ClusterRole that grants the use of this PSP:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: restricted-psp
rules:
- apiGroups:
  - policy
  resourceNames:
  - restricted-psp                  # The name of your PSP resource here!
  resources:
  - podsecuritypolicies
  verbs:
  - use                            # Grants permission to "use" this specific PSP  

Apply these RBAC configurations:

kubectl apply -f restricted-role.yaml   # Your RoleBinding YAML file  
kubectl apply -f restricted-clusterrole.yaml   # Your ClusterRole YAML file  

5. Test the Policy Enforcements

Try deploying a pod spec that violates the rules — for example, attempting to run as root:

apiVersion: v1
kind: Pod
metadata:
  name: test-root-pod
spec:
  containers:
    - name: busybox-root-example  
      image: busybox  
      command: ["sleep", "3600"]
      securityContext:
        runAsUser: 0                   # Root user  

If everything is set up properly, this pod will be rejected due to violation of the MustRunAsNonRoot restriction.


Helpful Tips When Working With Pod Security Policies

  • Start with broad policies; gradually tighten restrictions based on workload needs.
  • Use namespaces and service accounts effectively alongside RBAC for granular control.
  • Combine PSPs with other Kubernetes security features like NetworkPolicies and Admission Controllers.
  • Audit existing workloads (kubectl get pods -o yaml) before enforcing policies aggressively.
  • Remember that some complex workloads (like those requiring privileged mode or host access) might require custom exceptions.

Alternatives & Future-Proofing Your Security Setup

Because PSPs are deprecated in recent Kubernetes versions:

  • Consider activating the Pod Security Admission Controller which enforces similar standardized pod security standards without complex RBAC configs.
  • Use tools like OPA Gatekeeper or Kyverno for more flexible policy enforcement integrated with GitOps workflows.

Conclusion

Mastering Kubernetes Pod Security Policies is a keystone step towards bulletproof cluster security. By thoughtfully crafting and enforcing these policies, you drastically reduce risks of privilege escalations, unauthorized node access, and compliance gaps — making your clusters resilient against modern threat vectors.

Start small— build restrictive PSP templates today — then iterate! Secure pod deployments are foundational to safeguarding every layer of your Kubernetes infrastructure.


Ready to level up your cluster’s security? Bookmark this guide and experiment with writing your own PodSecurityPolicies today! Have questions or want examples tailored for your environment? Drop a comment below or reach out— let’s secure those clusters together.


Happy Kubernetes Securing! 🚀