Skip to main content
O português é fornecido por meio de tradução automática para sua conveniência. O inglês precede o português em caso de inconsistências.

Configuração unificada de chave do Trident Linux (LUKS)

Colaboradores netapp-aruldeepa juliantap joan-ing netapp-mwallis

O Linux Unified Key Setup (LUKS) é uma especificação de criptografia de disco. O Trident usa o LUKS para fornecer criptografia por volume, no lado do host, para os volumes do ONTAP SAN e do ONTAP SAN ECONOMY, com suporte para rotação de senha e expansão de volume.

No Trident, os volumes criptografados por LUKS usam a cifra e o modo aes-xts-plain64, conforme recomendado "NIST"pelo .

Observação A criptografia LUKS não é compatível com sistemas ASA r2. Para obter informações sobre sistemas ASA r2, consulte "Saiba mais sobre os sistemas de armazenamento ASA R2" .
Antes de começar
  • Os nós de trabalho devem ter o cryptsetup 2,1 ou superior (mas inferior a 3,0) instalado. Para obter mais informações, visite "Gitlab: Cryptsetup".

  • Por motivos de desempenho, a NetApp recomenda que os nós de trabalho suportem as novas instruções padrão de criptografia avançada (AES-NI). Para verificar o suporte ao AES-NI, execute o seguinte comando:

    grep "aes" /proc/cpuinfo

    Se nada for devolvido, o processador não suporta AES-NI. Para obter mais informações sobre o AES-NI, visite: "Intel: Advanced Encryption Standard Instructions (AES-NI)".

Ativar encriptação LUKS

Você pode ativar a criptografia por volume no lado do host usando o LUKS (Configuração de chave unificada do Linux) para volumes ECONÔMICOS SAN ONTAP e SAN ONTAP.

Passos
  1. Defina atributos de criptografia LUKS na configuração de back-end. Para obter mais informações sobre opções de configuração de back-end para SAN ONTAP, "Opções de configuração de SAN ONTAP"consulte .

    {
      "storage": [
        {
          "labels": {
            "luks": "true"
          },
          "zone": "us_east_1a",
          "defaults": {
            "luksEncryption": "true"
          }
        },
        {
          "labels": {
            "luks": "false"
          },
          "zone": "us_east_1a",
          "defaults": {
            "luksEncryption": "false"
          }
        }
      ]
    }
  2. Use parameters.selector para definir os pools de armazenamento usando a criptografia LUKS. Por exemplo:

    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. Crie um segredo que contenha a frase-passe LUKS. Por exemplo:

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

Use o LUKS com volumes de bloco bruto RWX

A partir do Trident 26.10, você pode usar a criptografia LUKS com volumes brutos de bloco com suporte a iSCSI que são anexados a vários nós do Kubernetes usando o ReadWriteMany modo de acesso (RWX). Isso é útil para cargas de trabalho, como as máquinas virtuais KubeVirt, que precisam anexar o mesmo volume criptografado em um nó de destino enquanto ele ainda está anexado ao nó de origem durante a migração ao vivo.

O suporte a RWX LUKS é limitado a volumes de bloco bruto. Volumes RWX LUKS em modo de sistema de arquivos não são suportados. A aplicação é responsável por coordenar o acesso simultâneo aos dados descriptografados; o Trident coordena apenas as operações LUKS.

Configure o LUKS no backend, na StorageClass e no Secret de passphrase, conforme descrito em Ativar encriptação LUKS. Em seguida, crie um PVC com 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

Pods em múltiplos nós podem conectar este PVC como um dispositivo de bloco bruto. O Trident formata o dispositivo com LUKS2 na primeira conexão e abre o volume criptografado existente em nós subsequentes. As operações LUKS existentes, incluindo rotação de senha e expansão de volume, têm suporte.

Por que o Trident serializa operações LUKS

O LUKS2 armazena cópias redundantes de seu cabeçalho de criptografia no início do dispositivo de bloco. cryptsetup pode reparar um cabeçalho quando detecta que as cópias diferem, inclusive durante comandos que parecem ser somente leitura. Seu bloqueio é local a um nó e não pode coordenar operações em outros nós. Se um nó estiver atualizando o cabeçalho enquanto outro executar cryptsetup, o segundo nó poderá acionar o reparo do cabeçalho e interromper a atualização, potencialmente corrompendo o cabeçalho.

