Cara Cepat Mengacak HD?

14

Saya telah membaca tentang cara membuat hard drive aman untuk enkripsi, dan salah satu langkahnya adalah menulis bit acak ke drive, untuk membuat data yang dienkripsi tidak dapat dibedakan dari sisa data pada hard drive.

Namun, ketika saya mencoba menggunakan dd if=/dev/urandom of=/dev/sdadi masa lalu, ETA terlihat berada di urutan hari. Saya melihat sesuatu tentang penggunaan badblockspengganti urandom, tapi itu sepertinya tidak banyak membantu. Saya hanya ingin tahu apakah ada cara yang dapat membantu saya mempercepat ini, seperti opsi untuk ddatau hal lain yang mungkin saya lewatkan, atau jika kecepatannya hanyalah batasan dari HD.

bitflips
sumber
Ubah ukuran blok Anda menjadi sesuatu yang lebih ramah terhadap hard drive. dd bs=1Msebagai contoh.
Patrick
Kecepatan apa yang Anda dapatkan? Butuh waktu untuk menulis HDD 3TB (misalnya) secara keseluruhan. Juga periksa iostat -kx 10untuk melihat apa yang sibuk di drive.
derobert
5
shred -v -n 1 /dev/overwritethiscepat. Ini tentang satu-satunya kasus di mana shredsebenarnya berguna untuk sesuatu.
frostschutz
@derobert: Saya tidak bisa mengatakan dengan pasti seberapa cepatnya, tetapi saya pergi selama beberapa jam, kembali, dan sekitar 10% selesai untuk HD internal 500G saya saat pertama kali saya mencoba ini. Terima kasih atas "iostat" tip btw
bitflips
@ Patrick: Saya mencoba bs = 4M semacam secara membabi buta, karena saya melihat itu di panduan untuk cara meletakkan CD Arch pada usb. Itu sedikit membantu, tetapi masih sangat lambat.
bitflips

Jawaban:

14

dd if=/dev/urandom of=/dev/sda, atau sederhananya cat /dev/urandom >/dev/sda , bukan cara tercepat untuk mengisi disk dengan data acak. Linux /dev/urandombukan RNG kriptografi tercepat di sekitar. Apakah ada alternatif untuk / dev / urandom? punya beberapa saran. Secara khusus, OpenSSL mengandung PRNG kriptografi yang lebih cepat:

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

Perhatikan bahwa pada akhirnya, apakah ada peningkatan atau tidak tergantung pada bagian mana yang menjadi hambatan: CPU atau disk.

Berita baiknya adalah bahwa mengisi disk dengan data acak sebagian besar tidak berguna. Pertama, untuk menghilangkan mitos umum, menyeka dengan nol sama baiknya pada perangkat keras saat ini . Dengan teknologi hard disk 1980-an, menimpa hard disk dengan nol meninggalkan sisa biaya kecil yang dapat dipulihkan dengan perangkat keras yang agak mahal; diperlukan beberapa kali overwrite dengan data acak ("Usus Gutmann"). Saat ini, bahkan satu setrip penimpaan dengan nol meninggalkan data yang tidak dapat dipulihkan secara realistis bahkan dalam kondisi laboratorium.

Saat Anda mengenkripsi partisi, mengisi disk dengan data acak tidak diperlukan untuk kerahasiaan data yang dienkripsi. Ini hanya berguna jika Anda perlu membuat ruang yang digunakan oleh data terenkripsi tidak dapat dibedakan dari ruang yang tidak digunakan. Membangun volume terenkripsi di atas wadah non-acak mengungkapkan blok disk mana yang pernah digunakan oleh volume terenkripsi. Ini memberi petunjuk yang baik tentang ukuran maksimum filesystem (meskipun seiring berjalannya waktu akan menjadi perkiraan yang lebih buruk dan lebih buruk), dan sedikit lagi.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
4
Gutmann adalah mitos secara keseluruhan, saya tidak berpikir itu sebenarnya pernah dilakukan untuk hard disk 1980-an. Ironisnya adalah dengan drive menjadi lebih cerdas, Anda sebenarnya harus menggunakan data acak saat ini untuk memastikan drive dipaksa untuk menulis, daripada sektor bebas (trim) atau kompres data. Nol hanya baik jika itu benar-benar ditulis.
frostschutz
1
@mellowmaroon Ya, cat /dev/zerohampir selalu cukup. Hanya saja tidak cukup jika Anda ingin menyembunyikan berapa banyak ruang kosong di volume terenkripsi.
Gilles 'SO- berhenti bersikap jahat'
1
@mellowmaroon Cukup tidak berguna. Seorang penyadap akan tahu bahwa Anda memiliki paling banyak data X MB (dan mungkin jauh lebih sedikit, karena ruang yang sebelumnya digunakan tetapi sekarang sekarang tidak dapat dibedakan dari ruang yang digunakan), jadi apa? Juga lokasi ruang kosong dapat mengungkapkan tipe sistem file (salinan superblok); itu jarang menjadi perhatian (biasanya terekspos dalam cleartext /etc/fstab, kecuali Anda telah mengenkripsi partisi root, dan bahkan saat itu tidak ada begitu banyak opsi yang masuk akal).
Gilles 'SO- berhenti menjadi jahat'
2
@Gilles Masalah yang saya alami di Ubuntu 13.10 adalah openssl randsepertinya memiliki batas atas jumlah byte yang akan dihasilkan. Jika Anda melebihi batas itu, misalnya 'openssl rand 810000000000 , 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 openssl` untuk menghasilkan banyak byte acak.
rasional John
1
Untuk masalah batas atas John yang tidak rasional, 810 miliar byte keluar menjadi sekitar 754 GB. Bagaimana dengan mempartisi disk Anda menjadi beberapa partisi 700-GB, kemudian menjalankan openssl randperintah pada setiap partisi secara terbalik mulai dari sda5 atau apa pun dan bekerja mundur ke sda1 dan akhirnya sda?
jia103
6

