删除旧数据文件的原因和销毁旧纸质文档的原因是相同的。本文将向您介绍如何在 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 发行版在安装时都会询问您是否要使用加密。选择“是”会为您节省很多未来的麻烦。您可能不需要处理秘密或敏感信息。但是,如果您计划在您使用完计算机后将其赠予或出售给他人,那么加密也会简化该过程。