สิ่งที่ทำให้เอนโทรปีการระบายน้ำ?


21

ถ้าฉันwatch cat /proc/sys/kernel/random/entropy_availฉันเห็นว่าระบบของฉันเอนโทรปีเพิ่มขึ้นอย่างช้าๆเมื่อเวลาผ่านไปจนถึงช่วง 180-190 ที่จุดนั้นจะลดลงถึงประมาณ 120-130 การหยดของเอนโทรปีดูเหมือนจะเกิดขึ้นทุก ๆ ยี่สิบวินาที ฉันสังเกตสิ่งนี้แม้จะlsofบอกว่าไม่มีกระบวนการ/dev/randomใดที่/dev/urandomเปิดหรือเปิด อะไรคือสิ่งที่ระบายออกจากเอนโทรปี? เคอร์เนลต้องการเอนโทรปีเช่นกันหรืออาจเป็นการประมวลผลพูลที่ใหญ่กว่าลงในพูลที่เล็กกว่าและมีคุณภาพดีกว่าหรือไม่?

นี่เป็นเครื่องโลหะเปลือยที่ไม่มีการเชื่อมต่อ SSL / SSH / WPA


คำถามที่ดีและในขณะที่ฉันไม่สามารถให้คำตอบที่เฉพาะเจาะจงกับคุณได้มันก็สมเหตุสมผลกับฉันว่า "เอนโทรปีพูล" ไม่ใช่สิ่งที่ควรเพิ่มเมื่อไม่ได้ใช้ /dev/randomคือบางสิ่งที่ใช้เพื่อจุดประสงค์ด้านการเข้ารหัสลับที่ปลอดภัยและการนำไปปฏิบัตินั้นไม่สามารถไร้เดียงสาได้ คำอธิบายหนึ่งอาจเป็นนัยในจุดสุดท้ายที่นี่: en.wikipedia.org/wiki/Entropy_pool#Using_observed_events (เริ่มต้นด้วย "รักษารหัสกระแสด้วยคีย์และเวกเตอร์เริ่มต้น ... ") -> สระว่ายน้ำถูกแทนที่เมื่อใดก็ตามที่เพียงพอ ข้อมูลได้สะสม
goldilocks

โปรดทราบว่าไม่ว่าในกรณีใดการคำนวณเอนโทรปีของลีนุกซ์/dev/randomนั้นเป็นการหลอกลวงมาก - เมื่อสระเอนโทรปีเต็มครั้งเดียว/dev/urandomก็ดีเหมือน/dev/randomกัน
Gilles 'หยุดความชั่วร้าย'

1
@ techraf ว้าวคำตอบนั้นใหญ่เร็ว ฉันไม่เคยคาดหวังว่าจะได้รับคำตอบ 2.5 ปีต่อมา
wingedsubmariner

คำตอบ:


20

เอนโทรปีไม่ได้หายไปเพียงอย่างเดียวผ่านทาง/dev/{,u}randomเคอร์เนลยังใช้เวลาบางส่วน ตัวอย่างเช่นกระบวนการใหม่มีที่อยู่แบบสุ่ม (ASLR) และแพ็คเก็ตเครือข่ายต้องการหมายเลขลำดับแบบสุ่ม แม้โมดูลระบบไฟล์อาจลบเอนโทรปีบางส่วน ดูความคิดเห็นในไดรเวอร์ / ถ่าน / random.c โปรดทราบด้วยว่าentropy_availหมายถึงพูลข้อมูลไม่ใช่พูลเอาต์พุต (โดยทั่วไปคือไม่มีการบล็อก/dev/urandomและบล็อก/dev/random)

หากคุณต้องการที่จะดูสระว่ายน้ำเอนโทรปีไม่ได้ใช้ว่าจะใช้เอนโทรปีในการภาวนาของทุกwatch cat catในอดีตฉันยังต้องการดูพูลนี้เนื่องจาก GPG ช้ามากในการสร้างคีย์ดังนั้นฉันจึงเขียนโปรแกรม C โดยมีจุดประสงค์เพียงอย่างเดียวเพื่อดูพูลเอนโทรปี: https://git.lekensteyn.nl/c-files/tree /entropy-watcher.c

โปรดทราบว่าอาจมีกระบวนการพื้นหลังที่ใช้เอนโทรปี การใช้ tracepoints บนเคอร์เนลที่เหมาะสมคุณสามารถเห็นกระบวนการที่ปรับเปลี่ยนพูลเอนโทรปี ตัวอย่างการใช้งานที่บันทึกจุดติดตามทั้งหมดที่เกี่ยวข้องกับระบบย่อยแบบสุ่มรวมถึง callchain ( -g) บน CPUs ทั้งหมด ( -a) เริ่มการวัดหลังจาก 1 วินาทีเพื่อเพิกเฉยต่อกระบวนการของตัวเอง ( -D 1000) และรวมถึงการประทับเวลา ( -T):

sudo perf record -e random:\* -g -a -D 1000 -T sleep 60

อ่านด้วยคำสั่งเหล่านี้ (เปลี่ยนเจ้าของได้perf.dataตามต้องการ):

perf report  # opens an interactive overview
perf script  # outputs events after each other with traces

perf scriptเอาท์พุทให้ข้อมูลเชิงลึกที่น่าสนใจและแสดงให้เห็นว่าเมื่อประมาณ 8 ไบต์ (64 บิต) ของเอนโทรปีเป็นเนื้อเป็นระยะ ๆ ในเครื่องของฉัน:

kworker / 0: 2 193 [000] 3292.235908: random: extract_entropy: ffffffff8173e956 พูล: nbytes 8 entropy_count 921ผู้เรียก _xfer_secondary_pool
                  5eb857 extract_entropy (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  5eb984 _xfer_secondary_pool (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  5ebae6 push_to_pool (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  293a05 process_one_work (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  293ce8 worker_thread (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  299998 kthread (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  7c7482 ret_from_fork (/lib/modules/4.6.2-1-ARCH/build/vmlinux)

kworker / 0: 2 193 [000] 3292.235911: สุ่ม: debit_entropy: ffffffff8173e956: debit_bits 64
                  5eb3e8 บัญชีส่วนที่ 12 (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  5eb770 extract_entropy (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  5eb984 _xfer_secondary_pool (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  5ebae6 push_to_pool (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  293a05 process_one_work (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  293ce8 worker_thread (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  299998 kthread (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  7c7482 ret_from_fork (/lib/modules/4.6.2-1-ARCH/build/vmlinux)

...

swapper 0 [002] 3292.507720: random: credit_entropy_bits: ffffffff8173e956 พูล: bits 2 entropy_count 859 entropy_total 2 ผู้โทร
                  5eaab6 credit_entropy_bits (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  5ec644 add_interrupt_randomness (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  2d5729 handle_irq_event_percpu (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  2d58b9 handle_irq_event (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  2d8d1b handle_edge_irq (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  230e6a handle_irq (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  7c9abb do_IRQ (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  7c7bc2 ret_from_intr (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  6756c7 cpuidle_enter (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  2bd9fa call_cpuidle (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  2bde18 cpu_startup_entry (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  2510e5 start_secondary (/lib/modules/4.6.2-1-ARCH/build/vmlinux)

เห็นได้ชัดว่าสิ่งนี้เกิดขึ้นเพื่อป้องกันไม่ให้เสียเอนโทรปีโดยการโอนเอนโทรปีจากสระว่ายน้ำไปยังสระว่ายน้ำเอาท์พุท:

/*
 * Credit (or debit) the entropy store with n bits of entropy.
 * Use credit_entropy_bits_safe() if the value comes from userspace
 * or otherwise should be checked for extreme values.
 */
static void credit_entropy_bits(struct entropy_store *r, int nbits)
{
    ...
        /* If the input pool is getting full, send some
         * entropy to the two output pools, flipping back and
         * forth between them, until the output pools are 75%
         * full.
         */

         ...
            schedule_work(&last->push_work);
}

/*
 * Used as a workqueue function so that when the input pool is getting
 * full, we can "spill over" some entropy to the output pools.  That
 * way the output pools can store some of the excess entropy instead
 * of letting it go to waste.
 */
static void push_to_pool(struct work_struct *work)
{
    ...
}

2
+1 สำหรับการชี้ให้เห็นว่าแม้การดำเนินการ "ไร้เดียงสา" ที่ดูเหมือนจะเป็นเช่นการเริ่มต้นโปรแกรมสามารถระบายเอนโทรปีได้เล็กน้อย
CVn

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

@ techraf การสังเกตที่ดีการเรียกใช้เป็นระยะcatควรในทางทฤษฎีมีการระบายเอนโทรปีเดียวกันซึ่งไม่ควรมองเห็น ปรากฎว่าเอนโทรปีถูกย้ายไปยังสระน้ำอื่นเมื่อมีเอนโทรปี "เพียงพอ"
Lekensteyn

4

lsofไม่ได้เป็นเครื่องมือที่ดีที่สุดกับจอแสดงผล/dev/randomเป็นหนึ่งในการอ่านโดยกระบวนการที่มีมากกว่าในมากจำนวนเวลาสั้น ๆ ฉันไม่ทราบวิธีการที่ดีในการทำให้กระบวนการอ่าน แต่ใช้inotifyคุณสามารถตรวจสอบได้ถ้ามีการอ่าน

โดยทั่วไปมีสองวิธีดังนี้

  1. รับข้อมูลสรุปหลังจาก N วินาทีด้วย:

    inotifywatch -v -t 60 /dev/random 
    
  2. ดูกิจกรรมการเข้าถึงสด :

    inotifywait -m --timefmt '%H:%M:%S' --format '%T: %e' /dev/random
    

ทั้งสองจะไม่ทำให้คุณกระบวนการและหลังจะไม่ให้ขนาดของการอ่าน ครั้งแรกที่จะให้คุณสรุปใน:

total  access  close_nowrite  open  filename
18     16      1              1     /dev/random

หากคุณมีการทำงานและทำdd if=/dev/random of=/tmp/foo bs=1 count=3คุณจะได้รับความคิด

แต่อย่างใด สิ่งนี้จะไม่ให้เห็บคุณเมื่อเคอร์เนลใช้จากพูล


เมื่อพูดถึงการตรวจสอบสถานะของเอนโทรปีที่ใช้

watch cat /proc/sys/kernel/random/entropy_avail

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


auditd สามารถเข้าสู่ระบบอ่านจาก/dev/random(ฉันรู้ว่ามีตัวอย่างที่คล้ายกันในเว็บไซต์นี้)
Gilles 'ดังนั้น - หยุดความชั่วร้าย'

1
สิ่งที่เกี่ยวกับการใช้ perl ต่อไปนี้แทนwatch cat: use Fcntl 'SEEK_SET'; open(my $fh,"<", "/proc/sys/kernel/random/entropy_avail"); while (1) { print <$fh>; sleep(1); seek($fh,0,SEEK_SET); }
gmatht
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.