Kubernetes 1.30:阻止未经授权的卷模式转换功能升至 GA
随着 Kubernetes 1.30 的发布,防止修改从 Kubernetes 集群中现有 VolumeSnapshot 创建的 PersistentVolumeClaim 的卷模式的功能已正式发布!
问题
PersistentVolumeClaim 的 卷模式 (Volume Mode) 指的是存储设备上的底层卷是以文件系统格式化,还是以原始块设备的形式呈现给使用该卷的 Pod。
用户可以利用从 Kubernetes v1.20 开始稳定的 VolumeSnapshot 功能,从 Kubernetes 集群中的现有 VolumeSnapshot 创建 PersistentVolumeClaim(简称 PVC)。PVC 规范包含一个 dataSource 字段,该字段可以指向一个现有的 VolumeSnapshot 实例。有关如何从 Kubernetes 集群中的现有 VolumeSnapshot 创建 PVC 的更多详细信息,请访问从 Volume Snapshot 创建 PersistentVolumeClaim。
利用上述功能时,没有逻辑来验证原始卷(已创建快照)的模式是否与新创建卷的模式匹配。
这带来了安全漏洞,恶意用户可能借此利用主机操作系统中尚未发现的漏洞。
存在允许某些用户执行此类转换的有效用例。通常,存储备份供应商在备份操作过程中会转换卷模式,以便检索更改的块,从而提高操作效率。这使得 Kubernetes 不能完全阻止此类操作,同时也带来了区分受信任用户和恶意用户的挑战。
防止未经授权的用户转换卷模式
在此上下文中,授权用户是指有权对 VolumeSnapshotContents 执行 update 或 patch 操作的用户,VolumeSnapshotContents 是一种集群级资源。
集群管理员负责仅将这些权限授予受信任的用户或应用程序,例如备份供应商。除了这些授权用户外,任何其他用户在从 VolumeSnapshot 创建 PVC 时都将不允许修改卷模式。
要转换卷模式,授权用户必须执行以下操作:
- 识别要在给定命名空间中作为新创建 PVC 的数据源的 VolumeSnapshot。
- 识别绑定到上述 VolumeSnapshot 的 VolumeSnapshotContent。
kubectl describe volumesnapshot -n <namespace> <name>
- 将注解
snapshot.storage.kubernetes.io/allow-volume-mode-change: "true"
添加到上述 VolumeSnapshotContent。VolumeSnapshotContent 注解必须包含一个类似于以下清单片段的条目:
kind: VolumeSnapshotContent
metadata:
annotations:
- snapshot.storage.kubernetes.io/allow-volume-mode-change: "true"
...
注意:对于预配置的 VolumeSnapshotContents,你必须额外执行一步,将 spec.sourceVolumeMode
字段设置为 Filesystem
或 Block
,具体取决于创建此快照时原始卷的模式。
示例如下所示:
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotContent
metadata:
annotations:
- snapshot.storage.kubernetes.io/allow-volume-mode-change: "true"
name: <volume-snapshot-content-name>
spec:
deletionPolicy: Delete
driver: hostpath.csi.k8s.io
source:
snapshotHandle: <snapshot-handle>
sourceVolumeMode: Filesystem
volumeSnapshotRef:
name: <volume-snapshot-name>
namespace: <namespace>
对所有在备份或恢复操作期间需要转换卷模式的 VolumeSnapshotContents 重复步骤 1 到 3。这可以通过具有授权用户凭据的软件完成,或者由授权用户手动完成。
如果 VolumeSnapshotContent 对象上存在上述注解,Kubernetes 将不会阻止卷模式的转换。用户在尝试将该注解添加到任何 VolumeSnapshotContent 之前应记住这一点。
所需操作
prevent-volume-mode-conversion
特性标志在 external-provisioner v4.0.0
和 external-snapshotter v7.0.0
中默认启用。除非执行了上述步骤,否则从 VolumeSnapshot 创建 PVC 时将拒绝更改卷模式。
下一步
要确定哪些 CSI 外部 Sidecar 版本支持此特性,请前往 CSI 文档页面。如有任何疑问或问题,请加入 Kubernetes Slack 并在 #csi 或 #sig-storage 频道创建主题。或者,在 CSI external-snapshotter 代码库 中创建议题。