जल निकासी एन्ट्रापी क्या रखता है?


21

अगर मैं यह watch cat /proc/sys/kernel/random/entropy_availदेखूं कि मेरा सिस्टम समय के साथ धीरे-धीरे बढ़ता है, तो यह 180-190 की सीमा तक पहुंच जाता है, जिस बिंदु पर यह 120-130 तक गिर जाता है। एन्ट्रापी में बूँदें लगभग हर बीस सेकंड में लगती हैं। मैं यह तब भी देखता हूं जब यह lsofकहता है कि कोई प्रक्रिया नहीं है /dev/randomया /dev/urandomखुली है। एन्ट्रापी दूर क्या है? क्या कर्नेल को एन्ट्रापी की आवश्यकता होती है, या हो सकता है कि यह बड़े पूल को छोटे, बेहतर गुणवत्ता वाले पूल में पुन: पेश कर रहा हो?

यह एक नंगे धातु मशीन पर है, जिसमें कोई एसएसएल / एसएसएच / डब्ल्यूपीए कनेक्शन नहीं है।


अच्छा सवाल है, और जब तक मैं आपको एक विशिष्ट जवाब नहीं दे सकता, यह मेरे लिए समझ में आता है कि "एन्ट्रापी पूल" बस कुछ ऐसा नहीं है जो अप्रयुक्त होने पर बढ़ना चाहिए। /dev/randomआखिरकार, कुछ ऐसा है जो सुरक्षित क्रिप्टोग्राफ़िक उद्देश्यों के लिए उपयोग किया जाता है, और कार्यान्वयन भोली होने का जोखिम नहीं उठा सकता है। एक व्याख्या यहाँ अंतिम बिंदु पर संकेत दी जा सकती है: en.wikipedia.org/wiki/Entropy_pool#Using_observed_events (कुंजी के साथ एक धारा सिफर बनाए रखें और प्रारंभिक वेक्टर के साथ ...) -> पूल को जब भी बदला जाता है डेटा जमा हो गया है।
गोल्डीलॉक्स

ध्यान दें कि किसी भी स्थिति में, लिनक्स की एन्ट्रापी गणना /dev/randomबहुत अधिक फर्जी है - एक बार एन्ट्रापी पूल एक बार भर गया है, /dev/urandomबस उतना ही अच्छा है /dev/random
गाइल्स का SO- बुराई पर रोक '

1
@techraf वाह, उस जवाब को बड़ी तेजी से मिला। मुझे 2.5 साल बाद जवाब मिलने की कभी उम्मीद नहीं थी।
विंगड्यूसम्बर्नेर

जवाबों:


20

एन्ट्रापी न केवल के माध्यम से खो दिया है /dev/{,u}random, कर्नेल भी कुछ लेता है। उदाहरण के लिए, नई प्रक्रियाओं में यादृच्छिक पते (एएसएलआर) हैं और नेटवर्क पैकेट को यादृच्छिक अनुक्रम संख्या की आवश्यकता है। यहां तक ​​कि फाइलसिस्टम मॉड्यूल कुछ एन्ट्रापी को हटा सकता है। ड्राइवरों / char / random.c में टिप्पणियों को देखें । यह भी ध्यान दें कि entropy_availइनपुट पूल को संदर्भित करता है , आउटपुट पूल को नहीं (मूल रूप से गैर-अवरुद्ध /dev/urandomऔर अवरुद्ध /dev/random)।

यदि आपको एन्ट्रापी पूल देखने की आवश्यकता है, तो उपयोग न करें watch cat, जो कि हर आह्वान पर एन्ट्रॉपी का उपभोग करेगा cat। अतीत में मैं भी इस पूल को देखना चाहता था क्योंकि GPG चाबियां बनाने में बहुत धीमी थी, इसलिए मैंने एन्ट्रोपी पूल को देखने के लिए एकमात्र उद्देश्य के साथ एक सी प्रोग्राम लिखा: https://git.lekensteyn.nl/c-files/tree /entropy-watcher.c

ध्यान दें कि पृष्ठभूमि प्रक्रियाएं भी हो सकती हैं जो एंट्रोपी का उपभोग करती हैं। एक उपयुक्त कर्नेल पर ट्रेसप्वाइंट का उपयोग करके आप उन प्रक्रियाओं को देख सकते हैं जो एन्ट्रापी पूल को संशोधित करती हैं। उदाहरण उपयोग जो -gसभी सीपीयू पर कॉलचैन ( ) सहित रैंडम सबसिस्टम से संबंधित सभी ट्रेस पॉइंट्स को रिकॉर्ड करता है ( -a1 सेकंड के बाद माप शुरू करना -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: यादृच्छिक: extract_entropy: ffffffff8173e956 पूल: nbytes 8 एन्ट्रापी_काउंट 921 कॉलर _xec_secondary_pool
                  5eb857 extract_entropy (/lib/modules/4.6.2-1-ARCH/build/vodlin.com)
                  5eb984 _xfer_secondary_pool (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  5eba6 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 कार्यकर्ता_थ्रेड (/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)

केवर्कर / 0: 2 193 [000] 3292.235911: यादृच्छिक: debit_entropy: ffffffff8173e956: debit_bits 64
                  5eb3e8 account.part.12 (/lib/modules/4.6.2-1-ARCH/build/vodlin.net)
                  5eb770 extract_entropy (/lib/modules/4.6.2-1-ARCH/build/vodlin.com)
                  5eb984 _xfer_secondary_pool (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  5eba6 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 कार्यकर्ता_थ्रेड (/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)

...

स्वैपर 0 [002] 3292.507720: यादृच्छिक: credit_entropy_bits: ffffffff8173e956 पूल: बिट्स 2 एन्ट्रापी_काउंट 859 एंट्रॉपी_टोटल 2 कॉलगर्ल add_interrupt_randomness
                  5ea66 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 हैंडल_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/vodlin.com)
                  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 अच्छा अवलोकन, catसिद्धांत रूप में समय-समय पर आह्वान होना चाहिए वही एंट्रॉपी नाली है जो दिखाई नहीं देना चाहिए। यह पता चला है कि "पर्याप्त" एन्ट्रॉपी होने पर एंट्रॉपी को एक अलग पूल में ले जाया जाता है।
लीकेनस्टाइन

4

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

यहाँ मूल रूप से दो तरीके हैं:

  1. एन सेकंड के बाद एक सारांश प्राप्त करें:

    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एंट्रोपी का उपभोग करने वाला है। (मैं देख रहा हूं कि यह एक और जवाब देता है जिसमें इसका उल्लेख भी है।) मेरे पास इसके लिए कुछ सी कोड भी हैं और कल इसका पता लगाने की कोशिश की। मैं देखूंगा कि क्या मैं इसे पा सकता हूं और बाद में जवाब अपडेट कर सकता हूं।


ऑडिट लॉग से पढ़ सकते हैं /dev/random(मुझे पता है कि इस साइट पर समान उदाहरण हैं)।
गिलेस एसओ- बुराई को रोकना '

1
निम्नलिखित पर्ल के उपयोग के बारे में क्या है 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.