Skip to main content
此產品有較新版本可以使用。
本繁體中文版使用機器翻譯,譯文僅供參考,若與英文版本牴觸,應以英文版本為準。

Linux Unified Key Setup(LUKS)

您可以啟用 Linux Unified Key Setup (LUKS) 來加密 Trident 上的 ONTAP SAN 和 ONTAP SAN ECONOMY 磁碟區。Trident 支援對 LUKS 加密磁碟區進行密碼短語輪換和磁碟區擴展。

在 Trident 中,LUKS 加密磁碟區使用 aes-xts-plain64 密碼和模式,如 "NIST" 所建議。

註 ASA r2 系統不支援 LUKS 加密。有關 ASA r2 系統的資訊,請參閱"了解 ASA r2 儲存系統"
開始之前
  • 工作節點必須安裝 cryptsetup 2.1 或更高版本(但低於 3.0)。如需更多資訊,請造訪 "Gitlab:cryptsetup"

  • 出於效能考慮,NetApp 建議工作節點支援高級加密標準新指令集(AES-NI)。若要驗證是否支援 AES-NI,請執行下列命令:

    grep "aes" /proc/cpuinfo

    如果沒有回傳任何內容,則表示您的處理器不支援 AES-NI。有關 AES-NI 的更多資訊,請造訪:"Intel:Advanced Encryption Standard Instructions(AES-NI)"

啟用 LUKS 加密

您可以使用 Linux Unified Key Setup (LUKS) 為 ONTAP SAN 和 ONTAP SAN ECONOMY 磁碟區啟用按磁碟區主機端加密。

步驟
  1. 在後端配置中定義 LUKS 加密屬性。有關 ONTAP SAN 後端配置選項的更多資訊,請參閱 "ONTAP SAN 組態選項"

    {
      "storage": [
        {
          "labels": {
            "luks": "true"
          },
          "zone": "us_east_1a",
          "defaults": {
            "luksEncryption": "true"
          }
        },
        {
          "labels": {
            "luks": "false"
          },
          "zone": "us_east_1a",
          "defaults": {
            "luksEncryption": "false"
          }
        }
      ]
    }
  2. 使用 parameters.selector 來定義使用 LUKS 加密的儲存池。例如:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: luks
    provisioner: csi.trident.netapp.io
    parameters:
      selector: "luks=true"
      csi.storage.k8s.io/node-stage-secret-name: luks-${pvc.name}
      csi.storage.k8s.io/node-stage-secret-namespace: ${pvc.namespace}
  3. 建立一個包含 LUKS 密碼的密鑰。例如:

    kubectl -n trident create -f luks-pvc1.yaml
    apiVersion: v1
    kind: Secret
    metadata:
      name: luks-pvc1
    stringData:
      luks-passphrase-name: A
      luks-passphrase: secretA

限制

LUKS 加密磁碟區無法利用 ONTAP 重複資料刪除和壓縮功能。

匯入 LUKS 磁碟區的後端組態

若要匯入 LUKS 磁碟區、您必須在後端將 luksEncryption`設為(`trueluksEncryption`選項會告知 Trident 磁碟區是否符合 LUKS 規範(`true`或不符合 LUKS 規範(`false、如下列範例所示。

version: 1
storageDriverName: ontap-san
managementLIF: 10.0.0.1
dataLIF: 10.0.0.2
svm: trident_svm
username: admin
password: password
defaults:
  luksEncryption: 'true'
  spaceAllocation: 'false'
  snapshotPolicy: default
  snapshotReserve: '10'

用於匯入 LUKS 磁碟區的 PVC 組態

若要動態匯入 LUKS 卷,請將註解 `trident.netapp.io/luksEncryption`設為 `true`並在 PVC 中包含啟用 LUKS 的儲存類,如本範例所示。

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: luks-pvc
  namespace: trident
  annotations:
    trident.netapp.io/luksEncryption: "true"
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: luks-sc

輪換 LUKS 密碼

您可以輪換 LUKS 密碼並確認輪換。

