我刚刚阅读了Linus Torvalds 和(以及其他人)Milan Broz之间的讨论,他是 dm-crypt 的维护者之一。
我对讨论的以下部分很感兴趣:
Linus Torvalds:我认为那些使用隐藏(“可否认”)东西的人实际上根本没有使用过外部文件系统,正是为了让他们可以把真正加密的东西放在那里而不用担心它。
Milan Broz:好吧,他们实际上应该不时“使用”外部系统,这样数据看起来就“最近”了,对于整个“隐藏操作系统”,他们甚至应该能够根据要求启动到外部诱饵操作系统,只是为了表明一些东西工作在那里。
从理论上讲,我同意米兰的说法,使用诱饵数据是增加可信度的好事。但你如何在实践中实现这一点?例如,如何在不冒覆盖内部卷的风险的情况下写入外部卷?
多年来,我一直在使用隐藏的 LUKS 卷,结合可拆卸的标题和数据偏移量。通常我首先创建一个小的 LUKS 加密的外部卷(比如 20 GB),我用 EXT4 格式化它,用诱饵数据填充它,然后我增加这个外部卷的大小(例如 500 GB),然后我创建例如偏移量为 25GB 的内部卷。
在那之后我按照 Linus 所说的去做,我虔诚地避免接触外部卷的诱饵数据,因为害怕损坏内部卷的数据。
有没有办法刷新外部卷的数据,而不会有损坏内部卷数据的风险?例如,是否有一种工具可以专门在外卷的前 20 个 Gigs 上写入,确保不会弄乱后面的 480 gigs?
我同时使用 HDD 和 SSD,所以这个问题对两者都适用。
可能有几种方法可以合理安全地做到这一点,如果从新的外部体积或现有的外部体积开始,则可能采用不同的方法。
执行此操作的最佳方法可能是
debugfs setb
在未安装的外部文件系统设备上使用命令来标记属于内部卷的块范围,然后再安装外部文件系统并在那里更新文件。:如果文件有不相交的范围,则可以通过管道传输具有块范围的文件来编写多个 setb 命令的脚本,例如:
阅读
debugfs
文件debugfs -c -f <file> /dev/<outer>
。fallocate -s 32M mydir/inner
如果你想比仅仅在外部文件系统末尾打包内部卷更聪明一点,内部卷最初可以在外部文件系统中创建,然后块范围可以从生成debugfs
:在这种情况下,~32MB(7935x4KiB 块)文件位于块 966656-974590 中,因此这将用于
setb 966656 7935
标记那些已使用的块。应擦除 inodeclri <inum>
以防止分配的块范围之后可见。在外部文件系统中分配的块
debugfs setb
将保持分配状态,直到下一次在外部文件系统上运行 e2fsck。如果有人真的注意的话,这可能会“暴露”那些正在使用的块,因此可以选择在卸载外部文件系统后再次清除它们,使用 `debugfs -c -R "clrb <inner_start> <inner_count>" /dev /”,或保持分配以避免内部文件系统可能被损坏。我自己不使用似是而非的推诿,因此请将此视为评论。
您可以为作业使用设备映射器
dmsetup
( )。它允许您设置线性映射(映射到实际数据的扇区范围)、错误映射(不存在的扇区范围,只会产生读/写错误)、零映射(丢弃写入并在读取时返回零的扇区范围), 快照 (写时复制覆盖), ...
因此,您可以构造一个块设备,其中只有外部卷区域可见,内部卷受到保护,并且对内部卷的写入将被有效丢弃或仅临时存储在快照区域中。并且在这些区域中尝试读取可能会产生零或读取错误。
您可以在该外部卷上安装甚至启动 VM,它根本无法损坏或访问您的内部卷。但是,在没有这层保护的情况下使用它时没有这样的承诺。
另一种选择是通过在外部卷中创建文件来分配空间,然后使用 dm-linear 从分配的文件空间中创建可用的块设备(
filefrag
将显示为每个文件分配的扇区范围)。这样,外部文件系统的文件将保护内部卷。这种方法将允许您自由使用外部文件系统,甚至可以在其上运行 TRIM/discard。只要表示内部卷的文件保持不变,任何事情都可以。这还假设外部卷文件系统不会自行重新定位/重写文件内容(没有碎片整理、重新压缩、去重等)。