安全擦除磁盘/技巧和窍门

出自 ArchWiki

请参阅 安全擦除磁盘 以获取主文章。

本文介绍了一些替代擦除方法,以补充那些可以加速擦除的专用工具。

警告: 保留块 通过创建文件无法擦除,但可以使用 tune2fs 工具禁用它们。

擦除单个文件

警告: 如果分区之前进行过碎片整理、调整大小或移动,或者文件在同一设备上被复制过,则擦除单个文件的效果较差。如果整个加密数据容器部分被擦除,则恢复难度会大大增加,但如果不是几乎不影响性能的硬件加密加密会大大降低磁盘性能。另请参阅 安全擦除磁盘#数据残留
注意: 为了保留文件访问和修改时间,您可以使用 touch(1) 命令更改时间,并使用 stat(1) 命令在访问文件之前读取时间信息。另请参阅 文件系统比较 以了解它们对元数据和时间戳的支持。

擦除单个文件包括两种基本方法和一种高级反取证耗时方法,后者只能使用专用工具完成,最后一种方法不在本文讨论范围之内。

  • 在删除前用随机数据覆盖,或者用另一个内容替换内容,但不更改文件大小。
  • 使用专用工具擦除文件和文件系统存储的元数据
    • 搜索整个磁盘中已删除文件的残留部分,并擦除它们,而不会对其他文件及其痕迹进行任何更改。

可以在不更改文件大小的情况下使用常见的 Linux 实用程序覆盖文件

  • 调用 shred -x file 将用伪随机数据替换 *文件* 的内容,而不会更改文件大小 (-x)。使用 -u 选项将在覆盖后删除 *文件*。
  • 使用 mkfs,您可以将文件转换为文件系统,这将更改其中的所有内容,挂载并填充任何其他内容以进行更好的覆盖。
  • dd 将创建一个具有预设大小和您选择的内容的文件,如果目标文件名存在,则它将被覆盖。使用 dd 命令,您可以通过组合 skipseek 选项来替换整个文件或仅替换其中的一部分内容。您需要知道文件的大小以避免文件扩展,为此可以使用 du -b 文件名 | cut -f1stat -c "%s" 文件名。必须使用 iflag=fullblock 选项,请参阅 dd#Partial read: copied data is smaller than requested
  • 要避免大小更改,您可以使用 perl 实用程序用单个符号替换文件中的内容。

要擦除元数据,您可以将分区填充文件,这会使文件系统用新条目替换有关文件的旧条目,或者为此使用专用实用程序,请参阅下面的 擦除可用空间 部分。

如何组合所有 Linux 文件创建和转换工具以防止文件恢复和/或通过用随机内容或替换为预定义内容来误导恢复工具及其使用者,这取决于您。

注意
  • 如果可用空间充足,简单的覆盖有可能留下文件的错位部分。
  • 要在不更改磁盘上特定文件位置的情况下重写其内容,您可以首先创建一个或多个文件以使分区满,然后使用首选实用程序重写或替换您要隐藏的文件中的内容。如果可用空间非常大且文件非常少,则会消耗大量有用时间。

示例

Perl 命令,它将文件中的所有内容替换为 .

$ perl -p -i -e 's\[^*]\.\g' file_name

dd:

$ source_content | dd bs=size_in_bytes count=1 iflag=fullblock of=destination_file seek=0

或者通过使用标准输出重定向,创建速度稍快,但您将无法使用 seek 选项跳过目标中的某些部分

$ source_content | dd bs=size_in_bytes count=1 iflag=fullblock > destination_file
提示: 如果源文件小于目标文件,那么您将需要将其与下面部分中描述的 while 循环结合使用。

参见

覆盖目标

防止擦除已挂载的分区

选择要擦除的设备需要格外小心;一个简单的拼写错误就可能损坏系统。为了最大限度地降低这些风险,您可以使用一个简单的脚本来包装您最喜欢的擦除工具。例如

if [[ -e "$1" && -b "$1" ]];then
NOT_safe="$(lsblk -o "NAME,MOUNTPOINT" ${1//[0-9]/} | grep -e / -e '\]')";
 if [[ -z "$NOT_safe" ]];then
# Here you can use any of your favourite wiping tools
# to wipe destination passed on command line and stored in variable "$1"
#
  else
  echo 'Not allowed to destroy if any of the partitions is mounted: '"$NOT_safe"
 fi
fi 

dd - 高级示例

另一种方法是使用来自 OpenSSL 的随机种子 AES 密码来随机化驱动器/分区。例如

# DEVICE="/dev/sdX"
# PASS=$(tr -cd '[:alnum:]' < /dev/urandom | head -c128)
# openssl enc -aes-256-ctr -pass pass:"$PASS" -nosalt </dev/zero | dd obs=64K ibs=4K of=$DEVICE oflag=direct status=progress

上面的命令创建了一个从 /dev/urandom 播种的 128 字节加密密钥。CTR 模式下的 AES-256 用于使用 urandom 密钥加密 /dev/zero 的输出。利用密码而不是伪随机源可以实现非常高的写入速度,结果是一个填充了 AES 密文的设备。