警告 請務必在確認所有磁碟區、快照或金鑰均不再引用該密碼短語後再忘記它。如果引用的密碼短語遺失,您可能無法掛載該磁碟區,且資料將保持加密狀態且無法存取。
關於此任務

當指定新的 LUKS 密碼後建立掛載磁碟區的 Pod 時,就會發生 LUKS 密碼輪替。建立新 Pod 時,Trident 會將磁碟區上的 LUKS 密碼與金鑰中的活動密碼進行比較。

  • 如果磁碟區上的密碼與密碼中的作用中密碼不符、就會發生輪替。

  • 如果磁碟區上的密碼與密碼中的作用中密碼相符、則會忽略 previous-luks-passphrase 參數。

步驟
  1. 新增 node-publish-secret-name`和 `node-publish-secret-namespace StorageClass 參數。例如:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: csi-san
    provisioner: csi.trident.netapp.io
    parameters:
      trident.netapp.io/backendType: "ontap-san"
      csi.storage.k8s.io/node-stage-secret-name: luks
      csi.storage.k8s.io/node-stage-secret-namespace: ${pvc.namespace}
      csi.storage.k8s.io/node-publish-secret-name: luks
      csi.storage.k8s.io/node-publish-secret-namespace: ${pvc.namespace}
  2. 識別磁碟區或快照上現有的複雜密碼。

    磁碟區
    tridentctl -d get volume luks-pvc1
    GET http://127.0.0.1:8000/trident/v1/volume/<volumeID>
    
    ...luksPassphraseNames:["A"]
    快照
    tridentctl -d get snapshot luks-pvc1
    GET http://127.0.0.1:8000/trident/v1/volume/<volumeID>/<snapshotID>
    
    ...luksPassphraseNames:["A"]
  3. 更新磁碟區的 LUKS 金鑰,以指定新的和先前的密碼短語。確保 `previous-luke-passphrase-name`和 `previous-luks-passphrase`與先前的密碼短語一致。

    apiVersion: v1
    kind: Secret
    metadata:
      name: luks-pvc1
    stringData:
      luks-passphrase-name: B
      luks-passphrase: secretB
      previous-luks-passphrase-name: A
      previous-luks-passphrase: secretA
  4. 建立新的 pod 並掛載磁碟區。這是啟動輪替所必需的。

  5. 確認密碼已輪換。

    磁碟區
    tridentctl -d get volume luks-pvc1
    GET http://127.0.0.1:8000/trident/v1/volume/<volumeID>
    
    ...luksPassphraseNames:["B"]
    快照
    tridentctl -d get snapshot luks-pvc1
    GET http://127.0.0.1:8000/trident/v1/volume/<volumeID>/<snapshotID>
    
    ...luksPassphraseNames:["B"]
結果

當磁碟區和快照上僅傳回新複雜密碼時,複雜密碼就會輪替。

註 如果傳回兩個密碼短語,例如 luksPassphraseNames: ["B", "A"],則輪換尚未完成。您可以觸發一個新的 pod 來嘗試完成輪換。

啟用磁碟區擴充

您可以對 LUKS 加密磁碟區啟用磁碟區擴充。

步驟
  1. 啟用 CSINodeExpandSecret 功能閘控(beta 1.25+)。詳情請參閱 "Kubernetes 1.25:使用 Secrets 實作 CSI 磁碟區的節點驅動擴展"

  2. 新增 node-expand-secret-name`和 `node-expand-secret-namespace StorageClass 參數。例如:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: luks
    provisioner: csi.trident.netapp.io
    parameters:
      selector: "luks=true"
      csi.storage.k8s.io/node-stage-secret-name: luks-${pvc.name}
      csi.storage.k8s.io/node-stage-secret-namespace: ${pvc.namespace}
      csi.storage.k8s.io/node-expand-secret-name: luks-${pvc.name}
      csi.storage.k8s.io/node-expand-secret-namespace: ${pvc.namespace}
    allowVolumeExpansion: true
結果

啟動線上儲存擴充功能時,kubelet 會將對應的憑證傳遞給驅動程式。