Kubernetes 1.30:防止未经授权的卷模式转换功能正式发布

随着 Kubernetes 1.30 版本的发布,在 Kubernetes 集群中,防止修改从现有 VolumeSnapshot 创建的 PersistentVolumeClaim 的卷模式的功能已进入 GA 阶段!

问题

PersistentVolumeClaim 的卷模式指的是存储设备上的底层卷是格式化为文件系统,还是以原始块设备的形式呈现给使用它的 Pod。

用户可以利用自 Kubernetes v1.20 版本以来一直稳定的 VolumeSnapshot 功能,从 Kubernetes 集群中现有的 VolumeSnapshot 创建 PersistentVolumeClaim(缩写为 PVC)。 PVC 规范包含一个 dataSource 字段,该字段可以指向现有的 VolumeSnapshot 实例。有关如何在 Kubernetes 集群中从现有 VolumeSnapshot 创建 PVC 的更多详细信息,请访问从 Volume Snapshot 创建 PersistentVolumeClaim

当利用上述功能时,没有逻辑来验证拍摄快照的原始卷的模式是否与新创建的卷的模式匹配。

这会产生一个安全漏洞,允许恶意用户利用主机操作系统中尚未发现的漏洞。

允许某些用户执行此类转换存在合理的用例。通常,存储备份供应商会在备份操作过程中转换卷模式,以检索更改的块,从而提高操作效率。这可以防止 Kubernetes 完全阻止该操作,并给区分可信用户和恶意用户带来了挑战。

防止未经授权的用户转换卷模式

在此上下文中,授权用户是指有权对集群级资源 VolumeSnapshotContents 执行 updatepatch 操作的用户。
集群管理员有责任仅向受信任的用户或应用程序(如备份供应商)提供这些权限。除了此类授权用户之外的用户,在从 VolumeSnapshot 创建 PVC 时,绝不允许修改 PVC 的卷模式。

要转换卷模式,授权用户必须执行以下操作

  1. 确定要用作给定命名空间中新创建的 PVC 的数据源的 VolumeSnapshot。
  2. 确定绑定到上述 VolumeSnapshot 的 VolumeSnapshotContent。
kubectl describe volumesnapshot -n <namespace> <name>
  1. 将注解 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 字段设置为 FilesystemBlock

下面显示一个示例

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 文档页面。如有任何疑问或问题,请加入 Slack 上的 Kubernetes,并在 #csi 或 #sig-storage 频道中创建一个线程。或者,在 CSI external-snapshotter 存储库中创建一个问题。