Skip to main content
La versione in lingua italiana fornita proviene da una traduzione automatica. Per eventuali incoerenze, fare riferimento alla versione in lingua inglese.

Trident Linux Unified Key Setup (LUKS)

Collaboratori netapp-aruldeepa juliantap joan-ing netapp-mwallis

Linux Unified Key Setup (LUKS) è una specifica per la crittografia del disco. Trident utilizza LUKS per fornire la crittografia lato host per volume per i volumi ONTAP SAN e ONTAP SAN ECONOMY, con supporto per la rotazione della passphrase e l'espansione del volume.

In Trident, i volumi crittografati con LUKS utilizzano il Cypher e la modalità aes-xts-plain64, come consigliato da "NIST".

Nota La crittografia LUKS non è supportata per i sistemi ASA r2. Per informazioni sui sistemi ASA r2, vedere "Informazioni sui sistemi di storage ASA R2" .
Prima di iniziare
  • Sui nodi di lavoro deve essere installata la crittografia 2.1 o superiore (ma inferiore a 3.0). Per ulteriori informazioni, visitare il sito "Gitlab: Crittsetup".

  • Per motivi di prestazioni, NetApp consiglia ai nodi di lavoro di supportare le nuove istruzioni AES-NI (Advanced Encryption Standard New Instructions). Per verificare il supporto AES-NI, eseguire il seguente comando:

    grep "aes" /proc/cpuinfo

    Se non viene restituito nulla, il processore non supporta AES-NI. Per ulteriori informazioni su AES-NI, visita: "Intel: Advanced Encryption Standard Instructions (AES-NI)".

Attivare la crittografia LUKS

È possibile attivare la crittografia lato host per volume utilizzando la configurazione unificata delle chiavi di Linux per volumi SAN ONTAP e SAN ONTAP.

Fasi
  1. Definire gli attributi di crittografia LUKS nella configurazione del back-end. Per ulteriori informazioni sulle opzioni di configurazione back-end per ONTAP SAN, fare riferimento a. "Opzioni di configurazione SAN ONTAP".

    {
      "storage": [
        {
          "labels": {
            "luks": "true"
          },
          "zone": "us_east_1a",
          "defaults": {
            "luksEncryption": "true"
          }
        },
        {
          "labels": {
            "luks": "false"
          },
          "zone": "us_east_1a",
          "defaults": {
            "luksEncryption": "false"
          }
        }
      ]
    }
  2. Utilizzare parameters.selector Per definire i pool di storage utilizzando la crittografia LUKS. Ad esempio:

    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. Creare un segreto contenente la passphrase LUKS. Ad esempio:

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

Usa LUKS con volumi raw a blocchi RWX

A partire da Trident 26.10, puoi utilizzare la crittografia LUKS con volumi a blocchi raw basati su iSCSI collegati a più nodi Kubernetes tramite la modalità di accesso ReadWriteMany (RWX). Questo è utile per carichi di lavoro come le macchine virtuali KubeVirt che devono collegare lo stesso volume crittografato a un nodo di destinazione mentre è ancora collegato al nodo di origine durante la migrazione live.

Il supporto RWX LUKS è limitato ai volumi a blocchi raw. I volumi RWX LUKS in modalità filesystem non sono supportati. L'applicazione è responsabile del coordinamento dell'accesso simultaneo ai dati decrittografati; Trident coordina solo le operazioni LUKS.

Configura LUKS sul backend, StorageClass e il Secret della passphrase come descritto in Attivare la crittografia LUKS. Quindi crea un PVC con volumeMode: Block e 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

I pod su più nodi possono collegare questo PVC come dispositivo a blocchi raw. Trident formatta il dispositivo con LUKS2 al primo collegamento e apre il volume crittografato esistente sui nodi successivi. Le operazioni LUKS esistenti, tra cui la rotazione della passphrase e l'espansione del volume, sono supportate.

Perché Trident serializza le operazioni LUKS

LUKS2 memorizza copie ridondanti della sua intestazione di crittografia all'inizio del dispositivo a blocchi. cryptsetup`Può riparare un'intestazione quando rileva che le copie differiscono, anche durante comandi che sembrano di sola lettura. Il suo meccanismo di blocco è locale a un nodo e non può coordinare operazioni su altri nodi. Se un nodo sta aggiornando l'intestazione mentre un altro esegue `cryptsetup, il secondo nodo potrebbe attivare la riparazione dell'intestazione e interrompere l'aggiornamento, corrompendo potenzialmente l'intestazione.

