ฉันจะรับ / dev / random เพื่อทำงานบนเครื่องเสมือน Ubuntu ได้อย่างไร


19

เห็นได้ชัดว่า / dev / random ขึ้นอยู่กับการขัดจังหวะของฮาร์ดแวร์หรือลักษณะทางกายภาพที่คาดเดาไม่ได้ของฮาร์ดแวร์ที่คล้ายกัน เนื่องจากเครื่องเสมือนไม่มีฮาร์ดแวร์ที่มีอยู่จริงการทำงานcat /dev/randomภายในเครื่องเสมือนจะไม่สร้างอะไรเลย ฉันใช้ Ubuntu Server 11.04 เป็นโฮสต์และแขกด้วย libvirt / KVM

ฉันต้องตั้งค่า Kerberos ภายใน VM แต่krb5_newrealmเพียงแฮงค์ตลอดกาล "กำลังโหลดข้อมูลแบบสุ่ม" เนื่องจากระบบไม่ได้ทำการผลิตใด ๆ

ไม่มีใครรู้วิธีแก้ปัญหานี้หรือไม่? เป็นไปได้ที่จะผ่านโฮสต์ / dev / random (ซึ่งช่างพูดมาก) ลงใน vm เพื่อให้ vm สามารถใช้เป็นข้อมูลแบบสุ่มได้หรือไม่?

ฉันอ่านแล้วว่ามีทางเลือกซอฟต์แวร์บางอย่าง แต่พวกเขาก็ไม่ได้ดีสำหรับการเข้ารหัสเพราะพวกเขาไม่ได้สุ่มพอ

แก้ไข: ปรากฏว่า cat / dev / random บน vm สร้างผลลัพธ์ได้ช้ามาก ๆ ฉันได้ตั้งค่าอาณาจักรของฉันโดยรอประมาณสองชั่วโมงขณะที่มันเป็น "กำลังโหลดข้อมูลแบบสุ่ม" ในที่สุดมันก็เพียงพอที่จะดำเนินการต่อ ฉันยังคงสนใจที่จะเร่งความเร็วนี้

คำตอบ:


10

มันควร 'แค่ทำงาน' แม้ว่า vm ไม่มีฮาร์ดแวร์ทางกายภาพโดยเฉพาะ แต่ก็ยังสามารถเข้าถึงแหล่งสุ่มที่ดีมาก ๆ ตัวอย่างเช่นสามารถใช้ TSC ของ CPU เพื่อกำหนดเวลาการอ่านจากดิสก์เสมือนซึ่งท้ายที่สุดจะปิดท้ายฟิสิคัลดิสก์ตามกำหนดเวลาเป็นหนึ่งในพันล้านของวินาที การกำหนดเวลาเหล่านี้ขึ้นอยู่กับแรงเฉือนของกระแสลมที่ปั่นป่วนในฮาร์ดไดรฟ์ซึ่งไม่สามารถคาดการณ์ได้

ตรรกะที่คล้ายกันนี้ใช้กับการรับส่งข้อมูลเครือข่าย แม้ว่าอินเทอร์เฟซจะถูกจำลองเสมือนตราบใดที่แพ็คเก็ตมาบนเครือข่ายทางกายภาพ (และไม่ได้อยู่ในกล่องบอกว่ากำเนิดใน vm อื่น) เวลาของแพ็กเก็ตขึ้นอยู่กับเฟสออฟเซ็ตระหว่างคริสตัล oscillator บนการ์ดเครือข่าย และคริสตัลออสซิลเลเตอร์ที่ขับเคลื่อน TSC นี่ขึ้นอยู่กับการเปลี่ยนแปลงอุณหภูมิของโซนด้วยกล้องจุลทรรศน์ในผลึกควอทซ์ทั้งสอง สิ่งนี้ไม่แน่นอนเช่นกัน

ถ้าด้วยเหตุผลบางอย่างมันไม่ทำงานทางออกที่ง่ายที่สุดคือการเขียนโปรแกรมเพื่อขุดเอนโทรปีและเพิ่มลงในกลุ่มของระบบ อินเทอร์เฟซเครือข่ายเป็นแหล่งที่เชื่อถือได้มากที่สุดของคุณ ตัวอย่างเช่นคุณสามารถเขียนรหัสไปที่:

1) ค้นหา TSC