The openssl tampaknya tidak berfungsi untuk saya. Saya mendapat "opsi tidak dikenal" dan masalah lain dengan solusi yang disediakan. Jadi saya akhirnya pergi dengan program fio.

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

Yang sepertinya akan memakan waktu 3 jam untuk melakukan 19TB di 24 HDD. Jadi kira-kira 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]

Saya harap ini sebenarnya data acak. Halaman manual mengatakan "Default: isi buffer dengan data acak." http://linux.die.net/man/1/fio

Saya tidak melakukannya untuk tujuan enkripsi / aman, hanya mencoba memastikan tes yang saya baca nanti adalah data aktual dan bukan hanya 0. Perintah fio yang sama ini dapat digunakan untuk preconditioning SSD / NVMe. Karena hanya menggunakan / dev / nol dapat menyebabkan kompresi tingkat disk "curang" berapa banyak yang sebenarnya ditulis. Meskipun saya akan menambahkan -loops=2bendera untuk itu, jika itu adalah SSD baru untuk pembandingan.

Jika Anda menginginkannya aman, Anda mungkin dapat menggunakan -randrepeat=bool opsi, karena itu akan beralih "Benih generator nomor acak dengan cara yang dapat diprediksi sehingga hasilnya dapat diulang di seluruh berjalan. Default: true.", Tapi aku masih belum yakin seberapa aman itu.

Selain itu, beberapa HDD kelas perusahaan di luar sana adalah SED (Self Encrypting Drives) dan akan memungkinkan Anda untuk memutar kunci enkripsi untuk secara instan dan aman menghapus semua data yang ditulis.

