本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

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(一個叢集級別的資源)執行 updatepatch 操作的使用者。
叢集管理員有責任僅將這些許可權授予受信任的使用者或應用程式,例如備份供應商。除此類授權使用者外,任何使用者在從 VolumeSnapshot 建立 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` 欄位設定為 `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。