注意
本文档适用于 Ceph 的开发版本。
Fscrypt 加密 CephFS
Fscrypt 是一种文件系统级别的加密实现。这种文件系统加密允许在每个目录级别进行加密。这使得文件系统可以同时包含加密和常规非加密部分。Fscrypt 加密会加密文件名和数据内容。
Fscrypt 加密的工作原理
加密密钥
每个 fscrypt 树都有一个主加密密钥。这个主密钥将提供加密目录所需的“秘密”。该密钥长度可达 256 位。
策略
fscrypt 根被分配一个加密策略。该策略包含诸如要使用的加密密码和主密钥 ID 等项目。这告诉客户端如何加密/解密以及如何将给定的主密钥 ID 验证到加密的 inode。
加密完全发生在客户端。MDS 和 OSD 不知道加密策略或主密钥。这些服务器组件的更改最小。它们在很大程度上继续存储文件名和数据内容(在这种情况下碰巧是加密的)。
访问语义
有一些语义允许根据客户端是否具有目录的主密钥而进行不同的访问。
有密钥时
您可以像往常一样访问文件系统。
您可以看到文件名、数据内容和链接目标。
没有密钥时
您看不到明文文件名或链接目标。
您无法打开文件。
您无法以任何形式访问数据内容,甚至无法访问加密版本。
您无法截断文件。
您将看到其他元数据,例如时间、模式、所有权和扩展属性。
注意
没有密钥,您无法备份或恢复。
通过示例学习
考虑一个名为 cephfs 的文件系统。客户端有两个主密钥和两个目录(encdir1 和 encdira)。每个目录可以有不同的加密主密钥。例如,encdir1 可以有 key1,而 encdira 可以使用 keyb。然后,一个常规目录(regdir)也将存在。请注意,regdir 是一个未加密的目录,出于多租户目的而显示。下图 1 说明了这一点。
在目录上设置策略时,该目录必须为空。然后,在该子树中创建的任何后续目录、文件或链接都将继承其父目录的策略信息。
图 1
密钥管理
每个客户端都有一个独特的文件系统视图和 fscrypt 树。对于此示例,请参考下面的图 2。有三个客户端,前两个客户端具有包含 fscrypt 功能的较新版本 CephFS 客户端,而第三个客户端没有。密钥的密钥管理是基于每个客户端的。一个客户端对 fscrypt 所做的操作,另一个客户端并不知道。让我们仔细看看细节中的细微差别。
第一个客户端,客户端 1,具有主密钥,并且能够透明地查看加密树,这是解锁模式。
第二个客户端,客户端 2,没有主密钥,没有完整的功能,这是锁定模式。在锁定模式下,用户无法查看明文文件名或数据内容。当用户列出目录内容时,它将看到加密文件名的哈希版本。然后,当发生 open() 时,将返回错误并拒绝操作。诸如文件大小、模式、时间戳和其他 inode 元数据之类的东西将以明文形式存储,并且在此模式下可用。
最后,客户端 3 正在使用旧版本的 CephFS 客户端,并且没有 fscrypt 功能。在这种模式下,用户具有与以前相同的视图,但能够对加密文件执行一些数据操作。不建议使用此模式,也不受支持。
图 2
CephFS 支持
CephFS 中有两种 fscrypt 实现。它在 CephFS 内核客户端中得到支持。此实现扩展了内核库中存在的功能,并利用了内核加密密钥环。
其次,用户空间客户端在 ceph-fuse 和 libcephfs 中支持 fscrypt。这两个版本都旨在互操作,但有一些限制。
用户空间限制
需要自定义 fscrypt CLI 才能使用用户空间 fscrypt。这是由于内核中(ceph-fuse 使用的)永久配置定义不正确所致。相反,有一个作为 Ceph 项目一部分维护的 fscrypt 命令行实用程序。此版本包含配置和使用 fscrypt 所需的更改。
此版本可在以下位置获得:https://github.com/ceph/fscrypt/tree/wip-ceph-fuse
目前用户空间中支持 fscrypt 密码的子集。它们是
内容使用 AES-256-XTS
文件名使用 AES-256-CBC-CTS
在文件夹上设置策略时使用的任何其他密码都将被拒绝。
如何使用
设置系统范围的加密。这将初始化 /etc/fscrypt.conf
fscrypt setup
设置挂载范围的加密。这必须应用于文件系统的挂载点。这将设置内部 fscrypt CLI 配置文件,用于管理和跟踪加密密钥
fscrypt setup <mount pt>
设置要加密的目录(它必须为空)
fscrypt encrypt <dir>
锁定加密目录
fscrypt lock <dir>
解锁加密目录
fscrypt unlock <dir>
查看目录状态(它可以是常规目录或加密目录)
fscrypt status <dir>
快照和克隆中主密钥的行为
从 fscrypt 目录派生的所有快照和克隆的锁定状态将捆绑在一起。这意味着所有派生数据集将同时锁定或解锁。
例如,考虑
加密的
encdir1已解锁。创建
encdir1的快照作为encdir1_snap。创建快照
encdir1_snap的克隆作为encdir1_snap_clone1。
在这种当前状态下,encdir1、encdir1_snap 和 encdir1_snap_clone1 都已解锁,并且文件名和数据在每种状态下都可按预期访问。如果您对三者中的任何一个执行锁定,则三者都将变为锁定状态。
注意
快照名称未加密。