2) ออกแบบสอบถาม DNS ไปยังเซิร์ฟเวอร์ที่ทราบว่าไม่อยู่ในเครื่องทางกายภาพเดียวกัน

3) ค้นหา TSC เมื่อแบบสอบถามเสร็จสมบูรณ์

4) ทำซ้ำสองสามครั้งเพื่อสะสมค่า TSC ทั้งหมด

5) ทำการแฮชที่ปลอดภัยบนฟังก์ชัน TSC ที่สะสมไว้

6) ส่งผ่านฟังก์ชันแฮชที่ปลอดภัยไปยังพูลเอนโทรปีของระบบ

7) ตรวจสอบระดับเอนโทรปีของพูลและรอจนกระทั่งมันเหลือน้อย เมื่อเป็นเช่นนั้นกลับไปที่ขั้นตอนที่ 1

Linux มีการเรียก IOCTL แบบง่าย ๆ เพื่อเพิ่มเอนโทรปีให้กับพูลตรวจสอบระดับพูลและอื่น ๆ คุณอาจมีrngdซึ่งสามารถนำเอนโทรปีจากไปป์และป้อนเข้าสู่กลุ่มของระบบ คุณสามารถเติมไพพ์จากแหล่งใดก็ได้ที่คุณต้องการไม่ว่าจะเป็น TSC หรือ 'wget' จากแหล่งเอนโทรปีของคุณเอง


ข้อเสนอแนะที่สองของคุณดูเหมือนน่าสนใจในทางทฤษฎี แต่ฉันหวังว่าจะได้คำตอบที่ไม่เกี่ยวข้องกับการเขียนโปรแกรม ฉันสงสัยว่าการคัดลอกไฟล์ขนาดใหญ่ไปยังหรือจากโฮสต์จากไดรฟ์ usb จะมีผลต่อพูลเอนโทรปีของ vm หรือไม่ (เช่นทำให้ทำงานเร็วขึ้น) ถ้าเป็นเช่นนั้นฉันสามารถลองสร้างอาณาจักรของฉันในขณะที่เรียกใช้สำเนาสำรองของอิมเมจเครื่องบนโฮสต์ ...
Nick

1
คุณสามารถทำการทดสอบเพื่อดูว่าเติมเอนโทรปีอะไร เมื่อคุณพบบางสิ่งที่ใช้งานได้คุณก็สามารถทำสิ่งนั้นได้ การรับส่งข้อมูลเครือข่ายควรทำ กิจกรรมไดรฟ์ควรทำ คุณสามารถทดสอบเพื่อดูว่าอะไรที่ใช้งานได้กับคำสั่งนี้: cat /proc/sys/kernel/random/entropy_availสิ่งใดก็ตามที่เพิ่มขึ้นและใช้งานได้
David Schwartz

โปรดทราบว่าการเรียกใช้ cat เอนโทรปี "กิน" (การสุ่มของพื้นที่ที่อยู่) python -c 'while True: import time; print str(time.sleep(1))[0:0] + open("/proc/sys/kernel/random/entropy_avail", "rb").read(),'คุณสามารถใช้ ใช่มันยากที่จะอ่าน แต่ฉันไม่เห็นวิธีที่จะเข้าสู่บรรทัดใหม่ในความคิดเห็น ...
Doncho Gunchev

10

ฉันใช้แฮกบนเซิร์ฟเวอร์ที่ไม่มีส่วนหัวทั้งหมดที่ดำเนินการเข้ารหัสลับ (เช่นการจับมือ TLS, Kerberos ฯลฯ ) ควรอยู่ในที่เก็บแพคเกจเวอร์ชัน Ubuntu ส่วนใหญ่: http://packages.ubuntu.com/search?keywords=haveged&searchon=names&suite=all§ion=all

hasged ใช้อัลกอริทึม HAVAGE เพื่อแยกเอนโทรปีจากสถานะภายในของโปรเซสเซอร์ที่ทันสมัย นี่คือคำอธิบายเชิงลึก: http://www.irisa.fr/caps/projects/hipsor/

คุณสามารถตรวจสอบการสุ่มของเอนโทรปีที่สร้างขึ้นด้วยแพ็คเกจ ent ในระบบของฉันเอนโทรปีที่สร้างขึ้นจากได้ผ่านการทดสอบแบบสุ่มทั้งหมดโดยใช้


คุณต้องเรียกใช้ชุดทดสอบ NIST เพื่อให้แน่ใจ
Michael Hampton

