如何安全地从文件系统中删除文件的名称?

如何安全地从文件系统中删除文件的名称?

我想删除 Linux ext4 文件系统上的一个文件,使磁盘不包含姓名该文件位于磁盘上的任何位置(可用空间、文件系统元数据或其他任何位置)。

例如,我不想在磁盘上留下任何名为“passwords.txt”的文件的痕迹。

我有在超级用户上发布了这个问题以不同的形式,但没有人成功回答过这个问题。

我更喜欢使用/usr/bin/shred。它非常适合删除文件的数据,但文件的名称仍然显示在磁盘上。以下是我测试它的方法:

dd if=/dev/zero of=fs bs=1M count=300
hexdump -C fs   # verify it's empty
mkfs.ext4 fs
mkdir m
sudo mount fs m
sudo chown -R $USER m
cd m
echo secretkey > passwords.txt
cd ..
sudo umount m
grep secretkey fs   # <== shows up as expected
grep passwords.txt fs
strings fs | grep sec
strings fs | grep pass
sudo mount fs m
cd m
/usr/bin/shred -vuz -n 1 passwords.txt
cd ..
sudo umount m
grep secretkey fs   # <== does not show up, this is good
grep passwords.txt fs   # <== PROBLEM: filename still shows
strings fs | grep sec
strings fs | grep pass   # <== problem: still shows up
hexdump -C fs | grep sec
hexdump -C fs | grep pass

mount下面是显示某些文件系统模式的命令输出:

type ext4 (rw,relatime,data=ordered)

有兴趣的可以查看更多详情:

更新 1:

在粉碎文件之前将文件从 passwords.txt 重命名为“asdfasdf.txt”之类的随机名称并不能解决问题。在/usr/bin/shred详细模式下运行时,您会看到它在截断/取消链接文件之前经历了一系列文件重命名。我认为这是 shred 安全删除文件名称痕迹的方式。文件系统是否需要启用某些模式才能支持此功能?我将复制/粘贴文件shred删除过程中的输出:

/usr/bin/shred: passwords.txt: pass 1/2 (random)...
/usr/bin/shred: passwords.txt: pass 2/2 (000000)...
/usr/bin/shred: passwords.txt: removing
/usr/bin/shred: passwords.txt: renamed to 0000000000000
/usr/bin/shred: 0000000000000: renamed to 000000000000
/usr/bin/shred: 000000000000: renamed to 00000000000
/usr/bin/shred: 00000000000: renamed to 0000000000
/usr/bin/shred: 0000000000: renamed to 000000000
/usr/bin/shred: 000000000: renamed to 00000000
/usr/bin/shred: 00000000: renamed to 0000000
/usr/bin/shred: 0000000: renamed to 000000
/usr/bin/shred: 000000: renamed to 00000
/usr/bin/shred: 00000: renamed to 0000
/usr/bin/shred: 0000: renamed to 000
/usr/bin/shred: 000: renamed to 00
/usr/bin/shred: 00: renamed to 0
/usr/bin/shred: passwords.txt: removed

答案1

文件名存储在“目录”数据结构中,该结构具有“(string)filename”和相应的“(int) inode”值。目录负责将文件名映射到 inode,并将 inode 映射到磁盘上的扇区。文件名不像文件内容那样保存在磁盘的扇区上。

文件名和目录结构具有以下含义:

  • inode 不包含文件名,仅包含其他文件元数据
  • 目录是关联结构的列表,每个结构包含一个文件名和一个 inode 号
  • 文件系统在访问数据时,必须在目录中搜索特定的文件名,然后将文件名转换为正确的对应 inode 编号
  • 文件重命名不跨越文件系统边界,而只是元数据更改,因此应该保留 inode 编号
  • 在 ext4 文件系统上,名称记录确实会影响 inode 本身(修改时间会发生变化),但之前的名称仍未存储在任何地方

因此,将文件重命名为随机名称实际上应该会使名称永远消失,除非您的备份系统定期进行备份,在这种情况下您也必须处理这些备份。

相关内容