Pod Security Policies

ACP 支持 Kubernetes Pod Security Admission (PSA) 和 Kyverno Policy,以帮助强制执行集群中运行的 Pod 的安全标准。

Pod Security Admission

参考官方 Kubernetes 文档:Pod Security Admission

Pod Security Admission (PSA) 是 Kubernetes 的一个准入控制器,通过验证 Pod 规范是否符合预定义标准,在命名空间级别强制执行安全策略。

安全模式

PSA 定义了三种模式来控制如何处理策略违规:

模式行为使用场景
Enforce拒绝创建/修改不合规的 Pod。需要严格安全执行的生产环境。
Audit允许创建 Pod,但在审计日志中记录违规。监控和分析安全事件,不阻止工作负载。
Warn允许创建 Pod,但向客户端返回违规警告。测试环境或策略调整的过渡阶段。

关键说明

  • Enforce 仅对 Pod 生效(例如拒绝 Pod,但允许非 Pod 资源如 Deployment)。
  • AuditWarn 同时适用于 Pod 及其控制器(例如 Deployment)。

安全标准

PSA 定义了三种安全标准来限制 Pod 权限:

标准描述主要限制
Privileged不受限制访问。适用于受信任的工作负载(例如系统组件)。不验证 securityContext 字段。
Baseline最小限制,防止已知的权限提升。阻止 hostNetworkhostPID、特权容器和不受限制的 hostPath 卷。
Restricted最严格的策略,执行安全最佳实践。要求:
- runAsNonRoot: true
- seccompProfile.type: RuntimeDefault
- 丢弃 Linux 能力。

配置

命名空间标签

通过为命名空间应用标签来定义 PSA 策略。

YAML 文件示例

apiVersion: v1
kind: Namespace
metadata:
  name: example-namespace
  labels:
    pod-security.kubernetes.io/enforce: restricted
    pod-security.kubernetes.io/audit: baseline
    pod-security.kubernetes.io/warn: baseline

CLI 命令

# 第一步:更新 Pod Admission 标签
kubectl label namespace <namespace-name> \
  pod-security.kubernetes.io/enforce=baseline \
  pod-security.kubernetes.io/audit=restricted \
  --overwrite

# 第二步:验证标签
kubectl get namespace <namespace-name> --show-labels

例外

对特定用户、命名空间或 runtimeClass 免除 PSA 检查。

示例配置

apiVersion: pod-security.admission.config.k8s.io/v1
kind: PodSecurityConfiguration
exemptions:
  usernames: ['admin']
  runtimeClasses: ['nvidia']
  namespaces: ['kube-system']

Kyverno Policy

ACP 提供了多个示例,用于创建 Pod 安全的 Kyverno 策略。示例包括:

  • Restricted:Restricted 拒绝访问所有主机特性,要求 Pod 使用分配给命名空间的 UID 和 SELinux 上下文运行。
  • Restricted-v2:Restricted-v2 拒绝访问所有主机特性,要求 Pod 使用分配给命名空间的 UID 和 SELinux 上下文运行。这是最严格的策略,默认用于认证用户。基于传统的 'restricted',还要求丢弃所有能力,不允许权限提升二进制文件。若未设置,则默认 seccomp 配置为 runtime/default,否则必须使用该 seccomp 配置。
  • Anyuid:Anyuid 提供了 restricted 策略的所有功能,但允许用户以任意 UID 和 GID 运行。
  • Hostaccess:Hostaccess 允许访问所有主机命名空间,但仍要求 Pod 使用分配给命名空间的 UID 和 SELinux 上下文运行。警告:此策略允许访问主机的命名空间、文件系统和 PID,仅应授予受信任的 Pod,谨慎授权。
  • Hostmount-anyuid:Hostmount-anyuid 提供了 restricted 策略的所有功能,但允许 Pod 使用主机挂载和任意 UID 运行。主要用于持久卷回收器。警告:此策略允许以任意 UID(包括 UID 0)访问主机文件系统,谨慎授权。
  • Hostnetwork:Hostnetwork 允许使用主机网络和主机端口,但仍要求 Pod 使用分配给命名空间的 UID 和 SELinux 上下文运行。
  • Hostnetwork-v2:Hostnetwork-v2 允许使用主机网络和主机端口,但仍要求 Pod 使用分配给命名空间的 UID 和 SELinux 上下文运行。基于传统的 'hostnetwork' 策略,还要求丢弃所有能力,不允许权限提升二进制文件。若未设置,则默认 seccomp 配置为 runtime/default,否则必须使用该 seccomp 配置。
  • Node-exporter:Node-exporter 策略用于 Prometheus 节点导出器。
  • Nonroot:Nonroot 提供了 restricted 策略的所有功能,但允许用户以任意非 root UID 运行。用户必须指定 UID,或者由容器运行时清单指定。
  • Nonroot-v2:Nonroot-v2 提供了 restricted 策略的所有功能,但允许用户以任意非 root UID 运行。用户必须指定 UID,或者由容器运行时清单指定。基于传统的 'nonroot' 策略,还要求丢弃所有能力,不允许权限提升二进制文件。若未设置,则默认 seccomp 配置为 runtime/default,否则必须使用该 seccomp 配置。
  • Privileged:Privileged 允许访问所有特权和主机特性,并能以任意用户、任意组、任意 fsGroup 以及任意 SELinux 上下文运行。警告:这是最宽松的策略,仅应用于集群管理,谨慎授权。
NOTICE

Restricted 策略不等同于 Kubernetes Pod Security Admission 的 'restricted' 标准。 如果您想使用 kyverno 的 Restricted 策略而非 Kubernetes Pod Security Admission 的 'restricted' 标准,可能需要更改您的 Pod 安全配置。

前提条件

  • 安装 Alauda Container Platform Compliance for Kyverno,参考文档:document
  • 在 ACP featuregate 设置中启用功能门控 namespace-resource-manage

应用 Kyverno 策略

Web 控制台

  1. 在 ACP 控制台,导航到 Container Platform,选择要应用安全策略的命名空间。
  2. 进入 Advanced > Resources
  3. 搜索资源类型名称为 Policy,资源组为 kyverno.io 的资源。
  4. 选择版本 "v2beta1",点击 Create 创建新的 Kyverno Policy。
  5. Create Resource 对话框中,选择 Samples 标签页。
  6. 选择所需的 Pod 安全策略示例(例如 Restricted),然后点击 Try
  7. 审核并根据需要修改策略 YAML,点击 Update 应用策略。

CLI

  1. 登录到要应用安全策略的 Kubernetes 集群。

  2. 运行以下命令从示例资源创建 Kyverno Policy:

    $ kubectl get consoleyamlsamples.console.alauda.io restricted-policy -otemplate --template={{.spec.yaml}}|kubectl apply -f -
    $ kubectl get policies.kyverno.io
    NAME         ADMISSION   BACKGROUND   READY   AGE   MESSAGE
    restricted   true        true         True    1m   Ready

可用的示例资源包括:

  • restricted-policy
  • restrictedv2-policy
  • anyuid-policy
  • hostaccess-policy
  • hostmount-anyuid-policy
  • hostnetwork-policy
  • hostnetwork-v2-policy
  • node-exporter-policy
  • nonroot-policy
  • nonroot-v2-policy
  • privileged-policy