当我使用“dd”覆盖运行 Ubuntu 的磁盘时会发生什么?

Jon*_*sCz 10 uninstall partitioning dd secure-erase

如果我使用会发生什么

sudo dd if=/dev/zero of=/dev/sda
Run Code Online (Sandbox Code Playgroud)

从 Ubuntu 安装运行 /dev/sda


我在 VM 中尝试过,它似乎正确地擦除了磁盘。每次都会这样吗?这是“擦除”Ubuntu 安装和所有数据的安全方式吗?

我的问题受到以下启发:

  1. 如何从计算机上卸载 Ubuntu?
  2. 'rm -rf /' 如何删除系统中的所有文件?.

And*_*rie 16

实际上,文件系统仍处于挂载状态,并且一些写入已被缓冲,这意味着它们仍在 RAM 中等待写入磁盘。假设dd正确地覆盖了所有内容,就在其后面,缓冲区正在刷新,一些潜在的敏感数据正在被写回磁盘。所以不,这不是擦除磁盘的安全方式。

您可以通过首先以只读模式重新挂载根文件系统和磁盘上的任何其他文件系统(或完全卸载它们,但您将无法使用根文件系统)来避免此问题,然后,不应该允许在文件系统上进行更多写入(因此没有要刷新的缓冲区),因此您的命令现在应该是安全的,即使在发生恐慌时这仍然是一个坏主意,因为它需要很长时间。

如果您想要某种紧急删除功能,我建议您使用 LUKS 加密您的磁盘(Ubuntu 安装程序可以这样做),然后按照我在 Security Stack Exchange 上的回答进行操作。这涉及擦除大小仅为 2MB 且覆盖时间不到一秒的 cryptheader。然后重新启动系统,磁盘加密密钥将从内存中消失,无法恢复它们,因为 cryptheader 本身也消失了。


and*_*.46 10

我牺牲了一个虚拟机,使用ddArch Wiki 页面借来和稍微修改的稍微高级的用法。

首先安装一个不错的进度表:

sudo apt-get install pv
Run Code Online (Sandbox Code Playgroud)

然后运行“增强”dd命令

sudo openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null \
| base64)" -nosalt </dev/zero \
| pv -bartpes "$(sudo blockdev --getsize64 /dev/sda)" \
| sudo dd bs=64K of=/dev/sda
Run Code Online (Sandbox Code Playgroud)

这将使磁盘充满 AES 密文。完整且安全的磁盘擦除?可能比你自己的dd例子更好,但没有什么是完全安全或保证的......

在此处输入图片说明

你欠我一台虚拟机:)

参考:

  • 您不需要牺牲 VM - 只需事先制作快照,并在完成后恢复:-) (3认同)

小智 6

简短的回答:它会大致完成你想要的,然后什么都不起作用。使用dd您是在低于文件系统的级别操作,这意味着任何适用于那里的约束都不再相关(这并不意味着内核不能阻止您这样做 - 但事实并非如此)。文件系统中的一些内容已经在内存中,例如内核和dd程序本身,还有一些将在缓存中。有一种可能性是,如果系统处于多用户模式,则某些文件可能会在执行dd过程中被写回,假设它们实际上已更改,并且如果您处于内存压力之下,则那里的某些页面也可能会被换出(它们应该被加密,因此在重启后无法使用)。

您在此之后发出的大多数命令 - 包括reboot- 不会在缓存中,因此不会起作用。因此,如果您处于单用户模式,它会做得非常好,如果您处于多用户模式,它将擦除绝大多数数据。理想情况下,您应该从其他介质启动它(甚至可能在 initrd 上停止),以便您可以确定所有写入的来源。

如果您想要安全擦除,这将不起作用,因为如果您将原始数据归零,仍然会有一些原始数据的痕迹。通常,您最多需要三个随机写入,这意味着从而/dev/urandom不是复制/dev/zero- 慢得多但更安全。有些人可能会建议您使用/dev/randomwhich 是“纯”随机数据的设备 - 没有伪随机 - 但为此目的,有人设法破解 PRNG 种子并成功屏蔽数据的机会基本上可以忽略不计。

如果你真的很偏执,你需要把存储设备扔进炉子里,让它消磁/放电。