Per impedire l'accesso simultaneo all'intestazione, Trident utilizza un Lease di Kubernetes per ogni volume RWX LUKS. Prima che un nodo esegua qualsiasi cryptsetup comando per il volume, deve detenere il Lease. Trident rilascia il Lease dopo un'operazione riuscita. Se un altro nodo richiede un'operazione mentre il Lease è detenuto, Trident restituisce un errore recuperabile e Kubernetes riprova in seguito. Le operazioni su volumi diversi sono indipendenti.

Se un' cryptsetup`operazione fallisce, Trident mantiene intenzionalmente il Lease in modo che solo lo stesso nodo possa riprovare. Un evento di avviso con motivo `LeaseRetained`registra l'errore. I Lease non scadono automaticamente; un amministratore dovrebbe rimuovere un Lease solo dopo aver verificato che nessuna `cryptsetup operazione sia in esecuzione sul nodo che lo detiene. Per le procedure di ripristino, vedi "Risolvere un Lease bloccato per i volumi RWX Linux Unified Key Setup (LUKS)".

Poiché i nodi si alternano nell'apertura del volume, l'avvio dei carichi di lavoro su molti nodi diversi può richiedere più tempo rispetto a un volume non crittografato. Kubernetes riprova gli errori di blocco temporanei al termine dell'operazione corrente. I pod possono rimanere in ContainerCreating più a lungo durante le scalabilità orizzontali su larga scala; i carichi di lavoro sullo stesso nodo possono condividere un'unica mappatura del dispositivo aperto.

Limitazioni

I volumi crittografati con LUKS non possono sfruttare la deduplica e la compressione ONTAP.

Configurazione back-end per l'importazione di volumi LUKS

Per importare un volume LUKS, è necessario impostare luksEncryption su(true sul backend. L' `luksEncryption`opzione indica a Trident se il volume è (`true`compatibile con LUKS o non compatibile con LUKS (`false`come illustrato nell'esempio seguente.

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'

Configurazione PVC per l'importazione di volumi LUKS

Per importare volumi LUKS in modo dinamico, impostare l'annotazione trident.netapp.io/luksEncryption su true e includere una classe di storage abilitata LUKS nel PVC, come illustrato in questo esempio.

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

Ruotare una passphrase LUKS

È possibile ruotare la passphrase LUKS e confermare la rotazione.

Attenzione Non dimenticare una passphrase fino a quando non viene verificata la mancanza di riferimenti da qualsiasi volume, snapshot o segreto. In caso di perdita di una passphrase di riferimento, potrebbe non essere possibile montare il volume e i dati resteranno crittografati e inaccessibili.
A proposito di questa attività

La rotazione della passphrase LUKS si verifica quando viene creato un pod che monta il volume dopo aver specificato una nuova passphrase LUKS. Quando viene creato un nuovo pod, Trident confronta la passphrase LUKS del volume con la passphrase attiva nel segreto.

  • Se la passphrase sul volume non corrisponde alla passphrase attiva nel segreto, si verifica la rotazione.

  • Se la passphrase sul volume corrisponde alla passphrase attiva nel segreto, il previous-luks-passphrase il parametro viene ignorato.

Fasi
  1. Aggiungere il node-publish-secret-name e. node-publish-secret-namespace Parametri StorageClass. Ad esempio:

    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. Identificare le passphrase esistenti sul volume o sullo snapshot.

    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. Aggiornare il segreto LUKS per il volume per specificare le passphrase nuove e precedenti. Assicurarsi previous-luke-passphrase-name e. previous-luks-passphrase associare la passphrase precedente.

    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. Creare un nuovo pod per il montaggio del volume. Questa operazione è necessaria per avviare la rotazione.

  5. Verificare che la passphrase sia stata ruotata.

    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"]
Risultati

La passphrase è stata ruotata quando viene restituita solo la nuova passphrase nel volume e nello snapshot.

Nota Se, ad esempio, vengono restituite due passphrase luksPassphraseNames: ["B", "A"], la rotazione è incompleta. È possibile attivare un nuovo pod per tentare di completare la rotazione.

Abilitare l'espansione dei volumi

È possibile attivare l'espansione del volume su un volume crittografato con LUKS.

Fasi
  1. Attivare il CSINodeExpandSecret feature gate (beta 1.25+). Fare riferimento a. "Kubernetes 1.25: Utilizza Secrets per l'espansione basata su nodi di volumi CSI" per ulteriori informazioni.

  2. Aggiungere il node-expand-secret-name e. node-expand-secret-namespace Parametri StorageClass. Ad esempio:

    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
Risultati

Quando si avvia l'espansione dello storage online, il kubelet passa le credenziali appropriate al driver.