我需要在 2.6.32 linux 内核上提供具有静态加密的高可用性 MySQL 数据库。“高可用性”部分并不难,但事实证明,与 HA 结合使用时,“静态加密”是一个挑战。
关键问题在于安装加密存储。在我们所有其他的静态加密系统上,有一个命令需要由人来运行,然后系统会提示输入加密密钥。当涉及到服务必须自动启动的集群安排时,该模型有一个相当明显的缺陷。
我目前不知道如何在 HA 环境中提供静态加密,而不是在同一系统上存储密钥密码。
我可以看到两种可能的情况,其中任何一种都适用于我的环境,但我不确定使它们起作用的细节。或者即使有可能。
场景 1:CLVM 和集群
- 我的集群成员之间共享一个卷。
- 本卷设置大致如下:
- 物理设备上的 cryptsetup 内容
- 新加密设备上的 LVM 内容
- 集群服务设置为不自动加入集群,依赖于手动干预。
- 集群服务是通过人类运行的命令启动的,它提供解密密钥,进而激活 CLVM 的东西。
通过这种方式,运行中的节点可以访问 CLVM 卷,因此它们可以在集群管理器通知时启动服务。节点的重启仍然需要人工操作,而且 crypt 密码永远不会保存在磁盘上的任何地方。
场景二:DRBD & 集群
- 在每个集群成员上创建一个卷
- cryptsetup 东西在物理设备上运行
- drbd 配置在加密设备之上,以在每个节点之间复制它
- LVM 或文件系统位于 drbd 卷之上
- 集群服务设置为不自动加入集群,依赖于手动干预。
- 集群服务由提供解密密钥的人启动,这反过来使 LVM(或文件系统)可见但未安装。
与 CLVM 设置一样,节点在了解可能共享的存储之前不会加入集群。
问题是,我不确定以上任何一种是否以这种方式工作。两者都假设可以将 LVM PV 置于加密卷之上(例如pvcreate /dev/mapper/cryptmysql
)。这可能是不可能的。
主要挑战似乎是关键输入的人为干预。这有一些帮助:dm-crypt 支持您的平台可能提供的 TPM。有关配置详细信息,请参阅此 IBM 蓝图。LUKS/cryptsetup还支持从文件/标准输入中读取槽密钥。如果您可以将密钥安全地存储在某处(例如智能卡上),这可能是一个可行的选择。
至于您是否可以在 dm-crypt 卷上拥有 LVM PV 的问题:可以,您只需要在插槽解锁后运行
pvscan
/即可。vgchange -a -y
几年前,我们用更旧的内核运行过这种设置。最后,由于性能原因,我们放弃了它,转而支持将 SED 用于具有静态数据加密要求的应用程序(dm-crypt 当时用于为每个加密设备使用一个线程,这导致我们设置中的 CPU 瓶颈)。事实证明,正如 syneticon-dj 所建议的那样,这对于 LVM 是完全可行的。从那时起,我已经验证它适用于集群配置。然而,这样做并不像您想象的那么容易。
在 cLVM 卷组可见之前,它必须在
cryptsetup luksOpen
需要加密的设备上通过解密。这必然会在集群服务启动后发生,因此基于它的任何资源都不应该是任何关键设备(例如 stonith 设备)的成员。设置集群与往常一样,但有一些不同:
cryptsetup luksOpen /dev/sdd cryptmysql
)时,创建 clvm 资源vgcreate ClusterMySQLVG /dev/mapper/cryptmysql
)由于节点需要手动干预才能符合故障转移的条件,因此在故障转移群集中拥有两个以上的节点是个好主意。
正常创建卷组和逻辑卷后,安装 MySQL。此时安装按照正常的集群安装运行。
当节点重新启动时:
/dev/mapper
,然后 LVM 将获取该映射。