如果我使用会发生什么
sudo dd if=/dev/zero of=/dev/sda
从安装Ubuntu 运行 /dev/sda
?
我在VM中进行了尝试,它似乎已正确擦除了磁盘。每次都会这样吗?这是“擦除” Ubuntu安装和所有数据的安全方法吗?
我的问题受到以下因素的启发:
如果我使用会发生什么
sudo dd if=/dev/zero of=/dev/sda
从安装Ubuntu 运行 /dev/sda
?
我在VM中进行了尝试,它似乎已正确擦除了磁盘。每次都会这样吗?这是“擦除” Ubuntu安装和所有数据的安全方法吗?
我的问题受到以下因素的启发:
Answers:
实际上,文件系统仍处于挂载状态,并且某些写入被缓冲,这意味着它们仍在RAM中等待写入磁盘。假设dd
正确地覆盖了所有内容,并且紧随其后的是缓冲区被刷新,并且一些潜在的敏感数据被写回到磁盘。因此,这不是擦除磁盘的安全方法。
您可以通过以下方式避免此问题:首先以只读模式重新安装磁盘上的根文件系统和任何其他文件系统(或完全卸载它们,但是您将无法使用根文件系统),然后再进行应该在文件系统上完全允许更多写操作(因此,没有要刷新的缓冲区),因此您的命令现在应该是安全的,即使在发生紧急情况时这仍然是一个坏主意,因为这需要很长时间。
如果您想要某种紧急删除功能,建议您使用LUKS(Ubuntu安装程序可以做到)对磁盘加密,然后在Security Stack Exchange上按照我的回答进行操作。这涉及擦除仅2MB大小的cryptheader,并且只需不到一秒钟的时间即可覆盖。然后重新启动系统,磁盘加密密钥将从内存中消失,因为cryptheader本身也消失了,因此无法恢复它们。
我牺牲了VM,使用了dd
来自Arch Wiki页面的略微更高级的使用和修改。
首先安装一个不错的进度表:
sudo apt-get install pv
然后运行“增强” 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
这将使磁盘充满AES密文。完整安全地擦除磁盘吗?可能比您自己的dd
示例更好,但是没有什么是完全安全或有保证的...
而且您欠我一台VM :)
参考文献:
dd
和pv
请用零填充磁盘(if = / dev / zero)的语法如何?
pv
(管道查看器)对其进行管道dd if=/dev/zero | pv | dd of=/dev/sdX
简短的答案:它将大致执行您想要的操作,然后什么也不会起作用。使用dd
您在文件系统以下的级别进行操作,这意味着所有适用的约束都不再相关(这并不意味着内核无法阻止您执行此操作,但事实并非如此)。文件系统中的某些内容已在内存中,例如内核和dd
程序本身,而某些内容将在缓存中。如果系统处于多用户模式,则可能会在文件进行过程中写回某些文件dd
(假定它们实际上已更改),并且如果您在内存压力下,那里的某些页面也可能被换出(它们应该被加密,因此重启后将无法使用)。
在此之后您要发出的大多数命令(包括reboot
)将不在缓存中,因此将无法使用。因此,如果您处于单用户模式下,它将做得非常好;如果处于多用户模式下,它将擦除绝大多数数据。理想情况下,您应该从其他介质启动它(甚至可能停止在initrd上),以便可以确定所有写入来自何处。
如果要安全擦除,将无法完成任务,因为如果将其归零,仍然会残留一些原始数据。通常,您最多需要进行三次随机写入,这意味着从中复制/dev/urandom
而不是/dev/zero
-慢得多但更安全。有人可能建议您使用/dev/random
“纯”随机数据的设备-无伪随机-但为此目的,有人设法破解PRNG种子并成功掩盖数据的机会基本上可以忽略不计。
如果您真的很偏执,则需要将存储设备放入熔炉中,以使其消磁/放电。
它会像在VM中一样擦除磁盘并导致系统无法使用。
但是,如果您想到的是“紧急删除”,dd
可能还不够快,并且我不确定在这种情况下是否有更快的命令或程序提供该功能。