Linux Unified Key Setup(LUKS)
Trident에서 Linux Unified Key Setup(LUKS)을 활성화하여 ONTAP SAN 및 ONTAP SAN ECONOMY 볼륨을 암호화할 수 있습니다. Trident는 LUKS로 암호화된 볼륨에 대해 암호 순환 및 볼륨 확장을 지원합니다.
Trident에서 LUKS로 암호화된 볼륨은 "NIST"에서 권장하는 대로 aes-xts-plain64 암호 및 모드를 사용합니다.
|
|
LUKS 암호화는 ASA r2 시스템에서 지원되지 않습니다. ASA r2 시스템에 대한 자세한 내용은 "ASA r2 스토리지 시스템에 대해 알아보세요"를 참조하십시오. |
-
워커 노드에는 cryptsetup 2.1 이상(단, 3.0 미만)이 설치되어 있어야 합니다. 자세한 내용은 "Gitlab: cryptsetup"를 참조하십시오.
-
성능 향상을 위해 NetApp에서는 워커 노드가 AES-NI(Advanced Encryption Standard New Instructions)를 지원하도록 권장합니다. AES-NI 지원 여부를 확인하려면 다음 명령을 실행하십시오.
grep "aes" /proc/cpuinfo
아무것도 반환되지 않으면 프로세서가 AES-NI를 지원하지 않는 것입니다. AES-NI에 대한 자세한 내용은 "Intel: Advanced Encryption Standard Instructions(AES-NI)"를 참조하십시오.
LUKS 암호화 활성화
ONTAP SAN 및 ONTAP SAN ECONOMY 볼륨의 경우 Linux Unified Key Setup(LUKS)을 사용하여 볼륨별 호스트 측 암호화를 활성화할 수 있습니다.
-
백엔드 구성에서 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" } } ] } -
`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} -
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`을(`true`로 설정해야 합니다. `luksEncryption 옵션은 다음 예와 같이 볼륨이 LUKS 규격을 준수하는지(true 또는 LUKS 규격을 준수하지 않는지(`false`를 Trident에 알려줍니다.
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 볼륨을 동적으로 가져오려면 annotation `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 암호 순환은 새 LUKS 암호가 지정된 후 해당 볼륨을 마운트하는 Pod가 생성될 때 발생합니다. 새 Pod가 생성될 때 Trident는 볼륨의 LUKS 암호를 시크릿에 있는 활성 암호와 비교합니다.
-
볼륨의 암호가 비밀의 활성 암호와 일치하지 않으면 순환이 발생합니다.
-
볼륨의 암호가 비밀 키에 있는 활성 암호와 일치하면
previous-luks-passphrase매개변수는 무시됩니다.
-
node-publish-secret-name및node-publish-secret-namespaceStorageClass 매개변수를 추가합니다. 예를 들면 다음과 같습니다.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} -
볼륨 또는 스냅샷에 있는 기존 암호를 확인합니다.
볼륨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"]
-
볼륨의 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 -
볼륨을 마운트하는 새 Pod를 생성합니다. 이는 로테이션을 시작하는 데 필요합니다.
-
암호가 교체되었는지 확인하십시오.
볼륨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로 암호화된 볼륨에서 볼륨 확장을 활성화할 수 있습니다.
-
CSINodeExpandSecret기능 게이트를 활성화합니다(베타 1.25+). 자세한 내용은 "Kubernetes 1.25: 노드 기반 CSI 볼륨 확장을 위한 시크릿 사용"를 참조하십시오. -
node-expand-secret-name및node-expand-secret-namespaceStorageClass 매개변수를 추가합니다. 예를 들면 다음과 같습니다.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이 적절한 자격 증명을 드라이버에 전달합니다.