7

ใช่คุณสามารถเพาะมันได้จาก:

http://manpages.ubuntu.com/manpages/jaunty/man4/random.4.html

คุณสามารถใส่ลงไปใน / dev / urandom และมันควรเพาะพูเอนโทรปี ฉันสามารถยืนยันได้โดย:

root@mx01-ewr:/proc/sys/kernel/random# cat entropy_avail 
128
root@mx01-ewr:/proc/sys/kernel/random# cat /dev/xvda >/dev/urandom  &
[1] 16187 # just using this as a source of data, you could do ssh hostIP 'cat /dev/random' >... etc
root@mx01-ewr:/proc/sys/kernel/random# cat entropy_avail 
1221
root@mx01-ewr:/proc/sys/kernel/random# cat entropy_avail 
1398

โบนัสถ้าคุณทำให้คำสั่ง ssh ผ่านเราเตอร์ดังนั้นมันจึงสร้างเอนโทรปี * :)


ฉันสับสนเกี่ยวกับส่วนตรงกลาง ฉันไม่มี "/ dev / xvda" บนระบบ มีเป้าหมายที่จะใช้ ssh เพื่อจัดเส้นทางโฮสต์ / dev / สุ่มไปยัง vm's / dev / urandom หรือไม่ ฉันสามารถส่งอะไรก็ได้ที่ฉันต้องการเป็น "/ dev / urandom" และมันมาจาก "/ dev / random"?
Nick

ฉันสามารถรับข้อมูลแบบสุ่มจากโฮสต์โดยใช้ "ssh 192.168.1.1 'cat / dev / random'" แต่ฉันไม่รู้ว่าจะส่งผลกระทบต่อแขก "/ dev / random" อย่างไร "ssh 192.168.1.1 'cat / dev / random'> / dev / urandom" ดูเหมือนจะไม่ทำอะไรเลย
นิค

ฉันเพิ่งทดสอบโดยใช้ 'cat / dev / random' ในเทอร์มินัลเดียวและรอจนกระทั่งมันหยุดส่งข้อมูลออก จากนั้นในอีกฉันทำ 'cat somerandomfile> / dev / urandom' และช้ากว่า 'cat / dev / random' เริ่มส่งสัญญาณอีกครั้ง ดูเหมือนว่าคุณต้องการอินพุตแบบสุ่มจำนวนมากใน / dev / urandom เพื่อให้ได้ค่า / dev / การสุ่มแบบสุ่ม คุณกำลังบอกว่าเมื่อทำแมว ... '> / dev / urandom คุณไม่เห็นผลลัพธ์ใด ๆ ใน / dev / random เลย?
พหุนาม

ในที่สุดฉันก็เห็นผลลัพธ์บางอย่าง แต่มันช้ามาก ฉันไม่แน่ใจว่ามันมากกว่าสิ่งที่เกิดขึ้นตามธรรมชาติหรือไม่ ฉันได้ค้นพบว่ามีการสร้างข้อมูลสุ่มจำนวนเล็กน้อยที่ช้าและน้อยใน VMs มันใช้เวลาตลอดไป ฉันได้สร้างอาณาจักรของฉันหลังจากปล่อยให้มันนั่งและ "รวบรวมข้อมูลแบบสุ่ม" ประมาณ 2 ชั่วโมง
Nick

+1 สำหรับคำตอบที่เป็นประโยชน์
นิค

5

สิ่งนี้ใช้ได้สำหรับฉัน

การรัน krb5_newrealm ภายใน VM อาจใช้เวลานานกว่าจะเสร็จสมบูรณ์ (หลังจากแสดงข้อความ "การโหลดข้อมูลแบบสุ่ม") คุณสามารถใช้แฮ็คต่อไปนี้เพื่อเร่งอะไร ๆ สักหน่อย

$ sudo aptitude install rng-tools -y
$ sudo rngd -r /dev/urandom -o /dev/random  # don't do this in production!

โพสต์ที่http://fossies.org/linux/john/doc/Kerberos-Auditing-HOWTO.md


1

คำตอบ X86 คือทำให้แน่ใจว่า VM ของคุณไม่ได้ดักจับ RdRand หรือ RdSeed คุณเชื่อใจ VM ของคุณในหลาย ๆ สิ่งนี่เป็นหนึ่งในนั้น

