这篇文章已经超过一年了。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已经变得不正确。
Kubernetes 1.24:防止未经授权的卷模式转换
Kubernetes v1.24 引入了一个新的 alpha 级别特性,该特性可以防止未经授权的用户修改从 Kubernetes 集群中现有VolumeSnapshot
创建的PersistentVolumeClaim
的卷模式。
问题
卷模式决定了卷是被格式化为文件系统还是作为原始块设备呈现。
用户可以利用自 Kubernetes v1.20 以来一直稳定的 VolumeSnapshot
功能,从 Kubernetes 集群中现有的 VolumeSnapshot
创建 PersistentVolumeClaim
(缩写为 PVC)。PVC 规范包含一个 dataSource
字段,该字段可以指向现有的 VolumeSnapshot
实例。请访问从卷快照创建 PersistentVolumeClaim以了解更多详细信息。
当利用上述功能时,没有逻辑验证原始卷(已拍摄快照)的模式是否与新创建的卷的模式匹配。
这会产生一个安全漏洞,使恶意用户有可能利用主机操作系统中尚未发现的漏洞。
许多流行的存储备份供应商为了提高效率,会在备份操作过程中转换卷模式,这会阻止 Kubernetes 完全阻止该操作,并且在区分受信任用户和恶意用户方面提出了挑战。
防止未经授权的用户转换卷模式
在这种情况下,授权用户是指有权对集群级资源 VolumeSnapshotContents
执行 Update
或 Patch
操作的用户。
集群管理员有责任仅将这些权利提供给受信任的用户或应用程序,如备份供应商。
如果 alpha 功能在 snapshot-controller
、snapshot-validation-webhook
和 external-provisioner
中启用,那么当从 VolumeSnapshot
创建 PVC 时,未经授权的用户将无法修改 PVC 的卷模式。
要转换卷模式,授权用户必须执行以下操作:
- 在给定的命名空间中,识别要用作新创建的 PVC 的数据源的
VolumeSnapshot
。 - 识别绑定到上述
VolumeSnapshot
的VolumeSnapshotContent
。
kubectl get volumesnapshot -n <namespace>
将注释
snapshot.storage.kubernetes.io/allowVolumeModeChange
添加到VolumeSnapshotContent
。可以通过软件或由授权用户手动添加此注释。
VolumeSnapshotContent
注释必须如下所示:
kind: VolumeSnapshotContent
metadata:
annotations:
- snapshot.storage.kubernetes.io/allowVolumeModeChange: "true"
...
注意:对于预先配置的 VolumeSnapshotContents
,您必须采取额外的步骤,将 spec.sourceVolumeMode
字段设置为 Filesystem
或 Block
,具体取决于从中拍摄此快照的卷的模式。
下面是一个示例:
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotContent
metadata:
annotations:
- snapshot.storage.kubernetes.io/allowVolumeModeChange: "true"
name: new-snapshot-content-test
spec:
deletionPolicy: Delete
driver: hostpath.csi.k8s.io
source:
snapshotHandle: 7bdd0de3-aaeb-11e8-9aae-0242ac110002
sourceVolumeMode: Filesystem
volumeSnapshotRef:
name: new-snapshot-test
namespace: default
对在备份或还原操作期间需要转换卷模式的所有 VolumeSnapshotContents
重复步骤 1 到 3。
如果步骤 4 中所示的注释存在于 VolumeSnapshotContent
对象上,则 Kubernetes 将不会阻止卷模式被转换。用户在尝试将注释添加到任何 VolumeSnapshotContent
之前应牢记这一点。
下一步
启用此功能并告诉我们您的想法!
我们希望此功能不会对现有工作流程造成中断,同时防止恶意用户利用集群中的安全漏洞。
如有任何疑问或问题,请加入Slack 上的 Kubernetes并在 #sig-storage 频道中创建一个主题。或者,在 CSI external-snapshotter 存储库中创建一个问题。