如何在 Linux 上安全地删除文件

删除旧数据文件的原因和销毁旧纸质文档的原因是相同的。本文将向您介绍如何在 Linux 系统中安全地删除文件。内容涵盖了 shred 命令以及安全删除工具套件的使用方法。

已删除的文件通常可以被恢复

事实上,删除文件并不意味着它会立即从硬盘上消失。这主要取决于您的文件系统如何使用 inode。Inode 是一种数据结构,它保存着文件在文件系统中的元数据,包括文件的名称、在硬盘上的物理位置、属性和权限等信息。目录本身也仅仅是一个特殊的文件,存储着该目录下包含的文件的名称和 inode 编号。

当您使用 rm 命令删除文件时,文件系统会释放对应的 inode,并修改目录文件。这使得文件所占用的硬盘空间被标记为“未使用”,但文件的内容仍然保留在硬盘上。想象一下,您在图书馆里找到一本书的目录卡片,然后把它撕掉,书本身仍然在书架上,只是更难找到了。

换句话说,文件所占用的空间现在可以被其他文件使用了,但旧文件的内容仍然存在。在该空间被新数据覆盖之前,旧文件很有可能被恢复。

不过,彻底删除文件并不是简单地覆盖它们那么简单,接下来我们会看到。

不要在固态硬盘 (SSD) 上使用这些方法

本文介绍的技术适用于传统的机械硬盘 (HDD),不应在固态硬盘 (SSD) 上使用。因为这些方法不仅效果不佳,还会导致额外的写入,从而不必要地磨损 SSD。要安全地擦除 SSD 中的数据,您应该使用 SSD 制造商提供的专用工具。

shred 命令

shred 命令的作用是通过覆盖数据,使被删除的文件无法恢复。它已包含在包括 Ubuntu、Fedora 和 Manjaro 在内的所有常见 Linux 发行版中。

本例中,我们将在名为 ~/research 的目录下进行操作,该目录包含多个文本文件,以及一些包含其他文件的子目录。假设这些文件是敏感文件,需要从硬盘驱动器上彻底清除。

我们可以使用 tree 命令来查看目录结构,-d(目录)选项可以使 tree 只显示目录,而不列出所有文件。目录结构如下所示:

tree -d

粉碎单个文件

要粉碎单个文件,我们可以使用以下命令。其中使用的选项包括:

  • u: 在覆盖后释放并删除文件。
  • v: 详细模式,使 shred 告知我们它的操作过程。
  • z: 使用零执行最终覆盖。
shred -uvz Preliminary_Notes.txt_01.txt

shred 默认覆盖文件四次。前三次使用随机数据,最后一次使用零,正如我们所要求的。然后它会删除文件,并覆盖 inode 中的部分元数据。

设置覆盖次数

我们可以通过 -n(number)选项来让 shred 使用更多或更少的覆盖次数。shred 始终会至少进行一次覆盖。我们提供的数字是需要执行的额外覆盖次数。因此,shred 总共执行的覆盖次数会比我们要求的次数多一次。比如,要总共执行三次覆盖,我们需要指定额外的两次覆盖:

shred -uvz -n 2 Preliminary_Notes.txt_02.txt

不出所料,shred 进行了三次覆盖。

更少的覆盖次数,意味着更少的“粉碎”,速度会更快。但是安全性会降低吗?有趣的是,三次覆盖可能已经足够了。

粉碎多个文件

通配符可以与 shred 一起使用,选择要删除的一组文件。其中 * 代表多个字符,而 ? 代表单个字符。以下命令会删除当前目录下所有剩余的 “Preliminary_Notes” 文件。

shred -uvz -n 2 Preliminary_Notes_*.*

shred 会依次处理剩余的文件。

shred 没有递归选项,因此不能用于擦除嵌套目录下的目录树。

安全删除文件的隐患

尽管 shred 命令很好用,但仍存在一个问题。现代日志文件系统(如 ext3 和 ext4)会尽力确保数据不会损坏或丢失。因此,使用日志文件系统时,无法保证覆盖操作实际上发生在已删除文件所使用的硬盘空间上。

如果您仅仅希望文件被删除的程度比使用 rm 命令更彻底一些,那么 shred 命令可能就足够了。但是,不要错误地认为数据肯定已经消失,并且完全无法恢复。事实可能并非如此。

安全删除工具套件

安全删除命令试图克服日志文件系统带来的挑战,以便成功地安全地覆盖文件。但同样的警告仍然适用,仍然不能保证覆盖操作实际发生在硬盘驱动器上的目标区域,尽管机会更大,但不能保证成功。

安全删除命令使用以下覆盖和操作序列:

  • 用 0xFF 值字节覆盖。
  • 用随机数据覆盖 5 次。
  • 用 Peter Gutmann 定义的特殊值覆盖 27 次。
  • 用随机数据再覆盖 5 次。
  • 将文件重命名为随机值。
  • 截断文件。

如果这些操作对您来说过于复杂,那么您并不是孤单的。对奥克兰大学的教授 Peter Gutmann 来说,这些步骤似乎也有些过分。在 1996 年发表的一篇论文中,他讨论了这些技术。这导致了一个都市传说,即您需要使用论文中讨论的所有技术才能安全删除文件。

此后,Peter Gutmann 一直试图澄清误解,并表示:“用随机数据进行良好的擦除操作与预期的效果一样好。”

但现在我们仍然处于这些技术被广泛使用的状况。以下是安全删除命令所采用的一系列技术。首先,我们需要安装它们。

