Pod 安全标准
详细了解 Pod 安全标准中定义的各种策略级别。
Pod 安全标准定义了三种不同的**策略**,以广泛覆盖安全范围。这些策略是**累积的**,范围从高度宽松到高度限制。本指南概述了每项策略的要求。
配置文件 | 描述 |
---|
特权 | 不受限制的策略,提供最广泛的权限级别。此策略允许已知的权限提升。 |
基线 | 限制最少的策略,可防止已知的权限提升。允许默认(最低限度指定)Pod 配置。 |
受限 | 严格受限的策略,遵循当前的 Pod 强化最佳实践。 |
配置文件详情
特权
**“特权”策略是刻意开放的,并且完全不受限制。** 此类策略通常针对由特权、受信任用户管理的系统和基础设施级别工作负载。
特权策略的定义是没有限制。如果定义 Pod 时应用了特权安全策略,那么所定义的 Pod 能够绕过典型的容器隔离机制。例如,你可以定义一个可以访问节点主机网络的 Pod。
基线
**基线策略旨在方便常见的容器化工作负载的采用,同时防止已知的权限提升。** 此策略面向非关键应用程序的应用程序操作员和开发人员。应强制执行/禁止以下列出的控制:
注意
在此表中,通配符 (*
) 表示列表中的所有元素。例如,spec.containers[*].securityContext
指的是**所有已定义容器**的 Security Context 对象。如果任何列出的容器未能满足要求,整个 Pod 将无法通过验证。基线策略规范控制 | 策略 |
---|
主机进程 | Windows Pod 提供了运行 HostProcess 容器 的能力,从而可以对 Windows 主机进行特权访问。基线策略禁止对主机的特权访问。 功能状态: Kubernetes v1.26 [stable] 受限字段 spec.securityContext.windowsOptions.hostProcess spec.containers[*].securityContext.windowsOptions.hostProcess spec.initContainers[*].securityContext.windowsOptions.hostProcess spec.ephemeralContainers[*].securityContext.windowsOptions.hostProcess
允许值 |
主机命名空间 | 必须禁止共享主机命名空间。 受限字段 spec.hostNetwork spec.hostPID spec.hostIPC
允许值 |
特权容器 | 特权 Pod 禁用大多数安全机制,必须予以禁止。 受限字段 spec.containers[*].securityContext.privileged spec.initContainers[*].securityContext.privileged spec.ephemeralContainers[*].securityContext.privileged
允许值 |
能力 | 必须禁止添加除以下列出的能力之外的额外能力。 受限字段 spec.containers[*].securityContext.capabilities.add spec.initContainers[*].securityContext.capabilities.add spec.ephemeralContainers[*].securityContext.capabilities.add
允许值 - 未定义/空
AUDIT_WRITE CHOWN DAC_OVERRIDE FOWNER FSETID KILL MKNOD NET_BIND_SERVICE SETFCAP SETGID SETPCAP SETUID SYS_CHROOT
|
HostPath 卷 | 必须禁止 HostPath 卷。 受限字段 允许值 |
主机端口 | 主机端口应完全禁用(推荐)或限制为已知列表。 受限字段 spec.containers[*].ports[*].hostPort spec.initContainers[*].ports[*].hostPort spec.ephemeralContainers[*].ports[*].hostPort
允许值 |
主机探测 / 生命周期钩子 (v1.34+) | 必须禁止探测和生命周期钩子中的 Host 字段。 受限字段 spec.containers[*].livenessProbe.httpGet.host spec.containers[*].readinessProbe.httpGet.host spec.containers[*].startupProbe.httpGet.host spec.containers[*].livenessProbe.tcpSocket.host spec.containers[*].readinessProbe.tcpSocket.host spec.containers[*].startupProbe.tcpSocket.host spec.containers[*].lifecycle.postStart.tcpSocket.host spec.containers[*].lifecycle.preStop.tcpSocket.host spec.containers[*].lifecycle.postStart.httpGet.host spec.containers[*].lifecycle.preStop.httpGet.host spec.initContainers[*].livenessProbe.httpGet.host spec.initContainers[*].readinessProbe.httpGet.host spec.initContainers[*].startupProbe.httpGet.host spec.initContainers[*].livenessProbe.tcpSocket.host spec.initContainers[*].readinessProbe.tcpSocket.host spec.initContainers[*].startupProbe.tcpSocket.host spec.initContainers[*].lifecycle.postStart.tcpSocket.host spec.initContainers[*].lifecycle.preStop.tcpSocket.host spec.initContainers[*].lifecycle.postStart.httpGet.host spec.initContainers[*].lifecycle.preStop.httpGet.host
允许值 |
AppArmor | 在支持的主机上,默认应用 `RuntimeDefault` AppArmor 配置文件。基线策略应阻止覆盖或禁用默认 AppArmor 配置文件,或将覆盖限制为一组允许的配置文件。 受限字段 spec.securityContext.appArmorProfile.type spec.containers[*].securityContext.appArmorProfile.type spec.initContainers[*].securityContext.appArmorProfile.type spec.ephemeralContainers[*].securityContext.appArmorProfile.type
允许值 - 未定义/空
RuntimeDefault Localhost
metadata.annotations["container.apparmor.security.beta.kubernetes.io/*"]
允许值 - 未定义/空
runtime/default localhost/*
|
SELinux | SELinux 类型的设置受到限制,并且禁止设置自定义 SELinux 用户或角色选项。 受限字段 spec.securityContext.seLinuxOptions.type spec.containers[*].securityContext.seLinuxOptions.type spec.initContainers[*].securityContext.seLinuxOptions.type spec.ephemeralContainers[*].securityContext.seLinuxOptions.type
允许值 - 未定义/""
container_t container_init_t container_kvm_t container_engine_t (自 Kubernetes 1.31 起)
受限字段 spec.securityContext.seLinuxOptions.user spec.containers[*].securityContext.seLinuxOptions.user spec.initContainers[*].securityContext.seLinuxOptions.user spec.ephemeralContainers[*].securityContext.seLinuxOptions.user spec.securityContext.seLinuxOptions.role spec.containers[*].securityContext.seLinuxOptions.role spec.initContainers[*].securityContext.seLinuxOptions.role spec.ephemeralContainers[*].securityContext.seLinuxOptions.role
允许值 |
/proc 挂载类型 | 默认的 /proc 掩码旨在减少攻击面,应作为强制要求。 受限字段 spec.containers[*].securityContext.procMount spec.initContainers[*].securityContext.procMount spec.ephemeralContainers[*].securityContext.procMount
允许值 |
Seccomp | Seccomp 配置文件不得明确设置为 Unconfined 。 受限字段 spec.securityContext.seccompProfile.type spec.containers[*].securityContext.seccompProfile.type spec.initContainers[*].securityContext.seccompProfile.type spec.ephemeralContainers[*].securityContext.seccompProfile.type
允许值 - 未定义/空
RuntimeDefault Localhost
|
Sysctls | Sysctls 可以禁用安全机制或影响主机上的所有容器,因此除了允许的“安全”子集外,应予以禁止。如果 sysctl 在容器或 Pod 中命名空间隔离,并且与同一节点上的其他 Pod 或进程隔离,则视为安全。 受限字段 spec.securityContext.sysctls[*].name
允许值 - 未定义/空
kernel.shm_rmid_forced net.ipv4.ip_local_port_range net.ipv4.ip_unprivileged_port_start net.ipv4.tcp_syncookies net.ipv4.ping_group_range net.ipv4.ip_local_reserved_ports (自 Kubernetes 1.27 起)net.ipv4.tcp_keepalive_time (自 Kubernetes 1.29 起)net.ipv4.tcp_fin_timeout (自 Kubernetes 1.29 起)net.ipv4.tcp_keepalive_intvl (自 Kubernetes 1.29 起)net.ipv4.tcp_keepalive_probes (自 Kubernetes 1.29 起)
|
受限
**受限策略旨在以牺牲一些兼容性为代价,强制执行当前的 Pod 强化最佳实践。** 它针对安全关键应用程序的运营商和开发人员,以及较低信任度的用户。应强制执行/禁止以下列出的控制:
注意
在此表中,通配符 (*
) 表示列表中的所有元素。例如,spec.containers[*].securityContext
指的是**所有已定义容器**的 Security Context 对象。如果任何列出的容器未能满足要求,整个 Pod 将无法通过验证。受限策略规范控制 | 策略 |
基线策略的所有内容 |
卷类型 | 受限策略只允许以下卷类型。 受限字段 允许值 spec.volumes[*] 列表中的每个项都必须将以下字段之一设置为非空值。spec.volumes[*].configMap spec.volumes[*].csi spec.volumes[*].downwardAPI spec.volumes[*].emptyDir spec.volumes[*].ephemeral spec.volumes[*].persistentVolumeClaim spec.volumes[*].projected spec.volumes[*].secret
|
权限提升 (v1.8+) | 不应允许权限提升(例如通过 set-user-ID 或 set-group-ID 文件模式)。这是 v1.25+ 中的 Linux 专用策略 (spec.os.name != windows) 受限字段 spec.containers[*].securityContext.allowPrivilegeEscalation spec.initContainers[*].securityContext.allowPrivilegeEscalation spec.ephemeralContainers[*].securityContext.allowPrivilegeEscalation
允许值 |
以非 root 用户身份运行 | 容器必须被要求以非 root 用户身份运行。 受限字段 spec.securityContext.runAsNonRoot spec.containers[*].securityContext.runAsNonRoot spec.initContainers[*].securityContext.runAsNonRoot spec.ephemeralContainers[*].securityContext.runAsNonRoot
允许值 如果 Pod 级别的 spec.securityContext.runAsNonRoot 设置为 true ,则容器字段可以未定义/nil 。 |
以非 root 用户身份运行 (v1.23+) | 容器不得设置runAsUser为 0 受限字段 spec.securityContext.runAsUser spec.containers[*].securityContext.runAsUser spec.initContainers[*].securityContext.runAsUser spec.ephemeralContainers[*].securityContext.runAsUser
允许值 |
Seccomp (v1.19+) | Seccomp 配置文件必须明确设置为其中一个允许值。禁止使用 Unconfined 配置文件和**缺少**配置文件。*这是 v1.25+ 中的 Linux 专用策略 (spec.os.name != windows) * 受限字段 spec.securityContext.seccompProfile.type spec.containers[*].securityContext.seccompProfile.type spec.initContainers[*].securityContext.seccompProfile.type spec.ephemeralContainers[*].securityContext.seccompProfile.type
允许值 如果 Pod 级别的 spec.securityContext.seccompProfile.type 字段已正确设置,则容器字段可以未定义/nil 。反之,如果**所有**容器级别的字段都已设置,则 Pod 级别的字段可以未定义/nil 。 |
能力 (v1.22+) | 容器必须丢弃 ALL 能力,并且只允许重新添加 NET_BIND_SERVICE 能力。*这是 v1.25+ 中的 Linux 专用策略 (.spec.os.name != "windows") * 受限字段 spec.containers[*].securityContext.capabilities.drop spec.initContainers[*].securityContext.capabilities.drop spec.ephemeralContainers[*].securityContext.capabilities.drop
允许值
受限字段 spec.containers[*].securityContext.capabilities.add spec.initContainers[*].securityContext.capabilities.add spec.ephemeralContainers[*].securityContext.capabilities.add
允许值 |
策略实例化
将策略定义与策略实例化分离,有助于跨集群对策略形成共同理解和一致的语言,而与底层强制机制无关。
随着机制的成熟,它们将根据策略在下面定义。此处未定义单个策略的强制方法。
Pod 安全准入控制器
替代方案
**注意:** 本节链接到提供 Kubernetes 所需功能的第三方项目。Kubernetes 项目作者不对这些按字母顺序列出的项目负责。要将项目添加到此列表,请在提交更改之前阅读
内容指南。
更多信息。Kubernetes 生态系统中正在开发其他用于强制执行策略的替代方案,例如
Pod OS 字段
Kubernetes 允许你使用运行 Linux 或 Windows 的节点。你可以在一个集群中混合使用这两种节点。Kubernetes 中的 Windows 在某些方面存在局限性,并与基于 Linux 的工作负载有所不同。具体而言,许多 Pod 的 securityContext
字段 对 Windows 无效。
注意
v1.24 之前的 Kubelets 不会强制执行 Pod OS 字段,如果集群中的节点版本早于 v1.24,受限策略应固定在 v1.25 之前的版本。受限的 Pod 安全标准更改
Kubernetes v1.25 中的另一个重要变化是,**受限**策略已更新,以使用 pod.spec.os.name
字段。根据 OS 名称,可以为其他 OS 放宽某些特定于特定 OS 的策略。
操作系统特定策略控制
以下控制的限制仅在 .spec.os.name
不是 windows
时才需要:
用户命名空间
用户命名空间是 Linux 专有的功能,用于以更高的隔离度运行工作负载。它们与 Pod 安全标准如何协同工作在使用用户命名空间的 Pod 文档中有所描述。
常见问题
为什么在特权和基线之间没有配置文件?
此处定义的三种配置文件具有从最安全(受限)到最不安全(特权)的清晰线性演进,并涵盖了广泛的工作负载。高于基线策略所需的特权通常非常特定于应用程序,因此我们不在此领域提供标准配置文件。这并不是说在这种情况下应始终使用特权配置文件,而是说该领域中的策略需要根据具体情况进行定义。
如果未来出现对其他配置文件的明确需求,SIG Auth 可能会重新考虑此立场。
安全配置文件和安全上下文有什么区别?
安全上下文在运行时配置 Pod 和容器。安全上下文在 Pod 清单中作为 Pod 和容器规范的一部分进行定义,表示容器运行时的参数。
安全配置文件是控制平面机制,用于强制执行安全上下文中的特定设置,以及安全上下文之外的其他相关参数。截至 2021 年 7 月,Pod 安全策略已弃用,取而代之的是内置的 Pod 安全准入控制器。
沙盒 Pod 怎么样?
目前还没有一个 API 标准来控制 Pod 是否被认为是沙盒的。沙盒 Pod 可以通过使用沙盒运行时(例如 gVisor 或 Kata Containers)来识别,但没有沙盒运行时的标准定义。
沙盒工作负载所需的保护措施可能与其他工作负载不同。例如,当工作负载与底层内核隔离时,限制特权权限的需求就会降低。这使得需要更高权限的工作负载仍然可以被隔离。
此外,沙盒工作负载的保护高度依赖于沙盒方法。因此,没有单一的推荐配置文件适用于所有沙盒工作负载。
本页上的项目是指提供 Kubernetes 所需功能的第三方产品或项目。Kubernetes 项目作者不对这些第三方产品或项目负责。有关更多详细信息,请参阅 CNCF 网站指南。
在提议添加额外第三方链接的更改之前,你应该阅读内容指南。