Tanzu Kubernetes 版本 v1.25 及更新版本啟用了網繭安全性許可 (PSA) 控制器。藉由 PSA,可使用命名空間標籤強制執行網繭安全性標準。

PSA 已在 TKR 1.25 及更新版本中啟用

網繭安全性許可控制器是一個 Kubernetes 控制器,用於將網繭安全性標準套用至 TKG 叢集上執行的網繭。依預設,Tanzu Kubernetes 版本 v1.25 及更新版本啟用了網繭安全性許可 (PSA) 控制器。PSA 控制器取代了已棄用並移除的網繭安全性原則 (PSP) 控制器。另請參閱為 TKR 1.24 及更早版本設定 PSP

Tanzu Kubernetes 版本 v1.25 是一個過渡版本,將 PSA 設定為發出警告。從 Tanzu Kubernetes 版本 v1.26 開始,將強制執行 PSA。您應該計劃將網繭工作負載從 PSP 移轉到 PSA,以便升級 TKG 叢集。請參閱從網繭安全性原則移轉到內建網繭安全性許可控制器以取得指引。

設定叢集範圍 PSA

從 vSphere 8 Update 3 開始,可以使用隨 v1beta1 API 一起提供的 podSecurityStandard ClusterClass 變數來設定叢集範圍 PSA。請參閱叢集 v1beta1 API

PSA 模式

PSA 控制器支援三種網繭安全性模式: enforceauditwarn。下表列出並說明每種 PSA 模式。
表 1. PSA 模式
模式 說明
enforce 安全性違規將導致網繭遭到拒絕。
audit 安全性違規將觸發向稽核記錄中記錄的事件新增稽核註解,但允許強制執行安全性。
warn 安全性違規將觸發面向使用者的警告,但允許強制執行安全性。

PSA 標準

PSA 控制器定義了三個級別的 網繭安全性標準,旨在涵蓋安全範圍。這些網繭安全性標準是累積的,範圍從允許到限制。下表列出並說明每種 PSA 標準。
表 2. PSA 標準
層級 說明
privileged 無限制控制,提供盡可能最廣泛的權限層級。此安全性標準允許已知的權限提升。
baseline 限制性最低的控制,可阻止已知的權限提升。此安全性標準允許預設 (最低限度指定) 網繭組態。
restricted 嚴格限制的控制,遵循目前的網繭強化最佳做法。

PSA 命名空間標籤

PSA 控制器在 Kubernetes 命名空間層級強制執行網繭安全性。。您可以使用命名空間標籤定義所需的 PSA 模式和層級,用於指定命名空間中的網繭。

Kubernetes 提供了一組標籤,可用於定義要用於命名空間的標準。您套用的標籤會定義在偵測到 PSA 違規時 Kubernetes 控制平面採取的動作。對於指定的 Kubernetes 命名空間,您可以設定任何或所有模式,或為不同的模式設定不同的層級。

PSA 命名空間標籤語法如下所示:
# MODE must be one of `enforce`, `audit`, or `warn`.
# LEVEL must be one of `privileged`, `baseline`, or `restricted`.
pod-security.kubernetes.io/<MODE>=<LEVEL>

還可以套用每個模式的版本標籤,用於將安全性標準固定到 Kubernetes 版本。如需詳細資訊,請參閱使用命名空間標籤強制執行網繭安全性標準

TKG 叢集的預設 PSA

依預設,對於非系統命名空間,使用 Tanzu Kubernetes 版本 v1.25 佈建的 TKG 叢集會將 PSA 模式 warnaudit 設定為 restricted。這是一個非強制設定:如果網繭違反安全性,PSA 控制器將產生警告和稽核通知,但不會拒絕該網繭。

