shred 对擦除 SSD 有害吗?

H3R*_*T1K 29 ssd shred

每当我出售驱动器时,我都会使用来自现场环境的碎片将其归零一次:

sudo shred -vzn 0 /dev/sdX
Run Code Online (Sandbox Code Playgroud)

在我仔细检查之前,它没有安装。这是我所知道的安全擦除驱动器的最快方法。现在我听说这对 SSD 不利。有没有办法安全地擦除同样快或更快的 SSD?

从理论的角度来看,我理解您需要覆盖整个卷才能使恢复变得不可能。所以我不知道有什么方法可以减轻 SSD 的压力。有人告诉我一次通过根本不会减少 SSD 的使用寿命。

cat /dev/zero > /dev/sdX一样快吗?

我不是在这里处理敏感数据,也不需要保护驱动器免受知识渊博的人不遗余力地恢复数据的影响。快速是我所需要的,同时又不会减少 SSD 的使用寿命。

编辑:这是否适用于 SSD 就像适用于 HDD 一样?

dd if=/dev/urandom of=/dev/sdc bs=1M count=2
Run Code Online (Sandbox Code Playgroud)

dir*_*rkt 31

将块写入 SSD不会覆盖旧块。那是因为所有最近的 SSD 都使用称为“磨损均衡”的东西。

要将块写入SSD,需要先将其擦除,然后才能写入新数据。但擦除是一种只能执行有限次数的操作;每次进行擦除时,都会“削弱”硬件,直到无法再正确擦除该块。

因此,磨损均衡不是擦除和覆盖同一个块,而是让 SSD 选择一个不同的、未使用的块,并将写入该块,将旧块上的数据留在原地。

如果旧块上的数据就位,这意味着它仍然可以读取。

因此,您可以用来“覆盖”文件(、、、等等)的任何命令都有这个弱点:它实际上根本不会覆盖文件,而是将零、随机数据或其他任何内容写入块。cpddcatshred

因此,与 HD 不同的是,这不是确保您的数据消失且其他人无法读取的好方法。

所有这些命令对 SSD 来说都是“不好的”,因为任何写入都会耗尽 SSD 的有限写入次数,从而缩短 SSD 的使用寿命。并且shred特别糟糕,因为它会反复覆盖文件。在 HD 上,这有一个目的:读写头永远不会完全居中,因此多次覆盖它可以确保(或试图确保)在轨道边界处没有剩余的磁数据可以使用由知识渊博的人重建数据。


至于blkdiscard,它调用fstrim,它使用 ATAPI 修剪位告诉驱动器不再需要该块。您可以在ACS-4 规范中找到更多详细信息。

但同样,这并不安全:它只告诉 SSD 将此块放在空块列表中并且可以重复使用。SSD 可以选择立即擦除这个块,或者在它空闲的某个时间,甚至在下一次写入这个块之前。因此,这也不是确保您的数据消失的安全方法。

引入 TRIM 的原因是 SSD 无法确定文件系统是否仍在使用带有数据的块。这意味着即使文件系统已停止使用它,也无法将其添加到用于磨损均衡的池中。TRIM 从来都不是擦除块的安全方式


正如评论中提到的,有一种方法可以安全地擦除整个SSD。但是,如果您只想安全地擦除单个文件,那可能不是您想要的。


那么您的用例的解决方案是什么?如果真的

我不是在这里处理敏感数据,也不需要保护驱动器免受知识渊博的人不遗余力地恢复数据的影响

那么你就可以使用rm. 恢复ext4文件系统上已删除的文件实际上需要相当多的知识和努力,尤其是在此期间该文件系统发生了更多写入的情况下。这是可行的,但不是任何人。它当然是最快的变体。

下一个最好的是blkdiscard(它只适用于支持 TRIM 的 SSD,但对于现代 SSD 来说应该是这样)。虽然这不会使它安全,如上所述,但现在标准已经提高到可以直接访问 SSD 的人。没有必要的特殊硬件,没有人可以做到这一点。

以任何方式覆盖文件仍然是最糟糕的:重建的门槛与上述相同,但这样做会缩短 SSD 的使用寿命,而且无论使用哪种命令,它都会花费更长的时间。

  • 从“shred is bad”(对于单个文件是正确的,无论 HDD/SSD 是什么;对于完整的设备擦除来说都很好)到“blkdiscard 不安全”(理论上是正确的,实际上通常很好)到“你可以只使用 rm " 对我来说听起来是个糟糕的建议......任何人都可以进行 photorec,最终对于 SSD,它仍然是 TRIM/discard (blkdiscard, fstrim,discard mount flag) 来摆脱这些数据。对于 HDD,您必须一次性覆盖(整个设备或所有可用空间)。多次通过根本没有任何意义。 (4认同)
  • @frostschutz 这并不意味着“建议”。这就是讨论中出现的内容(查看其他答案和评论)。如果您需要建议:第一步是**定义您的威胁模型**。明确反对您要保护的对象和对象。“保护知识渊博的人”不是威胁模型。然后,一旦您了解了这一点,请了解您的行为会产生什么后果,以及它们在多大程度上保护您免受您建模的威胁。这个答案试图至少说明这一点,因为周围似乎有很多误解。 (4认同)
  • 不确定是否值得添加到您的答案中,但擦除过程实际上很慢,这是在空闲时间/作为内务处理期间执行擦除的另一个原因......如果他们要一次擦除并写入一页,那么写入即使是现代 SSD 的性能也会很糟糕。 (3认同)
  • 我想这就是为什么服务器环境必须加密的原因?擦除驱动器就像“忘记”解密密钥一样简单。 (3认同)

