Linux 有许多工具可用于安全地擦除每个文件的数据:shred
,wipe
,srm
,... 随便你怎么说。相关说明和建议通常侧重于要删除的文件的内容,但很少关注这些文件的名称,大多数这些工具都会保留这些文件的名称,以便在剩余的目录条目中进行不必要的恢复。非日志文件系统的一个积极例外是shred
,见下文。
下面举一个例子来说明这个问题:
想象一下,你生活在一个对任何与 Fnords 相关的活动都严惩不贷的国家。所以你肯定不想被发现有一个名为
Frobnicating_Fnords_mini-HOWTO.html
即使该文件的内容被 覆盖了 32 次,它也不会在您的文件系统中消失
srm
。如果您使用非日志文件系统,则可以使用shred -u ...
,它通过在取消链接之前多次重命名文件来解决该问题。但是,
shred
不能用于目录。那么如何处理目录
Frobnicating_Fnords_mini-HOWTO_files
html
此示例中的文件附带什么?
这就是我提出这个问题的背景:
是否有一个 Linux 工具(或者可以在命令行上使用的 shell 脚本片段)可以安全地扰乱目录名称,以便无法在文件系统级别上再恢复它?
请注意:这个问题不是关于重复进入目录以删除整个目录树。而是关于伪装单个目录的名称。
集中讨论问题:让我们假设我们正在使用非加密、非日志文件系统,例如Ext2
。
展望来源shred
,即函数wipename
,似乎它只是renameatu
在取消链接文件之前执行简单的重命名()。不幸的是,我无法通过在命令行上模仿此方法获得所需的结果mv
。rename
(为什么?)有关详细信息,请参阅下面的补充。
当然,一种可能的解决方案是按惯例删除所有受影响的文件和目录,将整个文件系统内容复制到第二个文件系统,安全擦除第一个文件系统,并可选择将所有内容复制回来。但我正在寻找一种侵入性较小的方法,只要你听到他们的直升机的声音,你就可以迅速采取行动……
警告
这的手册页shred
仅在使用挂载选项 的情况下,在对 Ext3 文件系统进行日志记录时,效果才会有所滞后data=journal
。这只适用于文件内容的擦除,而不适用于shred
的文件名混乱能力:无论data
使用哪种挂载选项模式,后者都会在 Ext3 和 Ext4 上失效。原因是文件名是元数据,并且始终记录在这些文件系统上。在这些情况下,文件名是否仍然存在,shred -u ...
可以通过以下补充中显示的方法轻松验证。
补充
shred
正如 Patrick Mevzek 在他的评论中所建议的那样,我在这里给出了我模仿的重命名策略来扰乱目录名称的尝试的细节:
首先,我设置了一个(新的)映像文件来保存测试文件系统,并将该文件系统挂载到/mnt
:
rm -f img
truncate -s 3M img
losetup /dev/loop0 img
mke2fs -m 0 -t ext2 /dev/loop0
mount /dev/loop0 /mnt/
kkkkkkkkkk
然后,我在中创建了目录,并在其中创建了一个名为内容为的/mnt
常规文件。然后我同步了:lllllllllll
mmmmmmmmmm
cd /mnt
mkdir kkkkkkkkkk
cd kkkkkkkkkk
echo mmmmmmmmmm > lllllllllll
sync
检查图像文件(在另一个目录中),所有这些字符模式均可见:
# hexdump -C img | grep kkk
0001c030 d4 03 0a 02 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 00 00 |....kkkkkkkkkk..|
# hexdump -C img | grep lll
0001f820 6c 6c 6c 6c 6c 6c 6c 6c 6c 6c 6c 00 00 00 00 00 |lllllllllll.....|
# hexdump -C img | grep mmm
00080400 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 0a 00 00 00 00 00 |mmmmmmmmmm......|
回到过去/mnt/kkkkkkkkkk
,我做了一个
shred -u lllllllllll
得出
# hexdump -C img | grep kkk
0001c030 d4 03 0a 02 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 00 00 |....kkkkkkkkkk..|
# hexdump -C img | grep lll
# hexdump -C img | grep mmm
随后检查图像文件。请注意,最后两个命令没有给出任何输出:因此成功扰乱了常规文件的shred
内容(mmmmmmmmmm
)和名称( )。lllllllllll
现在我想覆盖(现在为空的)目录的名称kkkkkkkkkk
。为此,我做了:
cd /mnt
mv kkkkkkkkkk xxxxxxxxxx
sync
屈服
# hexdump -C img | grep kkk
0001c030 14 00 0a 02 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 00 00 |....kkkkkkkkkk..|
# hexdump -C img | grep xxx
0001c040 0c 00 00 00 c0 03 0a 02 78 78 78 78 78 78 78 78 |........xxxxxxxx|
相反,我不希望从 获得任何输出grep kkk
。显然,mv
为重命名的目录创建了一个新的目录条目,xxxxxxxxxx
而不是重新使用旧的插槽,因此仍然保留旧名称kkkkkkkkkk
。
我也尝试过rename(1)
,结果类似:旧目录名保留了下来。