安全擦除磁盘/技巧和窍门
请参阅 安全擦除磁盘 以获取主文章。
本文介绍了一些替代擦除方法,以补充那些可以加速擦除的专用工具。
tune2fs
工具禁用它们。擦除单个文件
擦除单个文件包括两种基本方法和一种高级反取证耗时方法,后者只能使用专用工具完成,最后一种方法不在本文讨论范围之内。
- 在删除前用随机数据覆盖,或者用另一个内容替换内容,但不更改文件大小。
- 使用专用工具擦除文件和文件系统存储的元数据
- 搜索整个磁盘中已删除文件的残留部分,并擦除它们,而不会对其他文件及其痕迹进行任何更改。
可以在不更改文件大小的情况下使用常见的 Linux 实用程序覆盖文件
- 调用
shred -x file
将用伪随机数据替换 *文件* 的内容,而不会更改文件大小 (-x
)。使用-u
选项将在覆盖后删除 *文件*。 - 使用
mkfs
,您可以将文件转换为文件系统,这将更改其中的所有内容,挂载并填充任何其他内容以进行更好的覆盖。 dd
将创建一个具有预设大小和您选择的内容的文件,如果目标文件名存在,则它将被覆盖。使用dd
命令,您可以通过组合skip
和seek
选项来替换整个文件或仅替换其中的一部分内容。您需要知道文件的大小以避免文件扩展,为此可以使用du -b 文件名 | cut -f1
或stat -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
循环结合使用。参见
- 转换文本文件中的字符集
- 高级 Bash 脚本编程指南 - 介绍了关于如何从 bash 脚本创建文件的更高级方法
- sed 替代方案 - 一个 perl 示例,它比 sed 更适合替换文件中的内容
覆盖目标
防止擦除已挂载的分区
选择要擦除的设备需要格外小心;一个简单的拼写错误就可能损坏系统。为了最大限度地降低这些风险,您可以使用一个简单的脚本来包装您最喜欢的擦除工具。例如
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
,您将能够通过将 skip
和 seek
选项与随机值或固定值相结合来选择要还原的文件部分,例如,仅从文件还原分区开头或结尾,相关的是用于将文件部分输出到标准输出的 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 ...
周围的第二个循环中的变量来更改源模板文件的目标,以便在每个新循环中使用。参见
- 扇区大小 - 文件创建和扇区大小
擦除可用空间
您可以通过几种方式擦除可用空间
- 重定向输出 到文件而不是分区或设备。
- 通过在循环中使用
cp
命令以及随机文件名或目标目录来创建多个文件副本,直到没有剩余可用空间。 - 使用一个实用程序,该实用程序可以创建带有随机密码和文件名的加密文件。一些文件压缩实用程序具有用于压缩方法、文件类型的选项,甚至可以在创建时将文件拆分为预设大小的卷。通过在循环中随机使用一些选项,您将能够用加密数据填充整个可用空间并覆盖以前的数据。
- 使用专门的程序来擦除可用空间,例如
wipefreespace — 安全擦除可用空间,安全地擦除文件系统上的可用空间,以防止恢复已删除的敏感数据。
zerofree — 扫描文件系统中非零的可用块,并用零填充它们
使用 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;