我计划设置一个使用 ecryptfs 进行加密的 NAS。我想知道 ecryptfs 是否会告诉我某个文件是否已被悄悄损坏(例如,由于硬盘故障),或者我是否仍然需要依赖底层文件系统来为我进行数据校验和?
无论如何,我可能会使用 btrfs 作为底层文件系统来获取快照功能,但我仍然有兴趣知道例如 ext4 + ecryptfs 是否会像普通 btrfs(或 btrfs + ecrypts)一样提供针对隐藏文件损坏的相同保证,因为 btrfs 具有校验和功能。
答案1
上述答案是错误的。eCryptFS 的实际实现是不是默认或根本不校验数据。简单演示:
$ mkdir /tmp/front /tmp/back
$ sudo mount -o key=passphrase:passwd=Test,ecryptfs_hmac,ecryptfs_enable_filename_crypto=no,ecryptfs_passthrough=no,ecryptfs_unlink_sigs,ecryptfs_key_bytes=16,ecryptfs_cipher=aes -t ecryptfs /tmp/back/ /tmp/front/
$ echo HelloWorld > /tmp/front/HelloWorld.txt
$ cat /tmp/front/HelloWorld.txt
HelloWorld
$ sudo umount /tmp/front
$ printf "deadbeaf" | dd of=/tmp/back/HelloWorld.txt bs=1 seek=8192 count=8 conv=notrunc
$ sudo mount -o key=passphrase:passwd=Test,ecryptfs_hmac,ecryptfs_enable_filename_crypto=no,ecryptfs_passthrough=no,ecryptfs_unlink_sigs,ecryptfs_key_bytes=16,ecryptfs_cipher=aes -t ecryptfs /tmp/back/ /tmp/front/
$ cat /tmp/front/HelloWorld.txt
<garbage>
还:
$ ecryptfs-stat /tmp/back/HelloWorld.txt
File version: [3]
Decrypted file size: [11]
Number of header bytes at front of file: [8192]
Metadata in the header region
Encrypted
HMAC disabled
eCryptfs 没有给出读取错误或任何错误迹象。请注意,即使有ecryptfs_hmac
选项,也会出现这种情况,该选项应该启用校验和,但显然没有。ecryptfs 的实际源代码确实包含 HMAC 代码,所以我不确定为什么它不起作用。快速的 Google 搜索表明 HMAC 代码可能不完整。还没有深入研究过。
答案2
加密文件系统对数据进行校验。有描述 eCryptFS 如何工作的论文。eCryptFS 所做的一件事是防止对手篡改文件,为此,它会计算 HMAC 并将其与加密文件一起存储。作为额外好处,这显然还可以防止意外“篡改”,例如宇宙射线、电子噪音或简单的磨损(统称为位腐烂)。
然而,文件系统还有一件事我确信加密文件系统不执行:镜像/复制和奇偶校验。使用镜像(RAID1)或奇偶校验(RAID5 或 RAID6),如果 btrfs 检测到当前正在读取的片段损坏,它能够自动找到该片段的良好副本。Ars Technica 有一个非常好的文章有关损坏以及如何最好地利用 btrfs 或 ZFS 的功能来保证数据安全。
如果你选择ext4 和 eCryptFS,你最多只能知道某些东西被损坏或篡改了,但你必须手动干预来处理这个问题。我建议坚持使用btrfs 和 eCryptFS,它既提供校验和(只要您不禁用写时复制),也可以维护数据的冗余副本(使用 RAID1、RAID5、RAID6 或 RAID10)。