Configuração unificada de chave do Trident Linux (LUKS)
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 .
|
|
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" . |
-
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.
-
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" } } ] } -
Use
parameters.selectorpara 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} -
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.
|
|
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. |
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-passphraseparâmetro é ignorado.
-
Adicione os
node-publish-secret-nameparâmetros enode-publish-secret-namespaceStorageClass. 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} -
Identificar senhas existentes no volume ou instantâneo.
Volumetridentctl -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"]
-
Atualize o segredo LUKS para o volume para especificar as senhas novas e anteriores. Certifique-se
previous-luke-passphrase-nameeprevious-luks-passphrasefaç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 -
Crie um novo pod de montagem do volume. Isto é necessário para iniciar a rotação.
-
Verifique se a senha foi girada.
Volumetridentctl -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"]
A frase-passe foi girada quando apenas a nova frase-passe é retornada no volume e no instantâneo.
|
|
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.
-
Ative a
CSINodeExpandSecretporta 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. -
Adicione os
node-expand-secret-nameparâmetros enode-expand-secret-namespaceStorageClass. 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
Quando você inicia a expansão de armazenamento on-line, o kubelet passa as credenciais apropriadas para o driver.