तेजी से यादृच्छिक करने के लिए रास्ता HD?


14

मैंने हार्ड ड्राइव को एन्क्रिप्शन के लिए सुरक्षित बनाने के तरीके के बारे में पढ़ा है, और हार्ड ड्राइव पर बाकी डेटा से एन्क्रिप्टेड डेटा को अप्रचलित बनाने के लिए, ड्राइव में यादृच्छिक बिट्स लिखना है।

हालांकि, जब मैंने dd if=/dev/urandom of=/dev/sdaअतीत में उपयोग करने की कोशिश की थी, तो ईटीए दिनों के क्रम पर दिख रहा था। मैंने badblocksयूरेनियम के बदले में उपयोग करने के बारे में कुछ देखा , लेकिन यह पूरी तरह से मदद नहीं करता था। मैं सिर्फ यह जानना चाहूंगा कि क्या ऐसे कोई तरीके हैं जो मुझे इसे गति देने में मदद कर सकते हैं, जैसे कि मेरे लिए विकल्प ddया कुछ और मैं गायब हो सकता है, या यदि गति सिर्फ एचडी की सीमा है।


हार्ड ड्राइव की ओर अपने ब्लॉक आकार को कुछ अधिक अनुकूल में बदलें। dd bs=1Mउदाहरण के लिए।
पैट्रिक

आपको क्या गति मिल रही थी? पूरे 3TB (उदाहरण के लिए) HDD लिखने में कुछ समय लगता है। यह देखने के iostat -kx 10लिए भी देखें कि ड्राइव पर व्यस्त% क्या है।
व्युत्पन्न

5
shred -v -n 1 /dev/overwritethisतेज़ है। यह एकमात्र मामले के बारे में है जहां shredवास्तव में किसी चीज के लिए उपयोगी है।
फ्रॉस्ट्सचुट्ज़

@derobert: मैं वास्तव में यह सुनिश्चित करने के लिए नहीं कह सकता कि यह कितना तेज़ था, लेकिन मैंने कुछ घंटों के लिए छोड़ दिया, वापस आ गया, और यह मेरे 500G आंतरिक HD के लिए लगभग 10% पूर्ण था जब मैंने पहली बार यह कोशिश की थी। "
Iostat

@ पैट्रिक: मैंने bs = 4M को आँख बंद करके आज़माया, क्योंकि मैंने देखा कि कैसे आर्क सीडी को एक यूएसबी पर रखा जाए। यह थोड़ा मदद की, लेकिन यह अभी भी बहुत धीमी थी।
बिटफ्लिप्स

जवाबों:


14

dd if=/dev/urandom of=/dev/sda, या बस cat /dev/urandom >/dev/sda , यादृच्छिक डेटा के साथ डिस्क को भरने का सबसे तेज़ तरीका नहीं है। लिनक्स /dev/urandomसबसे तेज़ क्रिप्टोग्राफ़िक RNG नहीं है। क्या / dev / urandom का कोई विकल्प है? कुछ सुझाव हैं। विशेष रूप से, OpenSSL में एक तेज़ क्रिप्टोग्राफ़िक PRNG है:

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

ध्यान दें कि अंत में, एक सुधार है या नहीं यह निर्भर करता है कि कौन सा भाग अड़चन है: सीपीयू या डिस्क।

अच्छी खबर यह है कि यादृच्छिक डेटा के साथ डिस्क को भरना ज्यादातर बेकार है। सबसे पहले, एक आम मिथक को दूर करने के लिए, जीरो के साथ पोंछना आज के हार्डवेयर पर उतना ही अच्छा है । 1980 के दशक की हार्ड डिस्क तकनीक के साथ, जीरो के साथ एक हार्ड डिस्क को ओवरराइट करने से एक छोटा अवशिष्ट चार्ज बचा था जिसे कुछ महंगे हार्डवेयर के साथ पुनर्प्राप्त किया जा सकता था; यादृच्छिक डेटा ("गुटमैन वाइप") के साथ ओवरराइट के कई पास आवश्यक थे। आज ज़ीरो के साथ ओवरराइटिंग का एक भी पास डेटा छोड़ देता है जो प्रयोगशाला स्थितियों में भी वास्तविक रूप से पुनर्प्राप्त नहीं किया जा सकता है।