RNGd ล่าสุดที่เพียงพอบนโพสต์ Snady Bridge CPU จะ (หรือสามารถบอกได้ว่า) ใช้ RdRand หรือ RdSeed และ RdRand หรือ RdSeed ที่ไม่ได้รับการแก้ไขจะได้รับข่าวสารจาก VM / dev / random จากนั้นทำงานร่วมกับแหล่งเอนโทรปีของแหล่งข้อมูล (ไม่ใช่เสมือน)

นี่ไม่ใช่โดยบังเอิญ มันอยู่ที่นั่นในเอกสารสถาปัตยกรรมของ Intel

สำหรับแหล่งข้อมูลเอนโทรปีของฮาร์ดแวร์ที่ใช้อุปกรณ์ (IE ใช้ไดรเวอร์เคอร์เนลเพื่อแชร์) คุณต้องใช้ VM เพื่อจำลองแหล่งที่มาทางกายภาพให้ถูกต้อง ฉันไม่มีเงื่อนงำหากพวกเขาทำเช่นนี้และหากเป็นเช่นนั้นสำหรับอุปกรณ์ใด

หาก RNGd ของคุณไม่มีตัวเลือก drng ด้านล่างให้อัปเดต หากฮาร์ดแวร์ของคุณไม่มีฮาร์ดแวร์ที่รวดเร็ว RNG แสดงว่าคุณถึงวาระแล้วและคุณควรพิจารณาใช้ฮาร์ดแวร์ที่แตกต่างกันเพื่อความปลอดภัย

# rngd --help
Usage: rngd [OPTION...]
Check and feed random data from hardware device to kernel entropy pool.

  -b, --background           Become a daemon (default)
  **-d, --no-drng=1|0          Do not use drng as a source of random number input**
                             (default: 0)
  -f, --foreground           Do not fork and become a daemon
  -n, --no-tpm=1|0           Do not use tpm as a source of random number input
                             (default: 0)
  -o, --random-device=file   Kernel device used for random number output
                             (default: /dev/random)
  -p, --pid-file=file        File used for recording daemon PID, and multiple
                             exclusion (default: /var/run/rngd.pid)
  -q, --quiet                Suppress error messages
  -r, --rng-device=file      Kernel device used for random number input
                             (default: /dev/hwrng)
  -s, --random-step=nnn      Number of bytes written to random-device at a time
                             (default: 64)
  -v, --verbose              Report available entropy sources
  -W, --fill-watermark=n     Do not stop feeding entropy to random-device until
                             at least n bits of entropy are available in the
                             pool (default: 2048), 0 <= n <= 4096
 -?, --help                 Give this help list
  --usage                Give a short usage message
  -V, --version              Print program version

Mandatory or optional arguments to long options are also mandatory or optional
for any corresponding short options.

Report bugs to Jeff Garzik <jgarzik@pobox.com>.

0

ฉันมีปัญหากับ krb5_newrealm ที่แขวนเช่นกัน สิ่งนี้ใช้ได้ผลดีสำหรับฉันตามคำตอบข้างต้น:

cat /dev/sda > /dev/urandom

คุณอาจต้องการที่จะฆ่ามันเมื่อเสร็จสิ้นความต้องการข้อมูลสุ่มของคุณ / dev / sda อาจมีข้อมูลมากกว่าที่คุณต้องการ

หมายเหตุ: ฉันไม่แน่ใจว่าสุ่มข้อมูลที่สร้างในลักษณะนี้จริง ๆ


โปรดอ้างอิงโพสต์อื่น ๆ โดยใช้ชื่อโปสเตอร์ การพูดว่า "เหนือ" หรือ "ด้านล่าง" นั้นไม่มีความหมายเพราะคุณเราไม่เห็นโพสต์ในลำดับเดียวกัน
John Gardeniers

4
สิ่งนี้อาจใช้งานได้ แต่ / dev / sda มีข้อมูลที่ไม่สุ่มจำนวนมาก (อย่างน้อยเป็นศูนย์ทั้งหมด) ซึ่งทำให้ความคิดไม่ดีมากจากมุมมองด้านความปลอดภัย นอกเหนือจากศูนย์แล้วมันเริ่มต้นด้วย MBR ซึ่งสามารถคาดเดาได้จริงมากฉันสามารถคาดเดาได้อย่างน้อย 3 ไบต์ ... หรือมันจะบูตไม่ได้;)
Doncho Gunchev
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.