Pod 安全标准
详细了解 Pod 安全标准中定义的不同策略级别。
Pod 安全标准定义了三种不同的 *策略*,以广泛覆盖安全范围。这些策略是 *累积* 的,从高度宽松到高度严格。本指南概述了每种策略的要求。
配置文件 | 描述 |
---|
特权 | 不受限制的策略,提供尽可能广泛的权限级别。此策略允许已知的特权提升。 |
基线 | 最小限度限制策略,可防止已知的特权提升。允许默认(最小指定)Pod 配置。 |
受限 | 高度受限的策略,遵循当前的 Pod 加固最佳实践。 |
配置文件详情
特权
**特权 策略是故意开放的,完全不受限制。** 此类型的策略通常针对由特权的、受信任的用户管理的系统级和基础设施级工作负载。
特权策略由没有限制来定义。如果您定义一个 Pod,其中应用了特权安全策略,那么您定义的 Pod 能够绕过典型的容器隔离机制。例如,您可以定义一个 Pod,它可以访问节点的主机网络。
基线
**基线 策略旨在简化常见容器化工作负载的采用,同时防止已知的特权提升。** 此策略针对非关键应用程序的应用程序运营商和开发人员。以下列出的控制应强制执行/禁止
注意
在此表中,通配符 (*
) 表示列表中的所有元素。例如,spec.containers[*].securityContext
指的是 *所有已定义容器* 的安全上下文对象。如果任何列出的容器无法满足要求,则整个 Pod 将验证失败。基线策略规范控制 | 策略 |
---|
HostProcess | Windows Pod 提供运行 HostProcess 容器 的能力,这使得能够对 Windows 主机进行特权访问。基线策略不允许对主机进行特权访问。 功能状态: Kubernetes v1.26 [稳定] 受限字段 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
允许的值 - 未定义/nil
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
允许的值 |
AppArmor | 在支持的主机上,RuntimeDefault AppArmor 配置文件默认情况下会被应用。基线策略应该阻止覆盖或禁用默认 AppArmor 配置文件,或者将覆盖限制为允许的配置文件集。 受限字段 spec.securityContext.appArmorProfile.type spec.containers[*].securityContext.appArmorProfile.type spec.initContainers[*].securityContext.appArmorProfile.type spec.ephemeralContainers[*].securityContext.appArmorProfile.type
允许的值 - 未定义/nil
RuntimeDefault Localhost
metadata.annotations["container.apparmor.security.beta.kubernetes.io/*"]
允许的值 - 未定义/nil
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
允许的值 - 未定义/nil
RuntimeDefault Localhost
|
Sysctls | Sysctls 可以禁用安全机制或影响主机上的所有容器,因此应禁止,除非允许使用“安全”子集。如果 sysctl 在容器或 Pod 中具有命名空间,并且与同一节点上的其他 Pod 或进程隔离,则它被认为是安全的。 受限字段 spec.securityContext.sysctls[*].name
允许的值 - 未定义/nil
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
指的是 *所有已定义容器* 的安全上下文对象。如果任何列出的容器无法满足要求,则整个 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 操作系统字段
Kubernetes 允许您使用运行 Linux 或 Windows 的节点。您可以在一个集群中混合使用这两种类型的节点。Kubernetes 中的 Windows 与基于 Linux 的工作负载相比,存在一些限制和差异。具体来说,许多 Pod 的 securityContext
字段 对 Windows 没有影响。
注意
v1.24 之前的 Kubelet 不强制执行 pod OS 字段,如果集群中存在低于 v1.24 版本的节点,则应将 Restricted 策略固定到 v1.25 之前的版本。Restricted Pod 安全标准变更
Kubernetes v1.25 中的另一个重要变更,是 Restricted 策略已更新为使用 pod.spec.os.name
字段。根据 OS 名称,可以为其他 OS 放宽特定于特定 OS 的某些策略。
特定于 OS 的策略控制
只有当 .spec.os.name
不是 windows
时,才需要对以下控制进行限制
用户命名空间
用户命名空间是 Linux 独有的功能,用于以更高的隔离性运行工作负载。它们与 Pod 安全标准的协同工作方式在 使用用户命名空间的 Pod 文档 中进行了描述。
常见问题解答
为什么没有在特权和基线之间定义配置文件?
此处定义的三个配置文件具有从最安全 (Restricted) 到最不安全 (Privileged) 的清晰线性进展,并涵盖了广泛的工作负载。超出基线策略所需的权限通常非常特定于应用程序,因此我们不提供此领域的标准配置文件。这并不意味着在这种情况下应该始终使用特权配置文件,而是说此范围内的策略需要逐案定义。
如果出现对其他配置文件的明确需求,SIG Auth 可能会在未来重新考虑此立场。
安全配置文件和安全上下文有什么区别?
安全上下文 在运行时配置 Pod 和容器。安全上下文是在 Pod 清单文件中 Pod 和容器规范的一部分定义的,代表传递给容器运行时的参数。
安全配置文件是控制平面机制,用于在安全上下文中以及安全上下文之外的其他相关参数中强制执行特定设置。截至 2021 年 7 月,Pod 安全策略 已被内置的 Pod 安全准入控制器 取代。
沙箱 Pod 怎么样?
目前没有控制 Pod 是否被视为沙箱的 API 标准。沙箱 Pod 可以通过使用沙箱运行时 (例如 gVisor 或 Kata Containers) 来识别,但没有对沙箱运行时的标准定义。
沙箱工作负载所需的保护措施可能与其他工作负载不同。例如,当工作负载与底层内核隔离时,限制特权权限的需求会减少。这允许需要更高权限的工作负载仍然保持隔离。
此外,沙箱工作负载的保护高度依赖于沙箱方法。因此,不推荐所有沙箱工作负载使用单个推荐配置文件。
此页面上的项目引用了提供 Kubernetes 所需功能的第三方产品或项目。Kubernetes 项目作者不对这些第三方产品或项目负责。有关更多详细信息,请参阅 CNCF 网站指南。
在提出添加额外第三方链接的更改之前,您应该阅读 内容指南。