Art*_*nov 29

这是我所知道的安全擦除驱动器的最快方法。

对于 SSD,不,不是。

blkdiscard /dev/device 速度快了数十倍,并且对于您的用例应该同样安全。

cat /dev/zero > /dev/sdX 会一样快吗?

从它的外观来看,这两个命令应该同样快。

快速是我所需要的,同时又不会减少 SSD 的使用寿命。

您甚至可以通过向其写入零来缩短 SSD 的使用寿命。零仍然是数据。

  • `blkddiscard` 如何“对您的用例同样安全”?它只是丢弃这些块并告诉 SSD 它可以重新使用它们。对 SSD 具有固件级访问权限的人仍然可以恢复数据。至少解释一下风险。 (19认同)
  • 用户明确表示:_我不在这里处理敏感数据,不需要保护驱动器免受知识渊博的影响。_ _是“dd if=/dev/urandom of=/dev/sdc bs=1M count=2”擦除 HDD 的最快方法,同时为恢复提供一些安全性?_ 在您提供的所有命令中,这是迄今为止最慢的。通常也没有必要,因为写入零足以永久破坏数据(并且在过去的大约 20 年中一直如此)。 (18认同)
  • 如果您打算完全覆盖 2MB 的数据,那么对于大多数现代台式机 CPU 来说几乎是即时的。尝试 1TB 的存储空间,即没有 `count` :-) (5认同)
  • 借调+1。不要通过写入零(或批量写入任何内容,就此而言)“擦除”SSD (4认同)
  • @dirkt,`blkdiscard`,如果正确实施,会擦除数据块并将它们置于“准备使用”状态。这与驱动器在更新数据块内容时使用的“读取-修改-写入”周期的前半部分完全相同,并且当应用于整个驱动器时,应该导致驱动器充满“1”。 (4认同)
  • @Mark 这并不一定意味着该块实际上已被擦除;每当 SSD 空闲并执行管理任务时,该块可能会在一段时间后异步擦除,或者可能在写入之前擦除。所有这些都是“正确实施”。我能找到的任何地方都不支持 TRIM 以某种方式使“块安全”的想法。 (2认同)
  • @Michael 重复:**blkdiscard 不会擦除块**。它用 TRIM 标记它们(就像在支持 TRIM 的文件系统中的 `rm` 一样),并且它们通常会在垃圾收集过程中被**调度**以进行擦除。这也使得它们无法正常读取,但取证级别的理解和工具并不难获得,参见例如[这里](https://blog.elcomsoft.com/2019/01/life-after-trim-using- factory-access-mode-for-imaging-ssd-drives/)。这对于“黑客”来说很容易,与例如您需要从硬盘盘片上读取磁通量的硬件形成对比。 (2认同)

小智 10

如果完全支持,我建议使用带有 hdparm 的安全擦除:

https://ata.wiki.kernel.org/index.php/ATA_Secure_Erase

这有关于擦除 SSD 的分步说明

  • 仅供参考,ATA 安全擦除命令只能擦除*整个* 磁盘(不仅仅是一个分区,而不仅仅是一个文件)。在具有全时加密的 SSD 上,它通过生成新密钥并覆盖旧密钥来工作,因此闪存单元中的任何内容都无法再正确解密。(同时清除块映射数据,以便整个磁盘都被释放)。如果您要出售驱动器,这是理想的选择,如果它支持即时擦除,则可以避免闪存的任何磨损。 (6认同)
  • 请尝试更*接近*提出的问题,在这种情况下*切碎对擦除 SSD 有害吗?*;然后指出*如何*做到这一点,链接到“ATA安全擦除”,我正确地支持 (4认同)

FeR*_*eRD 9

不仅是shred擦除 SSD 的糟糕工具,而且无法按预期工作。正如其他人指出的那样,覆盖 SSD 上的特定数据块通常是不可能的,因为磨损均衡意味着“覆盖”的块不一定会实际写入相同的物理硬件存储单元。因此,没有必要为文件系统或逻辑设备级别的“覆盖”而烦恼。

如果您只想清除驱动器的文件分配状态,最快的选择是简单地清除分区表并完成它。该设备似乎是空的。当然,使用恢复软件恢复整个内容是微不足道的。

假设你想稍微更彻底,blkdiscard是更有效地重新分配所有块SSD上的一个选项。并且在最近的迭代中,它获得了一些操作模式,可以解决绕过自动重定向逻辑的需要,这些逻辑通常会使 SSD 数据块难以明确定位/追踪。

有选择地引用blkdiscard(8)util-linux 2.35.2的手册页(包含在 Fedora 32 中):

OPTIONS
       -s, --secure
              Perform a secure discard.  A secure discard is  the  same  as  a
              regular  discard  except that all copies of the discarded blocks
              that were possibly created by garbage collection  must  also  be
              erased.  This requires support from the device.

       -z, --zeroout
              Zero-fill rather than discard.
Run Code Online (Sandbox Code Playgroud)

因此,blkdiscard -z /dev/sd#应该首选dd if=/dev/zero …util-linux 的最新版本。(该--zeroout选项已在 util-linux 2.28 中添加。)但对于所有 SSD 的存储单元,它仍将计为一个写入周期。

如果硬件支持,这blkdiscard -s /dev/sd#将是确保丢弃操作扩展到设备上所有可能数据位置的最佳方法,包括任何可能保存可寻址数据块的垃圾收集副本的位置。

(我不知道是否blkdiscard -s -z /dev/sd#是合理/有用的标志组合;手册页在这一点上不清楚,我当然不会在我正在使用的 SSD 上尝试它。)