जब आप किसी विभाजन को एन्क्रिप्ट कर रहे हों, तो डिस्क को रैंडम डेटा से भरना एन्क्रिप्टेड डेटा की गोपनीयता के लिए आवश्यक नहीं है। यह केवल तभी उपयोगी है जब आपको अप्रयुक्त स्थान से एन्क्रिप्ट किए गए डेटा अप्रभेद्य द्वारा उपयोग किए जाने वाले स्थान को बनाने की आवश्यकता हो। एक गैर-यादृच्छिक कंटेनर के शीर्ष पर एक एन्क्रिप्टेड वॉल्यूम के निर्माण से पता चलता है कि कौन से डिस्क ब्लॉक कभी एन्क्रिप्टेड वॉल्यूम द्वारा उपयोग किए गए हैं। यह फाइलसिस्टम के अधिकतम आकार के रूप में एक अच्छा संकेत देता है (हालांकि समय बीतने के साथ यह एक बदतर और बदतर सन्निकटन बन जाएगा), और बहुत कुछ।


4
गुटमैन अपनी संपूर्णता में एक मिथक है, मुझे नहीं लगता कि यह वास्तव में कभी 1980 के दशक की हार्ड डिस्क के लिए किया गया है। विडंबना यह है कि ड्राइव होशियार होने के साथ, आपको वास्तव में यादृच्छिक डेटा का उपयोग करना चाहिए ताकि यह सुनिश्चित हो सके कि ड्राइव मुफ्त क्षेत्र (ट्रिम) या संपीड़ित डेटा के बजाय लिखने के लिए मजबूर है। यदि वे वास्तव में लिखे गए हैं तो शून्य केवल अच्छे हैं।
फ्रॉस्ट्सचुट्ज़ 20

1
@ मल्मोमारोन हां, cat /dev/zeroलगभग हमेशा पर्याप्त है। यह केवल पर्याप्त नहीं है यदि आप छिपाना चाहते हैं कि एन्क्रिप्टेड वॉल्यूम पर कितना स्थान खाली है।
गिल्स एसओ- बुराई को रोकना '

1
@mellowmaroon यह बहुत बेकार है। एक eavesdropper को पता चलेगा कि आपके पास अधिकांश X MB डेटा है (और संभवतः बहुत कम है, क्योंकि पूर्व में प्रयुक्त-लेकिन-अब-मुक्त स्थान उपयोग किए गए स्थान से अप्रभेद्य है), तो क्या? इसके अलावा मुक्त स्थान का स्थान फाइलसिस्टम प्रकार (सुपरब्लॉक प्रतियां) प्रकट कर सकता है; यह शायद ही कभी एक चिंता का विषय है (यह आमतौर पर क्लीयरटेक्स में उजागर होता है /etc/fstab, जब तक कि आपने रूट विभाजन को एन्क्रिप्ट नहीं किया है, और तब भी इतनी बड़ी संख्या में प्रशंसनीय विकल्प नहीं हैं)।
गिल्स एसओ- बुराई को रोकना '

2
@ गिल्स, जो समस्या मैं उबंटू 13.10 में चला था, वह यह है कि 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 ओपनसेल ' जो कई यादृच्छिक बाइट्स का उत्पादन करता है।
तर्कहीन जॉन

1
अपरिमेय जॉन की ऊपरी सीमा समस्या के लिए, 810 बिलियन बाइट्स लगभग 754 जीबी के लिए निकलती है। लगभग 700-GB विभाजन में अपनी डिस्क को विभाजित करने के बारे में कैसे, फिर openssl randsda5 से शुरू होने वाले प्रत्येक विभाजन पर कमांड को चलाना या जो भी हो और पीछे से sda1 और आखिरकार sda में काम करना?
jia103

6

सलामी बल्लेबाज मेरे लिए काम नहीं करता था। मुझे दिए गए समाधानों के साथ "अज्ञात विकल्प" और अन्य मुद्दे मिले। इसलिए मैंने प्रोग्राम फियो के साथ जाना समाप्त कर दिया।

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

जो 24 HDD भर में 19TB करने के लिए 3 घंटे लगते हैं। तो लगभग 1,800 एमबी / एस

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। एसएसडी / एनवीएमई प्रीकॉन्डिशनिंग के लिए इसी फियो कमांड का इस्तेमाल किया जा सकता है। जैसा कि सिर्फ / देव / शून्य का उपयोग करने से डिस्क लेवल कम्प्रेशन "धोखा" हो सकता है कि वास्तव में कितना लिखा गया है। हालाँकि, मैं इसे एक -loops=2ध्वज जोड़ूंगा, अगर यह बेंचमार्किंग के लिए एक ताजा एसएसडी है।

यदि आप चाहते हैं कि यह सुरक्षित हो तो आप -randrepeat=bool विकल्प का उपयोग करने में सक्षम हो सकते हैं , जैसा कि "एक यादृच्छिक तरीके से यादृच्छिक संख्या जनरेटर को टॉगल करना होगा ताकि परिणाम पूरे रन में दोहराए जा सकें। डिफ़ॉल्ट: सच।", लेकिन मैं अभी भी नहीं हूं। निश्चित है कि यह कितना सुरक्षित होगा।

