PodSecurity Admission Controller

Version 1.25 of later: Stable

De ‘oude’ PodSecurityPolicy is niet meer en daarvoor in de plaats is de PodSecurity Admission Controller gekomen. Hierin wordt gebruik gemaakt van de ‘Pod Security Standards‘ die bepalen welk niveau van restrictie voor de pods gelden. Deze standards zijn:

  • Privileged: Dit niveau laat nagenoeg alles toe, toegestaan zijn bekende privileges. Wordt gebruikt voor systeem-pods waarbij alleen administrators toegang toe (zouden moeten) hebben.
  • Baseline: Een standaard niveau waarbij bekende privileges niet toegestaan zijn. Gebruik deze voor niet-kritische applicaties.
  • Restricted: Het meest beperkt niveau. Dit volgt de pod ‘hardening’ methode. Dit niveau wordt gebruikt voor security-gevoelige applicaties.

Details over deze niveaus zijn te lezen op https://kubernetes.io/docs/concepts/security/pod-security-standards/

Pod Security Admission labels voor namespaces

Nadat de PodSecurity Admission Controller aanwezig is in het cluster kunnen namespaces gebruikt worden met een specifiek label waarin het niveau (mode) aangegeven wordt:

# The per-mode level label indicates which policy level to apply for the mode.
#
# MODE must be one of enforce, audit, or warn.
# LEVEL must be one of privileged, baseline, or restricted.
pod-security.kubernetes.io/<MODE>: <LEVEL>

# Optional: per-mode version label that can be used to pin the policy to the
# version that shipped with a given Kubernetes minor version (for example v1.26).
#
# MODE must be one of enforce, audit, or warn.
# VERSION must be a valid Kubernetes minor version, or latest.
pod-security.kubernetes.io/<MODE>-version: <VERSION>

Uitzonderingen

Uitzonderingen kunnen gebruikt worden voor pods die anders ‘restricted’ zouden zijn door het label op de namespace waar zij in gemaakt worden. Uitzonderingen worden aangegeven in de PodSecurity Admission Controller configuratie. Uitzonderingen kunnen bepaald worden voor:

  • usernames
  • runtimeClasses
  • namespaces

Implementatie

Alle namespaces die NIET een pod-security label hebben worden beschouwd als een security-risk. Een eenvoudige manier is om allereerst alle namespaces te voorzien van de baseline:

kubectl label --overwrite ns --all \
pod-security.kubernetes.io/audit=baseline |
pod-security.kubernetes.io/warn=baseline

Een enkele namespace met een andere mode kan dan overschreven worden met:

kubectl label --overwrite ns my-restricted-namespace \
pod-security.kubernetes.io/enforce=restricted \ 
pod-security.kubernetes.io/enforce-version=v1.26

De PodSecurity Admission Controller dient enabled te worden voor de kube-apiserver en dat wordt aangegeven in de kube-apiserver manifest.

...
- kube-apiserver
- --enable-admission-plugins=NodeRestriction,PodSecurity
...

Configuratie

Non-standaard configuraties in de PodSecurity Admission Controller kunnen ingesteld worden in een configuratiebestand dat in een directory geplaatst kan worden waar de kube-apiserver bij kan. De configuratie wordt aangegeven met bijvoorbeeld:

...
- kube-apiserver
- --admission-control-config-file=/etc/kubernetes/admission/admissionconfiguration.yml

waarbij /etc/kubernetes/admission gemount wordt als volume in kube-apiserver. De inhoud van een standaard configuratie:

apiVersion: apiserver.config.k8s.io/v1 # see compatibility note
kind: AdmissionConfiguration
plugins:
- name: PodSecurity
  configuration:
    apiVersion: pod-security.admission.config.k8s.io/v1
    kind: PodSecurityConfiguration
    # Defaults applied when a mode label is not set.
    #
    # Level label values must be one of:
    # - "privileged" (default)
    # - "baseline"
    # - "restricted"
    #
    # Version label values must be one of:
    # - "latest" (default)
    # - specific version like "v1.26"
    defaults:
      enforce: "privileged"
      enforce-version: "latest"
      audit: "privileged"
      audit-version: "latest"
      warn: "privileged"
      warn-version: "latest"
    exemptions:
      # Array of authenticated usernames to exempt.
      usernames: []
      # Array of runtime class names to exempt.
      runtimeClasses: []
      # Array of namespaces to exempt.
      namespaces: []

Meer details over pod-security vind je hier: https://kubernetes.io/docs/reference/access-authn-authz/psp-to-pod-security-standards/