Hack 和 / - 灾难降临之时:rm 命令的攻击
以下是一系列关于 Linux 灾难以及如何从中恢复的专栏文章的续篇,部分灵感来自于万圣节特别节目 Linux Journal Live,主题为“恐怖故事”。您可以在 www.linuxjournal.com/video/linux-journal-live-horror-stories 观看原始节目。
命令行中的某些命令非常直接,具有潜在的破坏性,以至于每次我使用它们时,我都会在按下 Enter 键之前暂停片刻。在我的上一篇专栏文章中,我讨论了我一直以来最喜欢的命令之一:dd(可能代表 Destroy Data,即“销毁数据”)。当然,尽管 dd 非常有用,但我并不是每天都使用它,所以即使我怀着敬畏之心对待这个命令,您可能会认为它无法与真正的数据破坏大师相提并论:rm。是的,dd 可以在短短几下按键中擦除您的硬盘驱动器,但没有什么能真正与以下命令的紧凑破坏力相提并论:rm -rf /.
没错,大多数人不会受到这个版本的命令的困扰。通常,是它更阴险的兄弟:rm -rf ./在错误的目录下运行。场景大概是这样的:
rm -rf ./
硬盘驱动器发出咔哒声... “嗯,这比我想象的要花更长时间...嘿!” Ctrl-C Ctrl-C Ctrl-C。
太迟了。当您注意到您在错误的终端中运行该命令时,您的一半主目录已经消失了。当我刚开始使用 Linux 时,我总是被告知,按照真正的 UNIX 风格,当您 rm 一个文件时,它就消失了,而且您无法将其恢复。反删除命令是为 DOS 用户准备的——我们 Linux 用户更清楚,对吧?好吧,事实证明,我们并不清楚。我认识的大多数 Linux 用户一生中至少删除过一次错误的文件。现在,防止这种情况的最佳保护措施是备份(注意到本系列文章中的一个共同主题了吗?),但是如果您没有备份,您并非完全没有希望。您可能被告知的关于 rm 命令的一切并非完全正确,到本文结尾,您会发现 Linux 确实有某种形式的反删除。
要理解如何恢复已删除的文件,重要的是要理解 rm 的作用。当 rm 删除文件时,它本质上是将这些块添加到该文件系统上的可用剩余空间中。除非您使用像 shred 这样的工具,否则这些块中的数据会保持完整,直到另一个文件覆盖它们。块不会按任何日期顺序重用,因此一些释放的块可能会在系统上保留数天、数周甚至数年,然后才重新分配给新文件,而另一些块可能会立即被重用。
由于 Linux 系统不断写入文件,因此当您意外删除文件时,时间对您不利。如果您删除了重要文件,您应该做的第一件事是卸载该文件系统。如果您无法轻松卸载文件系统,请关闭系统。或者,如果这些文件格外重要,您甚至可以拔掉电源插头,以确保没有其他文件写入磁盘。
事实证明,容易发生意外的 Linux 用户并不是唯一想恢复已删除文件的人。实际上,已删除文件恢复对于法证学特别有用,因为攻击者可能会尝试删除文件以掩盖他们的踪迹。法证工具在文件系统的底层工作,因为它们试图收集传统工具可能会遗漏的数据。
要恢复已删除的文件,您需要安装 sleuthkit。现在大多数发行版都将其作为软件包提供;否则,您可以从该项目的网站下载源代码。可能不用说,不要在您要恢复的文件系统上安装 sleuthkit! 如果您需要从根文件系统恢复文件,这可能意味着您必须将硬盘驱动器拿到第二台系统,或者使用像 Knoppix 这样的包含 sleuthkit 的救援磁盘。
安装 sleuthkit 后,您需要获得第二块磁盘,其容量要足够大,可以存储您要恢复的任何文件。与其他一些恢复方法不同,使用 sleuthkit,您不必创建剩余空间的完整映像,因此您不需要那么多存储空间。您可以使用 df 工具查看您有多少剩余空间
$ df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 9.4G 7.0G 2.0G 79% / /dev/sda3 20G 17G 3.6G 83% /home
在本例中,我在我的 / 分区上有大约 2GB 的空间,在 /home 中有 3.6GB 的空间来恢复文件。对于本例,假设我已经将恢复文件系统连接到这台机器,并且它显示为 /dev/sda1。请务必不要挂载此文件系统。或者,如果您的机器自动挂载了它,请务必在继续之前卸载它,这样您就不会意外地写入它。由于 /home 有更多剩余空间,我将恢复到它,因此我创建一个目录来存储恢复的文件,然后使用 sleuthkit fls(法证 ls)命令来创建它可以找到的 /dev/sda1 上所有已删除文件的列表
$ mkdir ~/recovery $ sudo fls -f ext -d -r -p /dev/sdb1 \ > ~/recovery/deleted_files.txt
此命令可能需要一些时间,具体取决于它需要搜索多少剩余空间。同时,我们可以讨论这些不同参数的含义。fls 手册页中有更详细的介绍,但 -f 参数指定 fls 正在扫描的文件系统(ext 用于 ext2 和 ext3)。如果您不确定要使用什么值,请输入fls -f list以查看文件系统的完整列表。默认情况下,fls 可以列出特定文件系统上的所有文件,但是当您指定 -d 时,它只列出已删除的文件。-r 选项启用递归,因此它会遍历它找到的所有目录,-p 选项输出每个文件的完整路径。如果没有 -p,如果多个文件具有相同的名称,则可能很难区分它们。最后,您列出要 fls 扫描的分区。
一旦 fls 完成,您可以打开 ~/recovery/deleted_files.txt 以查看文件系统上所有已删除文件的完整列表。它看起来会像这样:
d/d * 944680: home/kyle/.mutt r/r * 943542: home/kyle/.muttrc r/r * 910452: home/kyle/may_lj_article.txt
第一个字段告诉您文件是目录 (d/d) 还是常规文件 (r/r)。接下来是文件的 inode 号,最后,您会看到文件的路径。假设,在本例中,我想恢复 /home/kyle/may_lj_article.txt 文件。然后我会使用 sleuthkit icat 工具来恢复它。icat 程序是 cat 的特殊版本,它将 inode 作为参数。在本例中,我将指定 inode 910452
$ sudo icat -f ext -r -s /dev/sdb1 910452 \ >~/recovery/may_lj_article.txt
与 fls 一样,这可能需要一些时间才能完成。您可以在 icat 手册页中阅读有关其所有参数的信息,但在这里我使用 -f 来指定文件系统类型,就像 fls 一样。-r 选项告诉 icat 进入它用于已删除文件的特殊恢复模式。-s 选项使 icat 输出它找到的任何稀疏文件的完整内容。最后,我指定要从中恢复的分区和要恢复的 inode。一旦命令完成,我可以打开 ~/recovery/may_lj_article.txt,看看它是否能够恢复它。
当您只需要恢复少量文件时,此方法效果很好,但是如果您需要恢复数百个文件怎么办?好吧,如果您在线搜索,您会找到许多不同的人编写的 shell 脚本,以自动从 fls 输出中恢复所有已删除的文件。下面是我最初在 forums.gentoo.org/viewtopic-t-365703.html 找到的一个脚本,然后进行了一些改进
#!/bin/bash DISK=/dev/sdb1 # disk to scan RESTOREDIR=/home/kyle/recovery # directory to restore to mkdir -p "$RESTOREDIR" cat $1 | while read line; do filetype=`echo "$line" | awk {'print $1'}` filenode=`echo "$line" | awk {'print $3'}` filenode=${filenode%:} filenode=${filenode%(*} filename=`echo "$line" | cut -f 2` echo "$filename" if [ $filetype == "d/d" ]; then mkdir -p "$RESTOREDIR/$filename" else mkdir -p "$RESTOREDIR/`dirname $filename`" icat -f ext -r -s "$DISK" "$filenode" \ > "$RESTOREDIR/$filename" fi done
将此脚本保存在 /usr/local/bin/restore 下。要使用此脚本,请替换脚本顶部的 DISK 和 RESTOREDIR 变量,使其与您的环境匹配,赋予它可执行权限,然后使用您之前创建的 fls 输出作为参数运行它。所有恢复的文件都将位于您设置的 RESTOREDIR 中,并嵌套在其父目录中
$ sudo chmod a+x /usr/local/bin/restore $ sudo /usr/local/bin/restore ~/recovery/deleted_files.txt
现在,不要让这让您对 rm 太过放心——不能保证特定文件会完整,甚至完全恢复。我仍然认为最好的策略是进行备份,然后在按下任何递归 rm 命令的 Enter 键之前深思熟虑。
Kyle Rankin 是旧金山湾区的高级系统管理员,也是多本书籍的作者,包括 O'Reilly Media 出版的 Knoppix Hacks 和 Ubuntu Hacks。他目前是 North Bay Linux Users' Group 的总裁。