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 规格。

Security Modes

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

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

关键说明:

  • Enforce 仅作用于 Pod(例如,拒绝 Pod,但允许 Deployment 等非 Pod 资源)。
  • Audit 和 Warn 同时适用于 Pod 及其控制器(例如,Deployment)。

Security Standards

PSA 定义了三种安全标准,用于限制 Pod 权限:

标准说明主要限制
Privileged不受限制的访问权限。适用于受信任的工作负载(例如,系统组件)。不验证 securityContext 字段。
Baseline采用最低限度的限制,防止已知的权限提升。阻止 hostNetwork、hostPID、特权容器以及不受限制的 hostPath 卷。
Restricted最严格的策略,强制执行安全最佳实践。要求:
- runAsNonRoot: true
- seccompProfile.type: RuntimeDefault
- 删除 Linux capabilities。

Configuration

Namespace Labels

为命名空间应用标签以定义 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 命令

# Step 1: Update Pod Admission labels
kubectl label namespace <namespace-name> \
  pod-security.kubernetes.io/enforce=baseline \
  pod-security.kubernetes.io/audit=restricted \
  --overwrite

# Step 2: Verify labels
kubectl get namespace <namespace-name> --show-labels

Exemptions

将特定用户、命名空间或运行时类排除在 PSA 检查之外。

配置示例:

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

Kyverno 策略

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

  • Restricted:Restricted 拒绝访问所有主机功能,并要求 Pod 使用分配给该命名空间的 UID 和 SELinux 上下文运行。
  • Restricted-v2:Restricted-v2 拒绝访问所有主机功能,并要求 Pod 使用分配给该命名空间的 UID 和 SELinux 上下文运行。这是限制最严格的策略,默认用于经过身份验证的用户。除了继承旧版的“restricted”策略要求外,它还要求删除 ALL capabilities,并且不允许使用权限提升二进制文件。如果未设置 seccomp 配置文件,它还会将其默认为 runtime/default;否则,必须使用此 seccomp 配置文件。
  • Anyuid:Anyuid 提供 Restricted 策略的所有功能,但允许用户使用任意 UID 和任意 GID 运行。
  • Hostaccess:Hostaccess 允许访问所有主机命名空间,但仍要求 Pod 使用分配给该命名空间的 UID 和 SELinux 上下文运行。警告:此策略允许访问主机命名空间、文件系统和 PIDS。仅应将其用于受信任的 Pod。请谨慎授予。
  • Hostmount-anyuid:Hostmount-anyuid 提供 Restricted 策略的所有功能,但允许 Pod 使用主机挂载和任意 UID。此策略主要供持久卷回收器使用。警告:此策略允许以任意 UID(包括 UID 0)访问主机文件系统。请谨慎授予。
  • Hostnetwork:Hostnetwork 允许使用主机网络和主机端口,但仍要求 Pod 使用分配给该命名空间的 UID 和 SELinux 上下文运行。
  • Hostnetwork-v2:Hostnetwork-v2 允许使用主机网络和主机端口,但仍要求 Pod 使用分配给该命名空间的 UID 和 SELinux 上下文运行。除了继承旧版的“hostnetwork”策略要求外,它还要求删除 ALL capabilities,并且不允许使用权限提升二进制文件。如果未设置 seccomp 配置文件,它还会将其默认为 runtime/default;否则,必须使用此 seccomp 配置文件。
  • Node-exporter:Node-exporter 策略用于 Prometheus node exporter。
  • Nonroot:Nonroot 提供 Restricted 策略的所有功能,但允许用户使用任意非 root UID 运行。用户必须指定 UID,或者必须在容器运行时的清单中指定 UID。
  • Nonroot-v2:Nonroot-v2 提供 Restricted 策略的所有功能,但允许用户使用任意非 root UID 运行。用户必须指定 UID,或者必须在容器运行时的清单中指定 UID。除了继承旧版的“nonroot”策略要求外,它还要求删除 ALL capabilities,并且不允许使用权限提升二进制文件。如果未设置 seccomp 配置文件,它还会将其默认为 runtime/default;否则,必须使用此 seccomp 配置文件。
  • Privileged:Privileged 允许访问所有特权功能和主机功能,并能够以任意用户、任意组、任意 fsGroup 以及任意 SELinux 上下文运行。警告:这是限制最宽松的策略,仅应供集群管理使用。请谨慎授予。
注意

Restricted 策略不等同于 Kubernetes Pod Security Admission 的“restricted”标准。 如果要使用 Kyverno 的 Restricted 策略,而不是 Kubernetes Pod Security Admission 的“restricted”标准,可能需要更改 Pod 安全配置。

前提条件

  • 安装 Alauda Container Platform Policy Management(之前称为 Alauda Container Platform Compliance for Kyverno),请参阅文档。
  • 在 ACP featuregate 设置中启用功能门 namespace-resource-manage。

应用 Kyverno 策略

Web 控制台

  1. 在 ACP 控制台中,导航到 Container Platform,选择要应用安全策略的命名空间。
  2. 转到 Advanced > Resources。
  3. 搜索资源类型名称为 Policy 的资源,即组 kyverno.io 中的 Policy 资源。
  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