Tanzu Kubernetes 版本 v1.25 及更高版本支持 Pod 安全准入 (PSA) 控制器。借助 PSA,可以使用命名空间标签统一实施 Pod 安全。

PSA 已在 TKR 1.25 及更高版本中实现

Pod 安全准入控制器是一个 Kubernetes 控制器,用于将安全标准应用于 TKG 集群上运行的 Pod。默认情况下,Tanzu Kubernetes 版本 v1.25 及更高版本支持 Pod 安全准入 (PSA) 控制器。PSA 控制器取代了已弃用并移除的 Pod 安全策略 (PSP) 控制器。另请参见 为 TKR 1.24 及更低版本配置 PSP

Tanzu Kubernetes 版本 v1.25 是一个过渡版本,将 PSA 配置为发出警告。从 Tanzu Kubernetes 版本 v1.26 开始,将实施 PSA。您应该计划将 Pod 工作负载从 PSP 迁移到 PSA,以便升级 TKG 集群。有关指导,请参阅从 Pod 安全策略迁移到内置 Pod 安全准入控制器

配置集群范围 PSA

从 vSphere 8 Update 3 开始,可以使用随 v1beta1 API 一起提供的 podSecurityStandard ClusterClass 变量来配置集群范围 PSA。请参见集群 v1beta1 API

PSA 模式

PSA 控制器支持三种 Pod 安全模式: enforceauditwarn。下表列出并介绍了每种 PSA 模式。
表 1. PSA 模式
模式 描述
enforce 安全违规将导致 Pod 被拒绝。
audit 安全违规将触发向审核日志中记录的事件添加审核注释,但除此以外允许违规。
warn 安全违规将触发面向用户的警告,但除此以外允许违规。

PSA 标准

PSA 控制器定义了三个级别的 Pod 安全标准,旨在涵盖安全范围。这些 Pod 安全标准逐级递增,范围从宽松到限制。下表列出并介绍了每个 PSA 标准。
表 2. PSA 标准
级别 描述
privileged 无限制控制,提供尽可能最广泛的权限级别。此安全标准允许已知的特权提升。
baseline 限制性最低的控制,阻止已知的特权提升。此安全标准允许默认(最低限度指定)Pod 配置。
restricted 严格限制的控制,遵循 Pod 强化最佳做法。

PSA 命名空间标签

PSA 控制器在 Kubernetes 命名空间级别实施 Pod 安全。您可以使用命名空间标签定义所需的 PSA 模式和级别,用于给定命名空间中的 Pod。

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 版本。有关详细信息,请参见使用命名空间标签实施 Pod 安全标准

TKG 集群的默认 PSA

对于非系统命名空间,默认情况下,使用 Tanzu Kubernetes 版本 v1.25 置备的 TKG 集群将 PSA 模式 warnaudit 设置为 restricted。这是一个非强制设置:如果 Pod 违反安全性,PSA 控制器将生成警告和审核通知,但不会拒绝该 Pod。

对于非系统命名空间,默认情况下,使用 Tanzu Kubernetes 版本 v1.26 及更高版本置备的 TKG 集群将 PSA 模式 enforce 设置为 restricted。如果 Pod 违反安全性,则会将其拒绝。您必须在命名空间上配置 PSA,才能以较低的限制性控制权运行 Pod。
重要说明: 在 kube-system 、tkg-system 和 vmware-system-cloud-provider 命名空间中运行的某些系统 Pod 需要提升的特权。将从 Pod 安全性中排除这些命名空间。此外,无法更改系统命名空间上的 Pod 安全性。
下表列出了 TKG 集群的默认 PSA 配置。
表 3. TKG 集群的默认 PSA
TKr 版本 默认 PSA
TKr v1.25

模式:warn | 级别:restricted

模式:audit | 级别:restricted

模式:enforce | 级别:未设置

TKr v1.26 及更高版本

模式:enforce | 级别:restricted

使用命名空间标签配置 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

为单个 Pod 配置安全上下文

如果您尝试运行违反 PSA 的 Pod,则会收到指明这一点的错误消息。例如:
{"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":[]}
您可以为单个 Pod 配置安全上下文,而不是在整个命名空间上设置 PSA。要允许运行单个 Pod,请在 Pod 规范中按以下方式设置安全上下文:
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