Kubernetes v1.37:通过绑定挂载选项和 EmptyDir 权限强化容器存储安全

💡 原文英文,约1200词,阅读约需5分钟。
📝

内容提要

Kubernetes v1.37 引入两项存储安全 Alpha 特性:卷挂载可设置 noexec、nosuid、nodev,防止在可写卷中执行任意二进制文件;emptyDir 支持 mode(如 01777 粘滞位限制跨容器删除文件,或 0750 限制访问)。需启用相应特性门控。

🔎

延伸解读

默认挂载的安全隐患

Kubernetes 默认将卷以 bind mount 方式挂载到容器,且不附加 noexec、nosuid、nodev 标志。这意味着即使容器根文件系统为只读,攻击者仍可在可写卷(如 emptyDir 或 PersistentVolume)中下载、赋予执行权限并运行任意二进制文件,从而绕过只读根文件系统的限制。新特性允许在卷挂载上直接设置这些标志,弥补了这一安全缺口。

emptyDir 权限模式的改进

此前 emptyDir 卷目录硬编码为 0777 权限,任何能发现该卷的进程都可读写删除文件,无论创建者是谁。虽然可通过 init 容器修改权限,但复杂且难以验证合规性。v1.37 引入 mode 字段,允许直接指定如 01777(粘滞位,仅文件所有者或 root 可删除)或 0750(限制特定用户和组访问),简化了安全配置。

典型应用场景

这些特性可解决多个安全场景:为临时工作区卷设置 noexec 和 nosuid,防止下载的恶意负载被执行或用于提权;在多容器 Pod 的共享工作区使用 mode: 01777,使各容器能独立写入但无法删除他人文件;为数据库临时存储设置 mode: 0750,确保只有特定用户和组可访问,实现最小权限原则。

使用前提与验证

两项特性在 v1.37 中均为 Alpha 阶段,需在 API 服务器和 kubelet 上启用 VolumeBindMountOptions 和 EmptyDirVolumeMode 特性门控。配置后可通过 kubectl exec 进入容器验证:在 noexec 卷上执行脚本会返回 Permission denied;在 01777 的 emptyDir 中,非文件所有者尝试删除文件会因粘滞位而被内核阻止。

Q&A

Kubernetes v1.37 新增了哪些存储安全特性?

Kubernetes v1.37 引入了两项存储安全 Alpha 特性:一是卷挂载支持设置 noexec、nosuid、nodev 绑定挂载选项,防止在可写卷中执行任意二进制文件;二是 emptyDir 卷支持设置 mode 权限模式,例如 01777 粘滞位限制跨容器删除文件,或 0750 限制访问。

为什么 Kubernetes 需要绑定挂载选项和 emptyDir 权限?

默认情况下,卷被容器运行时和 kubelet 绑定挂载到容器时没有 noexec、nosuid 或 nodev 标志,这可能削弱安全性。例如,缺少 noexec 时,被攻陷的进程可以利用任何可写卷下载、chmod +x 并执行任意二进制文件,即使容器根文件系统是只读的。emptyDir 卷默认以硬编码的 0777 模式创建目录,任何能发现该卷的进程都可以读、写、删除其中的任何内容。这些新特性提供了原生方式来加固卷挂载,以符合安全基准和策略。

如何为 emptyDir 卷设置权限模式来限制跨容器文件删除?

可以通过在 emptyDir 卷配置中设置 mode: 01777 来实现。这会给目录添加粘滞位,使得只有文件的所有者或 root 才能删除或重命名该目录中的文件,类似于 Unix 的 /tmp 目录。例如,在 Pod 的 volumes 部分定义 emptyDir: { mode: 01777 }。

如何为卷挂载设置 noexec 和 nosuid 选项?

在容器的 volumeMounts 中为特定挂载点添加 bindMountOptions 字段,并列出所需的选项,如 bindMountOptions: [noexec, nosuid]。例如,将 emptyDir 卷挂载到 /tmp 时设置这些选项,可以防止在该卷上执行二进制文件或使用 setuid 程序。

这些新特性在 Kubernetes v1.37 中处于什么阶段?如何启用?

这两项特性在 Kubernetes v1.37 中处于 Alpha 阶段,默认关闭。要使用它们,需要在 API 服务器和 kubelet 上启用特性门控 VolumeBindMountOptions 和 EmptyDirVolumeMode。

如何验证 emptyDir 的 01777 权限模式确实阻止了跨容器文件删除?

可以进入使用 01777 模式 emptyDir 的 Pod,以 guest 用户创建文件,然后尝试以 nobody 用户删除该文件。预期会看到 'Operation not permitted' 错误,因为粘滞位限制只有文件所有者才能删除文件。

🏷️

标签

➡️

继续阅读