快速随机分配高清?


14

我已经读过有关如何使硬盘驱动器安全进行加密的知识,其中的步骤之一是向驱动器写入随机位,以使加密数据与硬盘驱动器上的其余数据无法区分。

但是,当我dd if=/dev/urandom of=/dev/sda过去尝试使用ETA时,它的数量似乎在几天之内。我看到了一些有关badblocks代替urandom的知识,但这似乎并没有太大帮助。我只想知道是否有什么方法可以帮助我加快速度,例如dd我可能缺少的选件或其他东西,或者速度仅仅是高清的限制。


将块大小更改为对硬盘更友好的大小。dd bs=1M例如。
Patrick

您的速度是多少?写入整个3TB(例如)硬盘需要一段时间。还要检查iostat -kx 10驱动器上的繁忙百分比。
derobert

5
shred -v -n 1 /dev/overwritethis很快 这是唯一shred实际对某事有用的情况。
frostschutz

@derobert:我不能确切地说出它有多快,但是我离开了几个小时才回来,而我第一次尝试500G内置HD时,它已经完成了大约10%。感谢“ iostat”提示btw
bitflips 13-4-12

@Patrick:我盲目尝试了bs = 4M,因为我在指南中看到了如何将Arch CD放入USB。它有一点帮助,但是仍然很慢。
bitflips 2013年

Answers:


14

dd if=/dev/urandom of=/dev/sda简单地说 cat /dev/urandom >/dev/sda,这不是用随机数据填充磁盘的最快方法。Linux /dev/urandom并不是最快的加密RNG。/ dev / urandom可以替代吗?有一些建议。特别是,OpenSSL包含更快的加密PRNG:

openssl rand $(</proc/partitions awk '$4=="sda" {print $3*1024}') >/dev/sda

请注意,最后是否有所改善取决于瓶颈是哪一部分:CPU还是磁盘。

好消息是,用随机数据填充磁盘几乎没有用。首先,要消除一个普遍的神话,用零擦拭在当今的硬件上同样有用。借助1980年代的硬盘技术,用零覆盖硬盘会留下少量的剩余电荷,可以用一些昂贵的硬件来恢复。必须使用随机数据多次覆盖(“ Gutmann擦除”)。如今,即使是一次用零覆盖的操作,即使在实验室条件下,也无法实际恢复数据。

在对分区进行加密时,对于加密数据的机密性,不需要用随机数据填充磁盘。仅在需要使加密数据使用的空间与未使用的空间无法区分时才有用。在非随机容器的顶部构建加密卷可以显示加密卷曾经使用过哪些磁盘块。这为文件系统的最大大小提供了一个很好的提示(尽管随着时间的流逝,近似值会越来越差),甚至更多。


4
Gutmann完全是一个神话,我也不认为它实际上是在1980年代的硬盘上完成的。具有讽刺意味的是,随着驱动器变得越来越智能,您现在实际上应该使用随机数据来确保驱动器被迫写入,而不是释放扇区(修剪)或压缩数据。零只有在实际写入时才是好的。
frostschutz

1
@mellowmaroon是的,cat /dev/zero几乎总是足够。仅要隐藏加密卷上的可用空间是不够的。
吉尔(Gilles)'所以

1
@mellowmaroon这几乎没有用。窃听者将知道您最多拥有X MB的数据(可能更少,因为以前使用过但现在没有的空间与使用过的空间无法区分),那又如何呢?同样,可用空间的位置可能会显示文件系统类型(超级块副本)。很少担心(它通常以明文形式公开/etc/fstab,除非您已经加密了根分区,而且即使如此,也没有那么多可行的选项)。
吉尔斯(Gillles)“所以-别再邪恶了”

2
@Gilles我在Ubuntu 13.10中遇到的问题是openssl rand似乎会生成一个字节数上限。如果超过该限制,例如'openssl rand , then no random output is generated. Only a brief "help" text is printed. I'm trying to random (pretty much) fill a 3TB hard drive. Not sure if there is a way to get 810000000000 openssl' 会产生那么多随机字节。
非理性的约翰

1
对于非理性的约翰上限问题,大约754 GB出现了8100亿字节。如何将磁盘划分为多个700 GB的分区,然后openssl rand从sda5或其他版本开始以反向方式在每个分区上运行命令,然后再反向运行到sda1,最后是sda?
jia103

6

openssl似乎不适合我。提供的解决方案出现“未知选项”和其他问题。因此,我最终选择了该程序。

fio -name="fill" -ioengine=libaio -direct=1 -bs=512m -rw=write -iodepth=4 -size=100% -filename=/dev/md0

跨24个HDD进行19TB的存储似乎要花3个小时。大约1,800 MB / s

smp-016:~ # fdisk -l /dev/md0
Disk /dev/md0: 18890.1 GB, 18890060464128 bytes

smp-016:~ # fio -name="fill" -ioengine=libaio -direct=1 -bs=512m -rw=write -iodepth=4 -size=100% -filename=/dev/md0
fill: (g=0): rw=write, bs=512M-512M/512M-512M/512M-512M, ioengine=libaio, iodepth=4
fio-2.2.10
Starting 1 process
Jobs: 1 (f=1): [W(1)] [2.7% done] [0KB/1536MB/0KB /s] [0/3/0 iops] [eta 03h:01m:11s]

我希望这实际上是随机数据。手册页上写着“默认:用随机数据填充缓冲区”。http://linux.die.net/man/1/fio

我并不是为了安全/加密目的而这样做,只是想确保以后的读取测试是实际数据,而不只是0。此相同的fio命令可用于SSD / NVMe预处理。由于仅使用/ dev / zero会导致磁盘级压缩“作弊”,实际写入了多少。虽然我会添加一个-loops=2为其标志,但是如果它是用于基准测试的全新SSD。