依預設,對於非系統命名空間,使用 Tanzu Kubernetes 版本 v1.26 及更新版本佈建的 TKG 叢集會將 PSA 模式 enforce 設定為 restricted。如果網繭違反安全性,則會遭到拒絕。您必須在命名空間上設定 PSA,才能以較低的限制性控制執行網繭。
重要: kube-system、tkg-system 和 vmware-system-cloud-provider 命名空間中執行的某些系統網繭需要提升的權限。這些命名空間已從網繭安全性中排除。此外,無法變更系統命名空間上的網繭安全性。
下表列出了 TKG 叢集的預設 PSA 組態。
表 3. TKG 叢集的預設 PSA
TKr 版本 預設 PSA
TKr v1.25

模式:警告 | 層級:受限制

模式:稽核 | 層級:受限制

模式:強制執行 | 層級:未設定

TKr v1.26 及更新版本

模式:強制執行 | 層級:受限制

使用命名空間標籤設定 PSA

對於 Tanzu Kubernetes 版本 v1.25,請使用以下範例命令變更指定命名空間的安全性層級,以便不會產生 PSA 警告和稽核通知。
kubectl label --overwrite ns NAMESPACE pod-security.kubernetes.io/audit=privileged 
kubectl label --overwrite ns NAMESPACE pod-security.kubernetes.io/warn=privileged
對於 Tanzu Kubernetes 版本 v1.26 及更新版本,請使用以下範例命令將 PSA 標準從 restricted 降級到 baseline
kubectl label --overwrite ns NAMESPACE pod-security.kubernetes.io/enforce=baseline
例如,在預設命名空間上強制執行 baseline 標準:
kubectl label --overwrite ns default pod-security.kubernetes.io/enforce=baseline
對於 Tanzu Kubernetes 版本 v1.26 及更新版本,請使用以下範例命令將 PSA 標準從 restricted 降級到 privileged
kubectl label --overwrite ns NAMESPACE pod-security.kubernetes.io/enforce=privileged
例如,在預設命名空間上強制執行 privileged 標準:
kubectl label --overwrite ns default pod-security.kubernetes.io/enforce=privileged

對於 Tanzu Kubernetes 版本 v1.26 及更新版本,請使用以下範例命令對所有非系統命名空間放寬 PSA。

kubectl label --overwrite ns --all pod-security.kubernetes.io/enforce=privileged
kubectl label --overwrite ns --all pod-security.kubernetes.io/warn=restricted

為個別網繭設定安全性內容

如果您嘗試執行違反 PSA 的網繭,則會收到指明這一點的錯誤訊息。例如:
{"opType":"CREATE_POD","succeeded":false,"err":"creating pod example-pod: pods 
\"example-pod\" is forbidden: violates PodSecurity \"restricted:latest\": 
allowPrivilegeEscalation != false (container \"example-container\" must set 
securityContext.allowPrivilegeEscalation=false), unrestricted capabilities 
(container \"example-container\" must set securityContext.capabilities.drop=[\"ALL\"]), 
runAsNonRoot != true (pod or container \"example-container\" must set securityContext.runAsNonRoot=true), 
seccompProfile (pod or container \"example-container\" must set securityContext.seccompProfile.type to 
\"RuntimeDefault\" or \"Localhost\")","events":[]}
您可以為個別網繭設定安全性內容,而不是在整個命名空間上設定 PSA。若要允許執行個別網繭,可在網繭規格中按如下所示設定安全性內容:
apiVersion: v1
kind: Pod
metadata:
  name: example-pod 
spec:
  containers:
  - image: gcr.io/google_containers/busybox:1.24
    name: example-container
    command: ["/bin/sh", "-c", "echo 'hello' > /mnt/volume1/index.html && chmod o+rX /mnt /mnt/volume1/index.html && while true ; do sleep 2 ; done"]
    securityContext:
      allowPrivilegeEscalation: false
      runAsNonRoot: true
      seccompProfile:
        type: "RuntimeDefault"
      capabilities:
        drop: [all]
    volumeMounts:
    - name: example-volume-mount
      mountPath: /mnt/volume1
  restartPolicy: Never
  volumes:
  - name: example-volume
    persistentVolumeClaim:
    claimName: example-pvc