Шифрование томов
Longhorn поддерживает шифрование томов в режимах Filesystem и Block, обеспечивая защиту от несанкционированного доступа, утечек данных и нарушений требований соответствия. Резервные копии, созданные с зашифрованных томов, также сохраняются в зашифрованном виде.
Шифрование томов реализуется с помощью модуля ядра Linux dm_crypt, утилиты командной строки cryptsetup и Kubernetes Secrets. dm_crypt и cryptsetup обеспечивают создание и управление зашифрованными устройствами, в то время как Secrets (и связанные с ними разрешения) обеспечивают безопасное хранение ключей шифрования.
1. Требования
|
Шифрование томов Longhorn доступно в Nova начиная с версии v7.6.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.
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"
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"
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