Entropinin boşaltılmasını sağlayan nedir?


21

Bunu yaparsam watch cat /proc/sys/kernel/random/entropy_availsistemlerimin entropisinin zaman içinde yavaş yavaş arttığını görüyorum, 180-190 aralığına ulaşana kadar 120-130'a düşüyor. Entropideki düşüşler yaklaşık yirmi saniyede bir gerçekleşir. lsofHiçbir sürecin açık /dev/randomveya /dev/urandomaçık olmadığını söylese bile bunu gözlemliyorum . Entropiyi boşaltan nedir? Çekirdeğin de entropiye ihtiyacı var mı, yoksa belki daha büyük havuzu daha küçük, daha kaliteli bir havuza yeniden mi işliyor?

SSL / SSH / WPA bağlantısı olmayan çıplak metal bir makinede.


İyi soru, ve size belirli bir cevap veremesem de, "entropi havuzunun" sadece kullanılmadığında artması gereken bir şey olmadığı bana mantıklı geliyor. /dev/randomsonuçta, güvenli kriptografik amaçlar için kullanılan bir şeydir ve uygulama saf olmayı göze alamaz. Buradaki son noktada bir açıklamaya değinilebilir: en.wikipedia.org/wiki/Entropy_pool#Using_observed_events ("Anahtarlı bir akış şifresini koru ve Başlatma vektörü ...") ile başlayarak -> havuz yeterli olduğunda değiştirilir veriler birikmiştir.
goldilocks

Her durumda, Linux'un entropi hesaplamasının /dev/randomoldukça sahte olduğunu unutmayın - entropi havuzu bir kez dolduğunda, /dev/urandomaynı derecede iyidir /dev/random.
Gilles 'SO- kötü olmayı kes

1
@techraf Wow, bu cevap hızla büyüdü. 2,5 yıl sonra hiç cevap almayı beklemiyordum.
wingedsubmariner

Yanıtlar:


20

Entropi sadece üzerinden kaybolmaz /dev/{,u}random, çekirdek de biraz alır. Örneğin, yeni işlemler rastgele adreslere (ASLR) sahiptir ve ağ paketleri rastgele sıra numaralarına ihtiyaç duyar. Dosya sistemi modülü bile bazı entropileri kaldırabilir. Sürücüler / char / random.c'deki yorumlara bakın . Ayrıca entropy_avail, giriş havuzlarına atıfta bulunur , çıkış havuzlarına değil (temel olarak engellememe /dev/urandomve engelleme /dev/random).

Entropi havuzunu izlemeniz gerekiyorsa, kullanmayın watch cat, bu her çağrışımda entropi tüketir cat. Geçmişte de GPG anahtar üretmede çok yavaş olduğu için bu havuzu izlemek istedim, bu nedenle entropi havuzunu izlemek için tek amacı olan bir C programı yazdım: https://git.lekensteyn.nl/c-files/tree /entropy-watcher.c .

Entropiyi de tüketen arka plan süreçleri olabileceğini unutmayın. İzleme noktalarını uygun bir çekirdeğe kullanarak entropi havuzunu değiştiren işlemleri görebilirsiniz. Kendi işlemini yok saymak ( ) ve zaman damgaları ( ) dahil olmak üzere 1 saniye sonra ölçüme başlayarak -gtüm CPU'larda ( -a) callchain ( ) dahil rastgele alt sistemle ilgili tüm izleme noktalarını kaydeden örnek kullanım :-D 1000-T

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

Bu komutlardan herhangi biriyle okuyun (sahibini perf.datagerektiği gibi değiştirin ):

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

perf scriptEntropi 8 bayt (64 bit) hakkında periyodik olarak benim makinede boşaltıldığında çıktı ilginç bir kavrayış ve gösteriler verir:

kworker / 0: 2 193 3292.235908: rasgele: ekstrakt_entropi: ffffffff8173e956 havuz: nbytes 8 entropy_count 921 arayan _xfer_seincil_pool
                  5eb857 özü_entropisi (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  5eb984 _xfer_seincil_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: 2193 3292.235911: rasgele: debit_entropi: ffffffff8173e956: debit_bits 64
                  5eb3e8 hesabı.part.12 (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  5eb770 özü_entropisi (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  5eb984 _xfer_seincil_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)

...

takas 0 3292.507720: rasgele: credit_entropy_bits: ffffffff8173e956 havuz: bit 2 entropy_count 859 entropy_total 2 arayan add_interrupt_randomness
                  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_seincil (/lib/modules/4.6.2-1-ARCH/build/vmlinux)

Görünüşe göre bu, entropiyi giriş havuzundan çıkış havuzlarına aktararak entropinin israfını önlemek için olur:

/*
 * 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, bir programı başlatmak gibi görünürde "göze çarpmayan" işlemlerin bile az miktarda entropiyi boşaltabileceğine işaret eder.
CVn

Ancak bu açıklama, soruda açıklanan durumla biraz çelişkilidir, değil mi? Orada entropi (izlenir watch) sürekli büyür ve keskinleşir. Eğer watchher okumada entropi tüketilen, aslında giderek azaltmalıdır.
techraf

@techraf Teoride periyodik olarak çağırılması gereken iyi gözlem, catgörünür olmaması gereken aynı entropi giderine sahip olmalıdır. "Yeterli" entropi olduğunda entropinin farklı bir havuza taşındığı ortaya çıkıyor.
Lekensteyn

4

lsof ,/dev/randombir işlem tarafından okunan çok kısa süredebittiğinden izlenecek en iyi araç değildir. Hangi işlemin bir okuma yaptığını elde etmek için iyi bir yöntem bilmiyorum, ancak bir okuma olup olmadığınıkullanarakinotifyizleyebilirsiniz.

Burada temel olarak iki yol var:

  1. Şununla N saniye sonra bir özet alın:

    inotifywatch -v -t 60 /dev/random 
    
  2. Canlı erişim etkinliklerini görüntüleme :

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

Her ikisi de size işlem vermeyecek ve ikincisi size okuma boyutu vermeyecektir. Birincisi size aşağıdaki gibi bir özet verecektir:

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

Eğer bu koşuya sahipseniz ve bunu dd if=/dev/random of=/tmp/foo bs=1 count=3yaparsanız, fikri anlarsınız.

Her neyse. Çekirdek havuzdan tükettiğinde bu size keneler vermeyecektir.


Entropinin durumunu kontrol etmeye gelince

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

Her catbiri entropi tüketeceği için en iyi fikir değildir . (Şimdi de bu söz başka bir cevap çıkardı görüyorum.) Ayrıca bunun için bazı C kodu var ve dün bulmaya çalıştı. Daha sonra bulabilir miyim ve cevabı güncelleyip güncelleyemeyeceğimi göreceğim.


auditd okumaları günlüğe kaydedebilir /dev/random(bu sitede benzer örnekler olduğunu biliyorum).
Gilles 'SO- kötü olmayı kes

1
Aşağıdaki perl yerine aşağıdakileri kullanmaya ne dersiniz 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.