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

Kubernetes 1.24:防止未經授權的磁碟區模式轉換

Kubernetes v1.24 推出新的 Alpha 級功能,可防止未經授權的使用者修改從 Kubernetes 叢集中現有的 VolumeSnapshot 建立的 PersistentVolumeClaim 的卷宗模式。

問題

卷宗模式決定卷宗是格式化為檔案系統還是呈現為原始區塊裝置。

使用者可以利用 VolumeSnapshot 功能(自 Kubernetes v1.20 以來已穩定),從 Kubernetes 叢集中現有的 VolumeSnapshot 建立 PersistentVolumeClaim(縮寫為 PVC)。PVC 規格包含 dataSource 欄位,可以指向現有的 VolumeSnapshot 執行個體。請造訪從卷宗快照建立 PersistentVolumeClaim 以取得更多詳細資訊。

當利用上述功能時,沒有邏輯驗證原始卷宗(已拍攝快照)的模式是否與新建立卷宗的模式相符。

這造成了一個安全漏洞,允許惡意使用者可能利用主機作業系統中尚未發現的漏洞。

許多流行的儲存備份供應商為了效率目的,在備份操作過程中轉換卷宗模式,這阻止 Kubernetes 完全阻止該操作,並在區分受信任使用者和惡意使用者方面帶來挑戰。

防止未經授權的使用者轉換卷宗模式

在此上下文中,授權使用者是指有權對 VolumeSnapshotContents 執行「更新」或「修補」操作的使用者,VolumeSnapshotContents 是一個叢集層級資源。
叢集管理員有責任僅向受信任的使用者或應用程式(例如備份供應商)提供這些權限。

如果 Alpha 功能在 snapshot-controllersnapshot-validation-webhookexternal-provisioner啟用,那麼,當從 VolumeSnapshot 建立 PVC 時,未經授權的使用者將無法修改 PVC 的卷宗模式。

若要轉換卷宗模式,授權使用者必須執行以下操作

  1. 識別要用作給定命名空間中新建立 PVC 資料來源的 VolumeSnapshot
  2. 識別繫結到上述 VolumeSnapshotVolumeSnapshotContent
kubectl get volumesnapshot -n <namespace>
  1. 將註解 snapshot.storage.kubernetes.io/allowVolumeModeChange 新增至 VolumeSnapshotContent

  2. 此註解可以透過軟體新增,也可以由授權使用者手動新增。VolumeSnapshotContent 註解必須如下列 manifest 片段所示

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 之前,應牢記這一點。

接下來是什麼

啟用此功能並告訴我們您的想法!

我們希望此功能不會對現有工作流程造成任何干擾,同時防止惡意使用者利用其叢集中的安全漏洞。

如有任何疑問或問題,請加入 Kubernetes Slack 並在 #sig-storage 頻道中建立討論串。或者,在 CSI external-snapshotter 儲存庫中建立 issue。