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 模式
enforce
、
audit
和
warn
。下表列出并介绍了每种 PSA 模式。
模式 | 描述 |
---|---|
enforce |
安全违规将导致 Pod 被拒绝。 |
audit |
安全违规将触发向审核日志中记录的事件添加审核注释,但除此以外允许违规。 |
warn |
安全违规将触发面向用户的警告,但除此以外允许违规。 |
PSA 标准
级别 | 描述 |
---|---|
privileged |
无限制控制,提供尽可能最广泛的权限级别。此安全标准允许已知的特权提升。 |
baseline |
限制性最低的控制,阻止已知的特权提升。此安全标准允许默认(最低限度指定)Pod 配置。 |
restricted |
严格限制的控制,遵循 Pod 强化最佳做法。 |
PSA 命名空间标签
PSA 控制器在 Kubernetes 命名空间级别实施 Pod 安全。您可以使用命名空间标签定义所需的 PSA 模式和级别,用于给定命名空间中的 Pod。
Kubernetes 提供了一组标签,可用于定义要用于命名空间的标准。您应用的标签定义在检测到 PSA 冲突时 Kubernetes 控制平面采取的操作。对于给定的 Kubernetes 命名空间,您可以配置任何或所有模式,也可以为不同的模式设置不同的级别。
# 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 模式 warn
和 audit
设置为 restricted
。这是一个非强制设置:如果 Pod 违反安全性,PSA 控制器将生成警告和审核通知,但不会拒绝该 Pod。
enforce
设置为
restricted
。如果 Pod 违反安全性,则会将其拒绝。您必须在命名空间上配置 PSA,才能以较低的限制性控制权运行 Pod。
TKr 版本 | 默认 PSA |
---|---|
TKr v1.25 | 模式:warn | 级别:restricted 模式:audit | 级别:restricted 模式:enforce | 级别:未设置 |
TKr v1.26 及更高版本 | 模式:enforce | 级别:restricted |
使用命名空间标签配置 PSA
kubectl label --overwrite ns NAMESPACE pod-security.kubernetes.io/audit=privileged kubectl label --overwrite ns NAMESPACE pod-security.kubernetes.io/warn=privileged
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
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 配置安全上下文
{"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":[]}
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