Для улучшения работы сайта мы используем файлы cookies. Оставаясь на сайте, вы соглашаетесь с политикой обработки персональных данных.

Шифрование томов

Longhorn поддерживает шифрование томов в режимах Filesystem и Block, обеспечивая защиту от несанкционированного доступа, утечек данных и нарушений требований соответствия. Резервные копии, созданные с зашифрованных томов, также сохраняются в зашифрованном виде.

Шифрование томов реализуется с помощью модуля ядра Linux dm_crypt, утилиты командной строки cryptsetup и Kubernetes Secrets. dm_crypt и cryptsetup обеспечивают создание и управление зашифрованными устройствами, в то время как Secrets (и связанные с ними разрешения) обеспечивают безопасное хранение ключей шифрования.

1. Требования

Шифрование томов Longhorn доступно в Nova начиная с версии v7.4.0.

Для работы функции в кластере предустановлены все необходимые компоненты:

  • Модуль ядра dm_crypt установлен на всех узлах

  • Утилита cryptsetup установлена в системное окружение

Таким образом, для создания зашифрованных томов не требуется дополнительная настройка рабочих узлов - достаточно указать параметр encrypted: true в StorageClass.

2. Настройка Kubernetes Secrets и StorageClasses

Longhorn использует Kubernetes Secrets для безопасного хранения ключей шифрования. Kubernetes поддерживает параметры-шаблоны, которые подставляются при создании тома. Чтобы использовать Secret с зашифрованным томом, необходимо настроить Secret в параметрах StorageClass.

Параметры-шаблоны позволяют применять Secrets как для отдельных томов, так и для их коллекций. Подробнее см. документацию StorageClass Secrets в Kubernetes CSI Developer Documentation.

В следующем примере ключ шифрования указывается как строка в параметре CRYPTO_KEY_VALUE. Использование данных типа строка избавляет от необходимости кодирования в Base64 перед применением kubectl create.

Кроме CRYPTO_KEY_VALUE в шифровании используются дополнительные параметры:

  • CRYPTO_KEY_CIPHER – алгоритм шифрования (по умолчанию aes-xts-plain64 для LUKS);

  • CRYPTO_KEY_HASH – алгоритм хэширования пароля (по умолчанию sha256);

  • CRYPTO_KEY_SIZE – размер ключа в битах (должен быть кратен 8, по умолчанию 256);

  • CRYPTO_PBKDF – алгоритм PBKDF для LUKS (по умолчанию argon2i).

Подробнее см. в статье cryptsetup(8) в man-страницах Linux.

Пример Secret
apiVersion: v1
kind: Secret
metadata:
  name: longhorn-crypto
  namespace: longhorn-system
stringData:
  CRYPTO_KEY_VALUE: "Your encryption passphrase"
  CRYPTO_KEY_PROVIDER: "secret"
  CRYPTO_KEY_CIPHER: "aes-xts-plain64"
  CRYPTO_KEY_HASH: "sha256"
  CRYPTO_KEY_SIZE: "256"
  CRYPTO_PBKDF: "argon2i"
Пример StorageClass с глобальным Secret
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: longhorn-crypto-global
provisioner: driver.longhorn.io
allowVolumeExpansion: true
parameters:
  numberOfReplicas: "3"
  staleReplicaTimeout: "2880" # 48 часов в минутах
  fromBackup: ""
  encrypted: "true"
  # глобальный Secret с ключом шифрования для всех томов
  csi.storage.k8s.io/provisioner-secret-name: "longhorn-crypto"
  csi.storage.k8s.io/provisioner-secret-namespace: "longhorn-system"
  csi.storage.k8s.io/node-publish-secret-name: "longhorn-crypto"
  csi.storage.k8s.io/node-publish-secret-namespace: "longhorn-system"
  csi.storage.k8s.io/node-stage-secret-name: "longhorn-crypto"
  csi.storage.k8s.io/node-stage-secret-namespace: "longhorn-system"
  csi.storage.k8s.io/node-expand-secret-name: "longhorn-crypto"
  csi.storage.k8s.io/node-expand-secret-namespace: "longhorn-system"
Пример StorageClass с Secret на каждый том
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: longhorn-crypto-per-volume
provisioner: driver.longhorn.io
allowVolumeExpansion: true
parameters:
  numberOfReplicas: "3"
  staleReplicaTimeout: "2880" # 48 часов в минутах
  fromBackup: ""
  encrypted: "true"
  # Secret создается на каждый том, с использованием шаблонов pvc.name и pvc.namespace
  csi.storage.k8s.io/provisioner-secret-name: ${pvc.name}
  csi.storage.k8s.io/provisioner-secret-namespace: ${pvc.namespace}
  csi.storage.k8s.io/node-publish-secret-name: ${pvc.name}
  csi.storage.k8s.io/node-publish-secret-namespace: ${pvc.namespace}
  csi.storage.k8s.io/node-stage-secret-name: ${pvc.name}
  csi.storage.k8s.io/node-stage-secret-namespace: ${pvc.namespace}
  csi.storage.k8s.io/node-expand-secret-name: ${pvc.name}
  csi.storage.k8s.io/node-expand-secret-namespace: ${pvc.namespace}

3. Использование зашифрованного тома

Для создания зашифрованного тома необходимо создать PersistentVolumeClaim (PVC), используя StorageClass, настроенный для шифрования. В качестве отправной точки можно использовать примеры StorageClass, приведенные выше.

После создания PVC будет оставаться в состоянии Pending до тех пор, пока не будет создан и станет доступным для извлечения связанный с ним Secret (ключ шифрования). Как только sidecar-контейнер csi externalprovisioner получит доступ к Secret, стандартный процесс создания тома продолжится с применением шифрования.

4. Расширение файловой системы

Longhorn поддерживает как онлайн расширение для зашифрованных томов.

Для онлайн-расширения требуются параметры:

  • csi.storage.k8s.io/node-expand-secret-name

  • csi.storage.k8s.io/node-expand-secret-namespace

5. История

  • Шифрование томов в режиме Filesystem – доступно начиная с v1.2.0 (#1859).

  • Шифрование томов в режиме Block – доступно начиная с v1.6.0 (#4883).