如果您确实希望它是安全的,则可以使用 -randrepeat=bool 选项,因为它将切换“以可预测的方式播种随机数生成器,因此结果可以在每次运行中重复。默认值:true。”,但我仍然没有确定那将有多安全。

此外,一些企业级HDD还带有SED(自加密驱动器),可让您旋转加密密钥以立即安全地擦除所有写入的数据。

最后,我过去使用过DBAN(又名Darik的Boot and Nuke),它具有CD和USB可引导选项,并且“是SourceForge上托管的一个开源项目。该程序旨在安全擦除硬盘,直到其数据永久存在。已删除且无法恢复”


1
大小= 100%对我不起作用,但fill_device = 1(或fill_fs = 1)有效。
d.jamison '16

我认为这取决于您是否给它块级设备或文件系统填充。使用块级设备,它知道它有多大,并且大小是设备大小的百分比。直到fill_device到达设备已满错误为止。我认为fill_device标志可能不会覆盖任何文件,只会覆盖未使用的空间。我没有进行测试,因为除非进行设备测试,否则我通常会避免使用文件系统,除非有必要。
TaylorSanchez

6

您可以使OpenSSL /dev/zero使用随机密码进行加密,从而非常快速地提供体面的伪随机数据(如果您的CPU支持加速)。

openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt < /dev/zero | dd of=/dev/sda

您可以通过管道pv获取进度/ ETA。我现在正在运行的命令(在root shell中)是:

DISK="sda"
DISKSIZE=$(</proc/partitions awk '$4=="'"$DISK"'" {print sprintf("%.0f",$3*1024)}')
apt-get install pv
openssl enc -aes-256-ctr -nosalt \
  -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" \
  < /dev/zero |
  pv --progress --eta --rate --bytes --size "$DISKSIZE" |
  dd of=/dev/"$DISK" bs=2M

我有这个想法,从这个答案,有同样的问题后,非理性的约翰,谁评论抽动的回答以上。这使我对新RAID阵列的擦除速度从11 MB / s增加到大约300 MB / s,这将花费一周的时间减少到10个小时。

我要补充一点,您应该能够使用 而不是上面的更复杂的语句,但是存在一个错误,该错误只会产生16 MB的输出。(此错误已于2016年1月提交。)openssl rand #of_bytesopenssl enc ...ssl

并且,根据对这个问题的回答,并继续假定CPU是瓶颈,有可能通过openssl在单独的内核上运行多个并行进程并使用FIFO对其进行组合来进一步提高速度。


不确定是否需要编辑。对这个问题的其他答案表明openssl rand
tremby

2
基准::dd if=/dev/urandom18MiB / s,openssl enc:〜180MiB / s,fio:169MiB / s,openssl rand不支持> 754GB。请注意,如果您还需要自动尺寸计算,请使用:openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt </dev/zero | pv --progress --eta --rate --bytes --size $(</proc/partitions awk '$4=="sda" {print sprintf("%.0f",$3*1024)}') | dd of=/dev/sda bs=2M。当心,sda该命令两次出现。
KrisWebDev '16

0

完成Marco的答案,您需要的是更快的随机数生成器。

您使用了一个简单的程序,该程序从类似的好的库中回显随机数,boost::random并在中使用该数dd

如果选择boost,则可以使用示例,根据experiment需要更改功能。


Boost解决方案在系统上的速度是多少?在我的计算机上进行快速的非科学基准测试时,得出的速度与完全相同/dev/urandom
Marco Marco

boost::random不提供加密RNG,对吗?如果要使用非加密RNG,则最好使用零:至少不会有安全感。
吉尔斯(Gilles)'“ SO-别再作恶了”

我不能具体说明boost::random生成器有多快,唯一可以确定的方法是针对它们测量最快的算法/dev/urandom
RSFalcon7 2013年

0

瓶颈既不是块大小也不是硬盘驱动器,而是伪随机数生成缓慢的问题。与之/dev/urandom相比,/dev/random它在数量级上要快得多,因为它不会在低熵池中阻塞。

您可以通过测量伪随机数的原始输出来确认这一点:

pv /dev/urandom >/dev/null

该速率将比硬盘驱动器的写入速率慢得多。正确的解决方案完全取决于您所需的安全级别。如果您需要高安全性,请使用快速的硬件随机生成器或接受较低的速度。如果对安全性的要求不高,则可以捕获几十个MiB数据并将该字符串重复写入驱动器。或者,甚至可以从中写入零/dev/zero

摘要

/dev/random -安全,非常慢
/dev/urandom- 不太安全¹,较慢的
硬件RNG- 安全,快速,非常昂贵
/dev/zero -完全不是随机的,非常快)

¹ 根据/ dev / urandom的rand对于登录密钥是否安全? /dev/urandom与一样安全/dev/random。感谢Gilles指出这一点。


他已经在使用urandom
Patrick

确实。我的观点是,即使urandom仍然无法满足他的需求,这就是为什么他需要与urandom不同的解决方案。
Marco Marco


@Gilles感谢您的链接。手册页明确指出:…结果,如果熵池中没有足够的熵,则理论上返回的值很容易受到密码攻击……这就是为什么我将其归类为安全性较低的原因。
Marco Marco

0

我试图填充一个dd if=/dev/urandom of=/dev/sdX status=progress太慢的4TB外部USB HDD (与bs=设置openssl无关),并且似乎可以输出多少随机数据(至少对于1.0.2p版本)有所限制。我发现最好的选择是frostschutz对use 的评论shred,例如:

shred -v -n 1 /dev/sdX

确保使用-n 1否则将默认写入设备3次(加上-v显示进度的设备)。我认为伪随机数的质量没有那么高,但是对于我来说,准备一个大容量的便携式HDD进行加密就足够了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.