エントロピーを消費することは何ですか?

エントロピーを消費することは何ですか?

これにより、watch cat /proc/sys/kernel/random/entropy_availシステムのエントロピーが時間の経過とともにゆっくりと増加し、180〜190の範囲に達してから約120〜130に低下することがわかります。エントロピーの減少は約20秒ごとに発生するようです。lsofプロセスがないか開いて/dev/randomいる場合でも/dev/urandomこれを観察します。エントロピーを消費するものは何ですか?カーネルにもエントロピーが必要ですか?それとも、より大きなプールをより小さく、より良い品質のプールに再処理するのでしょうか?

これは、SSL / SSH / WPA接続のないベアメタルマシンにあります。

答え1

pass によってエントロピーが失われるだけでなく、/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

エントロピーを消費するバックグラウンドプロセスもあります。適切なコアのトレースポイントを使用すると、エントロピープールを変更するプロセスを表示できます。-gすべてのCPUの呼び出しチェーン(-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: ランダム: extract_entropy: ffffffff8173e956 プール: nbytes 8 entropy_count921caller_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)
                  293ce8worker_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_bits64
                  5eb3e8 account.part.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)
                  293ce8worker_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)

...

exchanger0[002] 3292.507720: ランダム: Credit_entropy_bits: ffffffff8173e956 プール: ビット 2 entropy_count第859話entropy_total 2 呼び出し側 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)
                  2d5729handle_irq_event_percpu(/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  2d58b9handle_irq_event(/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  2d8d1b handler_edge_irq(/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  230e6ahandle_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

ラソフ/dev/randomプロセスが読み取る内容はしばらくすると終了するため、最高の監視ツールではありません。非常に時間が短いです。私は読むプロセスを得る良い方法がわかりませんがinotifyもし読書があります。

これには基本的に2つのアプローチがあります。

  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コードがあり、昨日それを見つけようとしました。後で見つけて回答を更新できることを確認します。

関連情報