Skip to main content
简体中文版经机器翻译而成,仅供参考。如与英语版出现任何冲突,应以英语版为准。

Linux统一密钥设置(LUKS)

贡献者

您可以启用Linux统一密钥设置(LUKS)来对Astra Trident上的ONTAP SAN和ONTAP SAN经济卷进行加密。Astra Trident支持对LUKS加密卷执行密码短语轮换和卷扩展。

在Astra Trident中、LUKS加密的卷会按照建议使用AES-XTS-plain64 Cypher和模式 "NIST"

开始之前
  • 工作节点必须安装加密设置2.1或更高版本(但低于3.0)。有关详细信息,请访问 "Gitlab:密码设置"

  • 出于性能原因、我们建议员工节点支持高级加密标准新指令(AES-NI)。要验证AES-NI支持、请运行以下命令:

    grep "aes" /proc/cpuinfo

    如果未返回任何内容、则您的处理器不支持AES-NI。有关AES-NI的详细信息、请访问: "Intel:高级加密标准说明(AES-NI)"

启用LUKS加密

您可以对ONTAP SAN和ONTAP SAN经济卷使用Linux统一密钥设置(Unified Key Setup、LUKS)启用每个卷的主机端加密。

步骤
  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 to(true 在后端。。 luksEncryption Option可告知A作用 中的三端磁盘是否符合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密码短语

您可以轮换LUKS密码短语并确认轮换。

警告 请勿忘记密码短语、除非您确认任何卷、快照或密钥不再引用它。如果引用的密码短语丢失、您可能无法挂载此卷、并且数据将保持加密状态且无法访问。
关于此任务

如果在指定新的LUKS密码短语后创建了挂载卷的POD、则会发生LUKS密码短语轮换。创建新的Pod时、Astra Trident会将卷上的LUKS密码短语与密钥中的活动密码短语进行比较。

  • 如果卷上的密码短语与密钥中的活动密码短语不匹配、则会发生轮换。

  • 如果卷上的密码短语与密钥中的活动密码短语匹配、则会显示 previous-luks-passphrase 参数将被忽略。

步骤
  1. 添加 node-publish-secret-namenode-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. 确定卷或快照上的现有密码短语。

    Volume
    tridentctl -d get volume luks-pvc1
    GET http://127.0.0.1:8000/trident/v1/volume/<volumeID>
    
    ...luksPassphraseNames:["A"]
    Snapshot
    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-nameprevious-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. 验证密码短语是否已轮换。

    Volume
    tridentctl -d get volume luks-pvc1
    GET http://127.0.0.1:8000/trident/v1/volume/<volumeID>
    
    ...luksPassphraseNames:["B"]
    Snapshot
    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 功能门(测试版1.25以上)。请参见 "Kubernetes 1.25:使用机密进行节点驱动型CSI卷扩展" 了解详细信息。

  2. 添加 node-expand-secret-namenode-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会将相应的凭据传递给驱动程序。