安装安全删除工具

如果您使用的是 Ubuntu 或其他基于 Debian 的发行版,请使用 apt-get 命令将该软件包安装到您的系统中。在其他 Linux 发行版上,请改用您的 Linux 发行版的包管理器工具。

sudo apt-get install secure-delete

安全删除软件包包含四个命令:

  • srm 是安全的 rm 命令,用于删除文件并覆盖其硬盘空间。
  • sfill 是覆盖硬盘上所有可用空间的工具。
  • sswap 用于覆盖和清理您的交换空间。
  • sdmem 用于清理您的 RAM。

srm 命令

srm 命令的使用方式与 rm 命令类似。要删除单个文件,请使用以下命令。 -z (zeroes) 选项使 srm 在最终擦除时使用零而不是随机数据。 -v (详细)选项会使 srm 通知我们其进度。

srm -vz Chapter_One_01.txt

您会注意到 srm 命令执行速度很慢。它在工作时会提供一些视觉反馈,当您再次看到命令提示符时,你会松一口气。

您可以使用 -l(降低安全性)选项将覆盖次数减少到两次,从而大大加快速度。

srm -lvz Chapter_One_02.txt

srm 会提示我们,它认为这样安全性会降低,但它仍然会为我们删除和覆盖文件。

您可以使用两次 -l (降低安全性)选项将传递次数减少到一次。

srm -llvz Chapter_One_03.txt

srm 与多个文件一起使用

我们还可以在 srm 中使用通配符。以下命令将擦除并销毁第一章的其余部分:

srm -vc Chapter_One_0?.txt

这些文件将由 srm 依次处理。

使用 srm 删除目录及其内容

-r (递归) 选项将使 srm 删除所有子目录及其内容。您可以将起始目录的路径传递给 srm

在本例中,我们将删除当前目录 ~/research 中的所有内容。这意味着 ~/research 中的所有文件和子目录都将被安全删除。

srm -vz *

srm 开始处理目录和文件。

最终它会返回到命令提示符。在测试机器上,删除分布在当前目录和三个嵌套目录中的大约 200 个文件大约需要一个小时。

所有文件和子目录都按预期删除。

sfill 命令

如果您担心之前使用 rm 命令删除的文件,该如何确保它们已经被覆盖? sfill 命令可以覆盖硬盘驱动器上的所有可用空间。

执行此操作时,您会注意到硬盘驱动器上的可用空间逐渐减少,直到完全没有可用空间。当 sfill 完成后,它会将所有可用空间释放给您。如果您正在管理一个多用户系统,这可能会产生破坏性影响,因此这项维护任务应该在您能够承受较长时间的停机时进行。

即使在单用户计算机上,硬盘空间的损失也意味着一旦 sfill 占用大部分空间,您就无法使用它。这是一项您应该启动然后让它自行完成的任务。

为了加快执行速度,您可以使用 -l (降低安全性) 选项。其他选项包括我们之前看到的 -v (详细) 和 -z (零) 选项。在这里,我们要求 sfill 安全地覆盖 /home 目录中的所有可用空间。

sudo sfill -lvz /home

让自己放松一下,在只有 10GB 硬盘驱动器的测试机上,这个命令是在下午中期启动的,并且在晚上某个时候完成。

它会运行几个小时。这与 -l (降低安全性) 选项相关。但最终,它会返回到命令提示符。

sswap 命令

sswap 命令会覆盖交换分区中的存储空间。我们需要做的第一件事是确定您的交换分区。我们可以使用 blkid 命令来列出块设备。

sudo blkid

您需要找到 “swap” 一词,并记下它所连接的块设备。

可以看到交换分区连接到 /dev/sda5

我们需要在覆盖期间关闭对交换分区的磁盘写入。我们使用 swapoff 命令:

sudo swapoff /dev/sda5

现在我们可以使用 sswap 命令了。

我们将使用 /dev/sda5 作为 sswap 命令行的参数。我们还会使用之前用过的 -v (详细) 和 -ll (降低安全性) 选项。

sudo sswap -llv /dev/sda5

sswap 开始在您的交换分区中工作,覆盖其中的所有内容。 它不需要像 sfill 那样长的时间。

完成后,我们需要将交换分区恢复为活动状态。 我们使用 swapon 命令执行此操作:

sudo swapon /dev/sda5

sdmem 命令

安全删除工具包甚至包含一个用于擦除计算机随机存取存储器 (RAM) 芯片的工具。

一个冷启动攻击需要在关闭计算机后不久对其进行物理访问。这种类型的攻击可能会允许从您的 RAM 芯片中检索数据。

如果您认为自己需要保护自己免受此类攻击(大多数人认为他们需要这样做有些牵强),您可以在关闭计算机之前擦除 RAM。我们将再次使用 -v (详细) 和 -ll (降低安全性) 选项。

sudo sdmem -vll

终端窗口将充满星号,表示 sdmem 正在处理您的 RAM。

更简单的选择:直接加密您的驱动器

与其安全删除文件,为什么不使用加密来保护您的硬盘驱动器或主文件夹?

如果您这样做,任何人无法访问您的任何数据,无论是活动文件还是已删除文件。而且您无需保持警惕并记住安全擦除敏感文件,因为您的所有文件都已受到保护。

大多数 Linux 发行版在安装时都会询问您是否要使用加密。选择“是”会为您节省很多未来的麻烦。您可能不需要处理秘密或敏感信息。但是,如果您计划在您使用完计算机后将其赠予或出售给他人,那么加密也会简化该过程。