इसके अतिरिक्त कुछ एंटरप्राइज क्लास HDD में SED (सेल्फ एनक्रिप्टिंग ड्राइव) हैं और आपको एन्क्रिप्शन कुंजी को तुरंत और सुरक्षित रूप से लिखे गए सभी डेटा को मिटाने की अनुमति देगा।

अंत में, मेरे पास पुराने समय में इस्तेमाल किया गया DBAN (उर्फ डारिक का बूट और Nuke) है, जिसमें CD और USB बूट करने योग्य विकल्प हैं और "SourceForge पर होस्ट किया गया एक ओपन सोर्स प्रोजेक्ट है। प्रोग्राम को एक हार्ड डिस्क को सुरक्षित रूप से मिटाने के लिए डिज़ाइन किया गया है, जिसका डेटा स्थायी रूप से है। हटा दिया गया और अब पुनर्प्राप्त करने योग्य नहीं है "


1
आकार = 100% ने मेरे लिए काम नहीं किया, लेकिन fill_device = 1 (या fill_fs = 1) किया।
d.jamison

मुझे लगता है कि यदि यह एक ब्लॉक स्तर डिवाइस या एक फाइल सिस्टम को भरने के लिए दे रहा है तो यह निर्भर होगा। ब्लॉक स्तर के डिवाइस से यह पता चलता है कि यह कितना बड़ा है और आकार डिवाइस के आकार का एक प्रतिशत है। जहां तक ​​fill_device तब तक जाता है जब तक कि उसे कोई डिवाइस पूरी तरह से न मिल जाए। मुझे लगता है कि fill_device ध्वज किसी भी फाइल को अधिलेखित नहीं कर सकता है, बस अप्रयुक्त स्थान। मैंने परीक्षण के लिए इसे नहीं रखा है, क्योंकि जब तक मैं डिवाइस परीक्षण नहीं करता, तब तक मैं आमतौर पर फाइल सिस्टम से बचता हूं।
टेलरशेच

6

आप /dev/zeroएक यादृच्छिक पासवर्ड के साथ एन्क्रिप्ट करने के लिए ओपनएसएसएल प्राप्त कर सकते हैं, जिससे सभ्य छद्म आयामी डेटा बहुत तेजी से दे रहा है (यदि आपका सीपीयू इसे तेज करता है)।

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 प्राप्त करने के लिए पाइप कर सकते हैं । मैं अभी (रूट शेल में) जो कमांड चला रहा हूं वे हैं:

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 एमबी / एस से बढ़ाकर लगभग 300 एमबी / सेकंड कर दिया, जो एक सप्ताह से 10 घंटे तक कम करने वाली थी।

मैं जोड़ूंगा कि आपको ऊपर दिए गए अधिक जटिल कथन के बजाय उपयोग करने में सक्षम होना चाहिए , लेकिन एक बग है जो केवल 16 एमबी आउटपुट का उत्पादन करने की अनुमति देगा । (यह बग दायर किया गया है, जनवरी 2016)openssl rand #of_bytesopenssl enc ...ssl

और, इस प्रश्न के उत्तर के अनुसार , और यह मानकर चलना जारी है कि सीपीयू अड़चन है, opensslअलग-अलग कोर पर कई समानांतर प्रक्रियाएं चलाने से गति बढ़ाना संभव हो सकता है , उन्हें एक फीफो का उपयोग करके संयोजन करना।


सुनिश्चित नहीं है कि संपादन आवश्यक था। इस प्रश्न के अन्य उत्तर सुझाव देते हैं openssl rand
कांप

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इस कमांड में दो बार मौजूद है।
क्रिशवेबडेव

0

मार्को के उत्तर को पूरा करते हुए, आपको जो चाहिए वह तेजी से यादृच्छिक संख्या जनरेटर है।

आप एक साधारण प्रोग्राम का उपयोग करते हैं जो एक अच्छे पुस्तकालय से रैंडम संख्याओं को ग्रहण करता है boost::randomऔर उस एक का उपयोग करता है dd

यदि आप बूस्ट चुनते हैं, तो आप इस उदाहरण का उपयोग कर सकते हैं , experimentफ़ंक्शन को अपनी आवश्यकताओं में बदल सकते हैं।


आपके सिस्टम पर बूस्ट सॉल्यूशन कितना तेज है? मेरी मशीन पर एक त्वरित गैर-वैज्ञानिक बेंचमार्क बिल्कुल वैसी ही गति देता है जैसा कि /dev/urandom
मार्को