Para evitar o acesso simultâneo ao cabeçalho, o Trident usa um Lease do Kubernetes para cada volume RWX LUKS. Antes que um nó execute qualquer cryptsetup comando para o volume, ele deve manter o Lease. O Trident libera o Lease após uma operação bem-sucedida. Se outro nó solicitar uma operação enquanto o Lease estiver em uso, o Trident retorna um erro passível de nova tentativa, e o Kubernetes tenta novamente mais tarde. As operações em volumes diferentes são independentes.

Se uma cryptsetup operação falhar, Trident retém intencionalmente o Lease para que apenas o mesmo nó possa tentar novamente. Um evento de aviso com o motivo LeaseRetained registra a falha. Os Leases não expiram automaticamente; um administrador deve remover um Lease somente após confirmar que nenhuma cryptsetup operação está em execução no nó detentor. Para obter instruções de recuperação, consulte "Corrija um Lease travado para volumes RWX do Linux Unified Key Setup (LUKS)".

Como os nós se revezam na abertura do volume, iniciar cargas de trabalho em vários nós diferentes pode demorar mais do que com um volume não criptografado. O Kubernetes tenta novamente erros de bloqueio transitórios após a conclusão da operação atual. Os pods podem permanecer em ContainerCreating por mais tempo durante grandes expansões; cargas de trabalho no mesmo nó podem compartilhar um único mapeamento de dispositivo aberto.

Limitações

Os volumes criptografados com LUKS não podem aproveitar a deduplicação e a compactação do ONTAP.

Configuração de back-end para importação de volumes LUKS

Para importar um volume LUKS, você deve definir luksEncryption como(true no back-end. A luksEncryption opção informa ao Trident se o volume é compatível com LUKS (true) ou não com LUKS (false), conforme mostrado no exemplo a seguir.

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'

Configuração de PVC para importação de volumes LUKS

Para importar volumes LUKS dinamicamente, defina a anotação trident.netapp.io/luksEncryption como true e inclua uma classe de armazenamento habilitada para LUKS no PVC, conforme mostrado neste exemplo.

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

Rode uma frase-passe LUKS

Pode rodar a frase-passe LUKS e confirmar a rotação.

Aviso Não se esqueça de uma frase-passe até ter verificado que ela não é mais referenciada por qualquer volume, instantâneo ou segredo. Se uma frase-passe referenciada for perdida, talvez você não consiga montar o volume e os dados permanecerão criptografados e inacessíveis.
Sobre esta tarefa

A rotação da frase-passe LUKS ocorre quando um pod que monta o volume é criado após uma nova frase-passe LUKS ser especificada. Quando um novo pod é criado, o Trident compara a frase-passe LUKS no volume com a frase-passe ativa no segredo.

  • Se a frase-passe no volume não corresponder à frase-passe ativa no segredo, ocorre rotação.

  • Se a frase-passe no volume corresponder à frase-passe ativa no segredo, o previous-luks-passphrase parâmetro é ignorado.

Passos
  1. Adicione os node-publish-secret-name parâmetros e node-publish-secret-namespace StorageClass. Por exemplo:

    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. Identificar senhas existentes no volume ou instantâneo.

    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. Atualize o segredo LUKS para o volume para especificar as senhas novas e anteriores. Certifique-se previous-luke-passphrase-name e previous-luks-passphrase faça a correspondência da frase-passe anterior.

    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. Crie um novo pod de montagem do volume. Isto é necessário para iniciar a rotação.

  5. Verifique se a senha foi girada.

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

A frase-passe foi girada quando apenas a nova frase-passe é retornada no volume e no instantâneo.

Observação Se duas senhas forem retornadas, por luksPassphraseNames: ["B", "A"] exemplo, a rotação estará incompleta. Você pode acionar um novo pod para tentar completar a rotação.

Ative a expansão de volume

Você pode ativar a expansão de volume em um volume criptografado com LUKS.

Passos
  1. Ative a CSINodeExpandSecret porta de recurso (beta 1,25 ou mais). "Kubernetes 1,25: Use segredos para a expansão orientada por nós de volumes CSI"Consulte para obter detalhes.

  2. Adicione os node-expand-secret-name parâmetros e node-expand-secret-namespace StorageClass. Por exemplo:

    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
Resultados

Quando você inicia a expansão de armazenamento on-line, o kubelet passa as credenciais apropriadas para o driver.