K8s 1.22 giới thiệu Pod Security Admission (sau này gọi tắt là PSA) phiên bản alpha, để thay thế cho Pod Security Policy (PSP).

Bài viết này sẽ hướng dẫn qua cách bạn setup PSA và sử dụng PSA 1 cách cơ bản nhất.

Enable PSA

Để cho mục đích lab đơn giản, mình sẽ sử dụng kind để tạo 1 cluster local. Mình sẽ tạo 1 cluster và enable PSA lên với config như sau

Chú ý chút chỗ mình enable PodSecurity trong featureGates sang true.

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
featureGates:
 PodSecurity: true
nodes:
- role: control-plane
- role: worker

Tạo cluster với lệnh dưới đây

kind create cluster \
  --image=kindest/node:[email protected]:b8bda84bb3a190e6e028b1760d277454a72267a5454b57db34437c34a588d047 \
  --config kind-config.yaml

Tạo thành công, bạn sẽ thấy log kiểu như vậy

Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.22.0) 🖼
 ✓ Preparing nodes 📦 📦
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
 ✓ Joining worker nodes 🚜
Set kubectl context to "kind-kind"
You can now use your cluster with:

kubectl cluster-info --context kind-kind

Have a nice day! 👋

Giờ chúng ta đã có 1 cluster đc enable PSA sẵn sàng để vọc.

Vọc

Có 3 loại policies cơ bản

  • Privileged: mở, và ko recommend xài
  • Baseline: cơ bản
  • Restricted: chặt nhất và là best practices.

3 loại policies này sẽ đc áp dụng ở 1 trong 3 mode sau (khá là self-explained rồi nên mình ko đi sâu nữa).

  • enforce
  • audit
  • warn

Các loại policies này sẽ siết chặt việc mình sử dụng 1 số fields trong Pod specs như container ports, hostPath và securityContext.

Áp policy lên namespace

Để preview thì mình xài dry-run flag trước: apply baseline warn mode và warn ver 1.22 lên default namespace

kubectl label --dry-run=server --overwrite ns default \
  pod-security.kubernetes.io/warn=baseline \
  pod-security.kubernetes.io/warn-version=v1.22

Thường thì cái namespace này mới cài nên ko có gì.

Để thử cho vui thì mình sẽ thử tiếp dry-run với tất cả namespace và enforce mode xem thế nào.

kubectl label --dry-run=server --overwrite ns --all \
  pod-security.kubernetes.io/enforce=baseline

H thì bạn sẽ thấy 1 số warning như sau. Cái này là expected behavior vì apiserver, etcd control plane, kube-proxy cần những cái đó. Nothing to alarm here.

namespace/default labeled
namespace/kube-node-lease labeled
namespace/kube-public labeled
Warning: kindnet-s4b45: non-default capabilities, host namespaces, hostPath volumes
Warning: kube-apiserver-kind-control-plane: host namespaces, hostPath volumes
Warning: etcd-kind-control-plane: host namespaces, hostPath volumes
Warning: kube-controller-manager-kind-control-plane: host namespaces, hostPath volumes
Warning: kube-scheduler-kind-control-plane: host namespaces, hostPath volumes
Warning: kube-proxy-m69hp: host namespaces, hostPath volumes, privileged
Warning: kube-proxy-gcm2c: host namespaces, hostPath volumes, privileged
Warning: kindnet-pvg4x: non-default capabilities, host namespaces, hostPath volumes
namespace/kube-system labeled
namespace/local-path-storage labeled

Áp dụng cho cả cluster thì sao

bạn cần config thêm cho API server, thêm path tới configuration dưới đây cho flag --admission-control-config-file

Đây là 1 ví dụ bạn bật baseline ở mode enforce lên tất cả namespaces trừ kube-system

apiVersion: apiserver.config.k8s.io/v1
kind: AdmissionConfiguration
plugins:
- name: DefaultPodSecurity
  configuration:
    apiVersion: pod-security.admission.config.k8s.io/v1alpha1
    kind: PodSecurityConfiguration
    defaults:
      enforce: "baseline"
      enforce-version: "latest"
    exemptions:
      usernames: []
      runtimeClassNames: []
      namespaces: [kube-system]

Để start thì bạn có thể bắt đầu với baseline. Sau đó có thể build thêm các policies thêm tùy theo nhu cầu của từng tổ chức :)

Happy hacking k8s :)