上面的块大小设置为 64K,因为它通常比默认的 512 字节更快。尝试更大的块大小以找到适合您硬件的最佳传输速率:[1] 以及其中的参考文献。

另请参阅 dm-crypt/Drive preparation#dm-crypt wipe on an empty device or partition 以获得类似的方法。

使用模板文件

除了零之外,您可以使用一堆您希望被找到的文件,或者由 mkfs 格式化文件生成的分区打印输出,但您应该挂载并用内容或您选择的实用程序的任何其他重复输出填充它。

一种方法是擦除直到设备结束,但不建议使用这种类型的重定向,因为当出现关于设备结束的错误时,您必须使用停止键来中断 while 循环

$ while [ 1 -lt 2 ];do cat file1-to-use.as-template file2-to-use.as-template /tmp/templatefiles/* ;done > /dev/sd"XY"

如果使用选项正确设置了要擦除的大小,则使用 dd 可以安全地重复擦除,而不会出现空间不足错误。通过在 while 循环内为标准输出使用 dd,您将能够通过将 skipseek 选项与随机值或固定值相结合来选择要还原的文件部分,例如,仅从文件还原分区开头或结尾,相关的是用于将文件部分输出到标准输出的 head(1)tail(1) 命令。

while [ 2 -gt 1 ]; do
 if [ -z "$(pidof dd)"  ];then
  break ;
 fi;
cat file1-to-use.as-template file2-to-use.as-template /tmp/templatefiles/* ;
done | dd of=/dev/sd"XY" seek=start_sector bs=sector_size count=sectors_to_wipe
提示: 对于重复重写同一区域。您还可以使用 while ... done | dd ... 周围的第二个循环中的变量来更改源模板文件的目标,以便在每个新循环中使用。
注意: 如果您有大量预定义数据用于覆盖,那么您可以使用 SquashFS 的功能来压缩文件和文件夹。将它们压缩到挂载的 ramdisk 中将最大限度地减少物理读取量,但会增加 CPU 使用率。或者创建压缩存档,复制到 ramdisk 中,并使用文件提取实用程序,该实用程序可以将提取到标准输出。缺点是,如果您不想为每次运行都使用全部相同的内容,则在文件夹和文件之间导航会更加困难。优点是,如果存档在创建时被拆分为卷,您甚至可以使用存档的原始部分。

参见

擦除可用空间

警告: 在为 块设备加密做准备 之前使用它是不合适的。

您可以通过几种方式擦除可用空间

  • 重定向输出 到文件而不是分区或设备。
  • 通过在循环中使用 cp 命令以及随机文件名或目标目录来创建多个文件副本,直到没有剩余可用空间。
  • 使用一个实用程序,该实用程序可以创建带有随机密码和文件名的加密文件。一些文件压缩实用程序具有用于压缩方法、文件类型的选项,甚至可以在创建时将文件拆分为预设大小的卷。通过在循环中随机使用一些选项,您将能够用加密数据填充整个可用空间并覆盖以前的数据。
  • 使用专门的程序来擦除可用空间,例如

wipefreespace — 安全擦除可用空间,安全地擦除文件系统上的可用空间,以防止恢复已删除的敏感数据。

https://sourceforge.net/projects/wipefreespace/ || wipefreespaceAUR

zerofree — 扫描文件系统中非零的可用块,并用零填充它们

https://frippery.org/uml/ || zerofreeAUR

使用 dd

可以使用 dd 创建一个填充空白空间的文件

dd if=source of=junk
sync
rm junk

源可以是 /dev/urandom/dev/zero 流。在确保数据已在磁盘上同步后,该文件将被删除。

使用 7-Zip

Password="$(dd if=/dev/random bs=128 count=1 iflag=fullblock)"
DestinationFile="$((${RANDOM/0/1}$(date "+%s")/${RANDOM/0/1}))"
7z a -t7z -mhe=on -p"${Password}" -mx=0 -v1m ${DestinationFile} source

另请参阅 7z --help 以获取有关所用选项的描述。

源可以是具有随机数据的预定义文件或设备,例如 /dev/urandom 或另一个块设备或其上的分区,例如 /dev/sd"XY",使用您不怕被发现的数据,那么即使是其上的已删除文件也会被压缩到目标位置。

注意
  • 没有必要设置压缩级别,足以存储数据以最大限度地减少 CPU 使用率并更快地填充可用空间。
  • 如果您使用单个文件作为源,那么您可以将其放入 RAM 磁盘或 /tmp 文件夹中,因为它使用 tmpfs,后者分配一定量的 RAM,因为它会加快读取速度。

借助 timeout 命令创建多个文件

带有随机等待时间的 timeout 命令在 循环 中使用它将中断该命令,这将留下一个具有随机大小的文件。这是一种缓慢的方法,但也是可能的替代方法之一。您还可以在随机部分之前使用带有预定义文件名的数组。

AA=${RANDOM/0/1};
timeout $((AA/100)) cat /dev/urandom > filename${RANDOM}.tmp;

参见

  • 限制 不同文件系统上文件创建的限制。
  • 元数据 文件系统中的元数据可能会保留有关文件被删除后的信息。
  • 取证软件 取证软件使用元数据进行恢复,以及需要做什么来擦除元数据。