Trident Linux Unified Key Setup (LUKS)
Linux Unified Key Setup (LUKS) est une spécification de chiffrement de disque. Trident utilise LUKS pour fournir un chiffrement par volume côté hôte pour les volumes ONTAP SAN et ONTAP SAN ECONOMY, avec prise en charge de la rotation des phrases de passe et de l'extension de volume.
Dans Trident, les volumes chiffrés LUKS utilisent le cypher et le mode aes-xts-mclair 64, comme recommandé par "NIST".
|
|
Le chiffrement LUKS n'est pas pris en charge par les systèmes ASA r2. Pour plus d'informations sur les systèmes ASA r2, consultez la section "En savoir plus sur les systèmes de stockage ASA r2" . |
-
Les nœuds worker doivent avoir cryptsetup 2.1 ou supérieur (mais inférieur à 3.0) installé. Pour plus d'informations, rendez-vous sur "Gitlab : cryptsetup".
-
Pour des raisons de performances, NetApp recommande aux nœuds workers de prendre en charge les nouvelles instructions AES-ni (Advanced Encryption Standard New instructions). Pour vérifier la prise en charge AES-ni, exécutez la commande suivante :
grep "aes" /proc/cpuinfo
Si rien n'est renvoyé, votre processeur ne prend pas en charge AES-ni. Pour plus d'informations sur AES-ni, visitez le site : "Intel : instructions AES-ni (Advanced Encryption Standard instructions)".
Activez le cryptage LUKS
Vous pouvez activer le chiffrement côté hôte par volume en utilisant Linux Unified Key Setup (LUKS) pour SAN ONTAP et les volumes ÉCONOMIQUES SAN ONTAP.
-
Définissez les attributs de cryptage LUKS dans la configuration back-end. Pour plus d'informations sur les options de configuration des back-end pour SAN ONTAP, reportez-vous à "Options de configuration du SAN ONTAP".
{ "storage": [ { "labels": { "luks": "true" }, "zone": "us_east_1a", "defaults": { "luksEncryption": "true" } }, { "labels": { "luks": "false" }, "zone": "us_east_1a", "defaults": { "luksEncryption": "false" } } ] } -
Utiliser
parameters.selectorPour définir les pools de stockage à l'aide du cryptage LUKS. Par exemple :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} -
Créez un secret qui contient la phrase de passe LUKS. Par exemple :
kubectl -n trident create -f luks-pvc1.yaml apiVersion: v1 kind: Secret metadata: name: luks-pvc1 stringData: luks-passphrase-name: A luks-passphrase: secretA
Utilisez LUKS avec les volumes de blocs bruts RWX
À partir de Trident 26.10, vous pouvez utiliser le chiffrement LUKS avec des volumes de blocs bruts basés sur iSCSI qui sont rattachés à plusieurs nœuds Kubernetes à l’aide du mode d’accès ReadWriteMany (RWX). Cela est utile pour des workloads tels que les machines virtuelles KubeVirt qui doivent rattacher le même volume chiffré sur un nœud de destination alors qu’il est encore rattaché au nœud source pendant une migration à chaud.
La prise en charge de RWX LUKS est limitée aux volumes de blocs bruts. Les volumes RWX LUKS en mode système de fichiers ne sont pas pris en charge. L'application gère l'accès concurrent aux données déchiffrées ; Trident gère uniquement les opérations LUKS.
Configurez LUKS sur le backend, StorageClass et le Secret de phrase secrète comme décrit dans Activez le cryptage LUKS. Créez ensuite un PVC avec volumeMode: Block et ReadWriteMany:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-rwx-pvc
namespace: my-app
spec:
accessModes:
- ReadWriteMany
volumeMode: Block
storageClassName: san-luks-rwx
resources:
requests:
storage: 10Gi
Les pods sur plusieurs nœuds peuvent attacher ce PVC comme périphérique de blocs brut. Trident formate le périphérique avec LUKS2 lors de sa première connexion et ouvre le volume chiffré existant sur les nœuds suivants. Les opérations LUKS existantes, telles que la rotation de la phrase de passe et l’extension du volume, sont prises en charge.
Pourquoi Trident sérialise les opérations LUKS
LUKS2 stocke des copies redondantes de son en-tête de chiffrement au début du périphérique de blocs. cryptsetup peut réparer un en-tête lorsqu'il détecte que les copies diffèrent, y compris lors de commandes qui semblent être en lecture seule. Son verrouillage est local à un nœud et ne peut pas coordonner les opérations sur d'autres nœuds. Si un nœud met à jour l'en-tête pendant qu'un autre exécute cryptsetup, le second nœud pourrait déclencher une réparation de l'en-tête et interrompre la mise à jour, ce qui risquerait de corrompre l'en-tête.
Pour éviter les accès concurrents aux en-têtes, Trident utilise un bail Kubernetes pour chaque volume LUKS RWX. Avant qu’un nœud n’exécute une `cryptsetup`commande sur le volume, il doit détenir le bail. Trident libère le bail après une opération réussie. Si un autre nœud demande une opération pendant que le bail est détenu, Trident renvoie une erreur réessayable et Kubernetes réessaie plus tard. Les opérations sur différents volumes sont indépendantes.
Si une cryptsetup opération échoue, Trident conserve intentionnellement le bail afin que seul le même nœud puisse réessayer. Un événement d'avertissement avec la raison LeaseRetained consigne l'échec. Les baux n'expirent pas automatiquement ; un administrateur ne doit supprimer un bail qu'après avoir vérifié qu'aucune cryptsetup opération n'est en cours sur le nœud qui le détient. Pour les étapes de récupération, voir Corriger un Lease bloqué pour les volumes RWX Linux Unified Key Setup (LUKS).
Comme les nœuds ouvrent le volume à tour de rôle, le démarrage des workloads sur plusieurs nœuds peut prendre plus de temps qu'avec un volume non chiffré. Kubernetes relance les tentatives en cas d'erreur de verrouillage transitoire une fois l'opération en cours terminée. Les pods peuvent rester à l’état ContainerCreating plus longtemps lors d’extensions à grande échelle ; les workloads sur un même nœud peuvent partager un seul mappage de périphérique ouvert.
Limites
Les volumes LUKS-chiffrés ne peuvent pas tirer parti de la déduplication et de la compression ONTAP.
Configuration back-end pour l'importation de volumes LUKS
Pour importer un volume LUKS, vous devez définir luksEncryption sur sur(true le back-end. L' luksEncryption`option indique à Trident si le volume est conforme LUKS (`true) ou non conforme LUKS ) (`false`comme indiqué dans l'exemple suivant.
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'
Configuration PVC pour l'importation de volumes LUKS
Pour importer des volumes LUKS de façon dynamique, définissez l'annotation trident.netapp.io/luksEncryption sur true et incluez une classe de stockage LUKS activée dans la demande de volume virtuel, comme indiqué dans cet exemple.
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
Faites pivoter une phrase de passe LUKS
Vous pouvez faire pivoter la phrase de passe LUKS et confirmer la rotation.
|
|
N'oubliez pas une phrase de passe tant que vous n'avez pas vérifié qu'elle n'est plus référencée par un volume, un snapshot ou un secret. En cas de perte d'une phrase secrète référencée, vous risquez de ne pas pouvoir monter le volume et les données resteront cryptées et inaccessibles. |
La rotation de la phrase de passe LUKS se produit lorsqu'un pod qui monte le volume est créé après la spécification d'une nouvelle phrase de passe LUKS. Lorsqu'un nouveau pod est créé, Trident compare la phrase de passe LUKS sur le volume à la phrase de passe active dans le secret.
-
Si la phrase de passe du volume ne correspond pas à la phrase de passe active dans le secret, la rotation se produit.
-
Si la phrase de passe du volume correspond à la phrase de passe active dans le secret, le
previous-luks-passphraseparamètre ignoré.
-
Ajoutez le
node-publish-secret-nameetnode-publish-secret-namespaceParamètres de classe de stockage. Par exemple :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} -
Identifier les phrases de passe existantes sur le volume ou l'instantané.
Volumétrietridentctl -d get volume luks-pvc1 GET http://127.0.0.1:8000/trident/v1/volume/<volumeID> ...luksPassphraseNames:["A"]
Snapshottridentctl -d get snapshot luks-pvc1 GET http://127.0.0.1:8000/trident/v1/volume/<volumeID>/<snapshotID> ...luksPassphraseNames:["A"]
-
Mettez à jour le secret LUKS pour le volume afin de spécifier les phrases de passe nouvelles et précédentes. Bien sûr
previous-luke-passphrase-nameetprevious-luks-passphrasefaites correspondre la phrase de passe précédente.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 -
Créez un nouveau pod qui monte le volume. Ceci est nécessaire pour lancer la rotation.
-
Vérifiez que la phrase de passe a été pivotée.
Volumétrietridentctl -d get volume luks-pvc1 GET http://127.0.0.1:8000/trident/v1/volume/<volumeID> ...luksPassphraseNames:["B"]
Snapshottridentctl -d get snapshot luks-pvc1 GET http://127.0.0.1:8000/trident/v1/volume/<volumeID>/<snapshotID> ...luksPassphraseNames:["B"]
La phrase de passe a été pivotée lorsque seule la nouvelle phrase de passe est renvoyée sur le volume et le snapshot.
|
|
Si deux phrases de passe sont renvoyées, par exemple luksPassphraseNames: ["B", "A"], la rotation est incomplète. Vous pouvez déclencher un nouveau pod pour tenter de terminer la rotation.
|
Activer l'extension de volume
Vous pouvez activer l'extension de volume sur un volume chiffré LUKS.
-
Activez le
CSINodeExpandSecretfeature gate (bêta 1.25+). Reportez-vous à la section "Kubernetes 1.25 : utilisez les secrets de l'extension des volumes CSI basée sur des nœuds" pour plus d'informations. -
Ajoutez le
node-expand-secret-nameetnode-expand-secret-namespaceParamètres de classe de stockage. Par exemple :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
Lorsque vous initiez l'extension du stockage en ligne, le kubelet transmet les identifiants appropriés au pilote.