boost::randomएक क्रिप्टो RNG की पेशकश नहीं करता है, यह करता है? यदि आप एक गैर-क्रिप्टो आरएनजी का उपयोग करने जा रहे हैं, तो आप शून्य का भी उपयोग कर सकते हैं: कम से कम आपके पास सुरक्षा का भ्रम नहीं होगा।
गिल्स एसओ- बुराई को रोकना '

मैं इस बारे में विशिष्ट नहीं हो सकता कि boost::randomजनरेटर कितने तेज़ हैं, सुनिश्चित करने का एकमात्र तरीका उनके सबसे तेज़ एल्गोरिदम को /dev/urandom
मापना है

0

अड़चन अगर न तो ब्लॉक आकार और न ही हार्ड ड्राइव, लेकिन छद्म यादृच्छिक संख्या की धीमी पीढ़ी। /dev/urandomमैग्नीट्यूड द्वारा तेजी से तुलना की जाती है /dev/randomक्योंकि यह कम एन्ट्रापी पूल पर अवरुद्ध नहीं होता है।

आप अपने छद्म यादृच्छिक संख्याओं के कच्चे आउटपुट को मापकर इसकी पुष्टि कर सकते हैं:

pv /dev/urandom >/dev/null

यह दर आपकी हार्ड ड्राइव की लिखने की दर से बहुत धीमी होगी। एक सही समाधान पूरी तरह से आपकी सुरक्षा के आवश्यक स्तर पर निर्भर करता है। यदि आपको उच्च सुरक्षा की आवश्यकता है तो या तो एक तेज़ हार्डवेयर यादृच्छिक जनरेटर का उपयोग करें या धीमी गति को स्वीकार करें। यदि आपकी सुरक्षा की जरूरतें इतनी अधिक नहीं हैं, तो आप कुछ दर्जन MiB डेटा को कैप्चर कर सकते हैं और उस स्ट्रिंग को ड्राइव पर बार-बार लिख सकते हैं। या शायद शून्य से लिखना भी /dev/zeroएक विकल्प है।

सारांश

/dev/random - सुरक्षित, बहुत धीमा
/dev/urandom- कम सिक्योर, धीमा
हार्डवेयर RNG - सुरक्षित, तेज, बहुत महंगा
( /dev/zero - बिल्कुल यादृच्छिक नहीं, बहुत अच्छा)

¹ के अनुसार से एक रैंड है / dev / urandom एक लॉगिन कुंजी के लिए सुरक्षित? /dev/urandomजितना सुरक्षित है /dev/random। यह इंगित करने के लिए गाइल्स का धन्यवाद।


वह पहले से ही उपयोग कर रहा है urandom
पैट्रिक

वास्तव में। मेरा कहना यह है कि यहां तक ​​कि यूरेनियम भी उसकी जरूरतों के लिए बहुत धीमा है, इसलिए उसे यूरेनियम की तुलना में एक अलग समाधान की आवश्यकता है।
मार्को


@ गिल्स लिंक के लिए धन्यवाद। मैन पेज स्पष्ट रूप से बताता है: ... परिणामस्वरूप, अगर एन्ट्रापी पूल में पर्याप्त एन्ट्रापी नहीं है, तो लौटे मान सैद्धांतिक रूप से क्रिप्टोग्राफिक हमले के लिए असुरक्षित हैं ... इसलिए मैंने इसे कम सुरक्षित के रूप में वर्गीकृत किया है।
मार्को

0

मैं एक 4TB बाहरी USB HDD को भरने की कोशिश कर रहा था dd if=/dev/urandom of=/dev/sdX status=progressजिसके साथ बहुत धीमी गति ( bs=सेटिंग्स के बावजूद ) था, और ऐसा लगता है कि यह opensslकितना यादृच्छिक डेटा है (कम से कम 1.0.2p संस्करण के लिए) आउटपुट पर एक टोपी है। सबसे अच्छा विकल्प मैंने पाया था frostschutz से टिप्पणी उपयोग करने के लिए shred, के रूप में:

shred -v -n 1 /dev/sdX

-n 1यह सुनिश्चित करें कि यह डिवाइस को 3 बार से अधिक लिखने के लिए डिफ़ॉल्ट रूप से उपयोग करेगा (साथ ही -vजो प्रगति दिखाता है)। मुझे नहीं लगता कि छद्म यादृच्छिक संख्याओं की गुणवत्ता इतनी अधिक है, लेकिन यह मेरे लिए एन्क्रिप्शन के लिए एक बड़ी क्षमता पोर्टेबल HDD तैयार करने के लिए पर्याप्त है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.