Terakhir, saya pernah menggunakan DBAN (alias Darik's Boot dan Nuke), yang memiliki opsi CD dan USB bootable dan "adalah proyek open source yang dihosting di SourceForge. Program ini dirancang untuk menghapus hard disk dengan aman hingga datanya permanen secara permanen. dihapus dan tidak lagi dapat dipulihkan "

TaylorSanchez
sumber
1
Ukuran = 100% tidak berfungsi untuk saya, tetapi fill_device = 1 (atau fill_fs = 1) berhasil.
d.jamison
Saya pikir itu akan tergantung jika Anda memberikannya perangkat tingkat blok atau sistem file untuk diisi. Dengan perangkat tingkat blok itu tahu seberapa besar dan ukurannya adalah persentase dari ukuran perangkat. Di mana sebagai fill_device pergi sampai mendapat kesalahan penuh perangkat. Saya pikir flag fill_device mungkin tidak menimpa file apa pun, hanya ruang yang tidak digunakan. Saya belum mengujinya, karena saya biasanya menghindari sistem file kecuali perlu ketika saya melakukan pengujian perangkat.
TaylorSanchez
6

Anda bisa mendapatkan OpenSSL untuk mengenkripsi /dev/zerodengan kata sandi acak, memberikan data pseudorandom yang layak dengan sangat cepat (jika CPU Anda mendukung mempercepatnya).

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

Anda dapat menyalurkan melalui ini pvuntuk mendapatkan kemajuan / ETA. Perintah yang saya jalankan sekarang (di root shell) adalah:

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

Saya mendapat ide ini dari jawaban ini , setelah memiliki masalah yang sama dengan John yang tidak rasional , yang mengomentari jawaban Gilles di atas. Ini meningkatkan kecepatan penghapusan saya ke array RAID baru saya dari 11 MB / s menjadi sekitar 300 MB / s, mengambil apa yang akan memakan waktu seminggu hingga 10 jam.

Saya akan menambahkan bahwa Anda harus dapat menggunakan daripada pernyataan yang lebih rumit di atas, tetapi ada bug yang akan memungkinkan untuk menghasilkan hanya 16 MB output. (Bug ini telah diajukan, Jan 2016.)openssl rand #of_bytesopenssl enc ...ssl

Dan, sesuai jawaban untuk pertanyaan ini , dan terus mengasumsikan bahwa CPU adalah hambatan, dimungkinkan untuk meningkatkan kecepatan lebih lanjut dengan menjalankan beberapa opensslproses paralel pada core yang terpisah, menggabungkannya menggunakan FIFO.

gemetar
sumber
Tidak yakin hasil edit diperlukan. Jawaban lain untuk pertanyaan ini menyarankan openssl rand.
gemetar
2
Benchmark:: dd if=/dev/urandom18MiB / s openssl enc,: ~ 180MiB / s fio,: 169MiB / s, openssl randtidak ada dukungan> 754GB. Catatan bahwa jika Anda juga ingin perhitungan auto-ukuran, gunakan: 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. Waspadalah, sdahadir dua kali dalam perintah ini.
KrisWebDev
0

Melengkapi jawaban Marco, yang Anda butuhkan adalah penghasil angka acak yang lebih cepat.

Anda menggunakan program sederhana yang menggemakan bilangan acak dari perpustakaan yang disukai boost::randomdan menggunakannya dd.

Jika Anda memilih meningkatkan, Anda dapat menggunakan contoh ini , mengubah experimentfungsi sesuai kebutuhan Anda.

RSFalcon7
sumber
Seberapa cepat solusi peningkatan pada sistem Anda? Benchmark non-ilmiah cepat pada mesin saya menghasilkan kecepatan yang persis sama dengan /dev/urandom.
Marco
boost::randomtidak menawarkan RNG crypto, bukan? Jika Anda akan menggunakan RNG non-crypto, Anda mungkin juga menggunakan nol: setidaknya Anda tidak akan memiliki ilusi keamanan.
Gilles 'SO- stop being evil'
Saya tidak bisa spesifik tentang seberapa cepat boost::randomgenerator, satu-satunya cara untuk mengetahui dengan pasti adalah mengukur algoritma tercepat mereka terhadap/dev/urandom
RSFalcon7
0

Kemacetan jika bukan ukuran blok atau hard drive, tetapi generasi lambat nomor pseudo-acak. /dev/urandomadalah dengan magnitudo lebih cepat dibandingkan /dev/randomkarena itu tidak menghalangi pada kolam entropi rendah.

Anda dapat mengonfirmasi ini dengan mengukur output mentah dari nomor pseudo-acak Anda:

pv /dev/urandom >/dev/null

Nilai ini akan jauh lebih lambat daripada kecepatan tulis hard drive Anda. Solusi yang benar sangat tergantung pada tingkat keamanan yang Anda butuhkan. Jika Anda memerlukan keamanan yang tinggi baik menggunakan acak hardware cepat atau menerima kecepatan lambat. Jika kebutuhan keamanan Anda tidak setinggi itu, Anda bisa menangkap beberapa lusin MiB data dan menulis string itu berulang kali ke drive. Atau mungkin bahkan menulis nol dari /dev/zeroadalah pilihan.

Ringkasan

/dev/random - aman, sangat lambat
/dev/urandom- kurang aman¹,
RNG perangkat keras lambat - aman, cepat, sangat mahal
( /dev/zero - tidak acak sama sekali, sangat cepat)

¹ Menurut Apakah rand dari / dev / urandom aman untuk kunci masuk? /dev/urandomseaman /dev/random. Terima kasih kepada Gilles karena menunjukkan ini.

Marco
sumber
Dia sudah menggunakan urandom.
Patrick
Memang. Maksud saya adalah bahwa bahkan urandom terlalu lambat untuk kebutuhannya, itulah sebabnya ia membutuhkan solusi yang berbeda dari urandom.
Marco
Tidak ada keamanan tambahan dalam menggunakan/dev/random .
Gilles 'SO- berhenti bersikap jahat'
@Gilles Terima kasih atas tautannya. Halaman manual dengan jelas menyatakan: ... Akibatnya, jika tidak ada cukup entropi di kumpulan entropi, nilai yang dikembalikan secara teoritis rentan terhadap serangan kriptografi ... Itulah sebabnya saya menggolongkannya sebagai kurang aman.
Marco
0

Saya mencoba untuk mengisi HDD USB eksternal 4TB dengan dd if=/dev/urandom of=/dev/sdX status=progressyang terlalu lambat (terlepas dari bs=pengaturan), dan tampaknya opensslmemiliki batasan pada berapa banyak data acak yang akan dikeluarkan (setidaknya untuk versi 1.0.2p). Opsi terbaik yang saya temukan adalah komentar dari frostschutz untuk digunakan shred, seperti pada:

shred -v -n 1 /dev/sdX

Pastikan untuk menggunakan yang -n 1sebaliknya itu akan menulis perangkat standar 3 kali lipat (ditambah -vyang menunjukkan kemajuan). Saya tidak berpikir kualitas angka -angka pseudo-acak setinggi itu, tetapi cukup bagi saya untuk menyiapkan HDD portabel berkapasitas besar untuk enkripsi.

drgibbon
sumber