本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。
Kubernetes 1.30:防止未经授权的卷模式转换功能进入 GA 阶段
随着 Kubernetes 1.30 的发布,防止修改 Kubernetes 集群中基于现有 VolumeSnapshot 创建的 PersistentVolumeClaim 的卷模式的功能,已进入正式发布(GA)阶段!
问题所在
PersistentVolumeClaim 的卷模式(Volume Mode)指的是存储设备上的底层卷是格式化为文件系统,还是以原始块设备的形式呈现给使用它的 Pod。
用户可以利用自 Kubernetes v1.20 以来已稳定的 VolumeSnapshot 功能,从 Kubernetes 集群中已有的 VolumeSnapshot 创建 PersistentVolumeClaim(简称为 PVC)。PVC 的规约中包含一个 dataSource 字段,可以指向一个已有的 VolumeSnapshot 实例。请访问从卷快照创建 PersistentVolumeClaim,了解如何在 Kubernetes 集群中从现有 VolumeSnapshot 创建 PVC 的更多详细信息。
当利用上述功能时,没有任何逻辑会验证被快照的原始卷的模式是否与新创建的卷的模式相匹配。
这带来了一个安全漏洞,可能允许恶意用户利用宿主操作系统中尚未发现的漏洞。
存在一个有效的用例,允许某些用户执行此类转换。通常,存储备份供应商在备份操作过程中会转换卷模式,以获取更改的块,从而提高操作效率。这使得 Kubernetes 无法完全阻止该操作,并在区分受信任用户和恶意用户方面带来了挑战。
防止未经授权的用户转换卷模式
在这种情况下,授权用户是指有权限对 VolumeSnapshotContents(一个集群级别的资源)执行 update 或 patch 操作的用户。
集群管理员有责任仅将这些权限授予受信任的用户或应用程序,例如备份供应商。除此类授权用户外,任何用户在从 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 外部边车版本支持此功能,请前往 CSI 文档页面。如有任何疑问或问题,请加入 Kubernetes on Slack 并在 #csi 或 #sig-storage 频道中创建讨论串。或者,在 CSI external-snapshotter 仓库中创建一个 issue。