Skip to main content

Lab 9.3 - Pod Security Standards

Lab Objectives

By the end of this lab, you will be able to:

  • Understand Pod Security Standards (PSS).
  • Apply security policies at the namespace level.
  • Test different levels (privileged, baseline, restricted).
  • Understand security restrictions.

Estimated Duration

45-60 minutes

Prerequisites

  • kubectl installed and configured.
  • Kubernetes cluster 1.23+ (for PSS).
  • Knowledge of Pod Security (Chapter 9.3).

Part 1: Understanding Pod Security Standards

Kubernetes defines three security levels:

  • privileged: No restrictions (disabled by default).
  • baseline: Minimal restrictions to prevent known vulnerabilities.
  • restricted: Strict restrictions following best practices.

Part 2: Applying to a Namespace

Step 2.1: Create a Namespace with PSS

Create a namespace with the baseline level:

kubectl create namespace pss-test

Apply the Pod Security Standard:

kubectl label namespace pss-test pod-security.kubernetes.io/enforce=baseline
kubectl label namespace pss-test pod-security.kubernetes.io/audit=baseline
kubectl label namespace pss-test pod-security.kubernetes.io/warn=baseline

Verify:

kubectl get namespace pss-test --show-labels

Part 3: Testing with Baseline

Step 3.1: Create a Baseline-Compliant Pod

Create pod-baseline.yaml:

apiVersion: v1
kind: Pod
metadata:
name: pod-baseline
namespace: pss-test
spec:
containers:
- name: app
image: busybox:1.35
command: ["sleep", "3600"]
securityContext:
runAsNonRoot: true
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL

Apply:

kubectl apply -f pod-baseline.yaml

Part 4: Testing with Restricted

Step 4.1: Change the Level to Restricted

Change the level to restricted:

kubectl label namespace pss-test pod-security.kubernetes.io/enforce=restricted --overwrite

Step 4.2: Test a Non-Compliant Pod

Create pod-non-compliant.yaml:

apiVersion: v1
kind: Pod
metadata:
name: pod-non-compliant
namespace: pss-test
spec:
containers:
- name: app
image: busybox:1.35
command: ["sleep", "3600"]
# Missing securityContext required for restricted

Try to create the Pod:

kubectl apply -f pod-non-compliant.yaml

The Pod should be rejected with a security error.


Part 5: Compliant Pod with Restricted

Create pod-restricted.yaml:

apiVersion: v1
kind: Pod
metadata:
name: pod-restricted
namespace: pss-test
spec:
securityContext:
runAsNonRoot: true
seccompProfile:
type: RuntimeDefault
containers:
- name: app
image: busybox:1.35
command: ["sleep", "3600"]
securityContext:
allowPrivilegeEscalation: false
runAsNonRoot: true
runAsUser: 1000
capabilities:
drop:
- ALL

Apply:

kubectl apply -f pod-restricted.yaml

Part 6: Cleanup

kubectl delete pod pod-baseline -n pss-test
kubectl delete pod pod-restricted -n pss-test
kubectl delete namespace pss-test

Lab Summary

In this lab, you applied Pod Security Standards at the namespace level. You tested the different security levels and understood the restrictions.


Next Steps

The last lab of this module will show you how to perform a security audit.

Lab 9.4: Security Audit


Lab created on: December 2024