/dev/urandomでどのプロセスがどのように多くのエントロピーを使用しているかを確認する方法

/dev/urandomでどのプロセスがどのように多くのエントロピーを使用しているかを確認する方法

これにより、fuser -v /dev/urandom現在開いているプロセスが何であるかがわかりますが、/dev/urandomそれ以上ではありません。時間の経過とともに各人が消費したエントロピーの量を確認する方法はありますか?たとえば、あるプロセスは毎分約1ビットのエントロピーを消費し、他のプロセスは毎秒約8ビットを消費します。

答え1

エントロピーが消費されないため、短い答えはゼロです。

一つある一般的な誤解エントロピーが消費されます。ランダムなビットを読み出すたびに、ランダムなソースからいくつかのエントロピーが削除されます。これは間違っています。エントロピーを「消費」しません。。はい、Linux文書が正しくありません。

Linuxシステムのライフサイクルは2つの段階に分けられます。

  1. 最初はエントロピーが足りません。/dev/random十分なエントロピーが蓄積したと思うまでブロックします。/dev/urandom低いエントロピーデータを提供します。
  2. しばらくすると、ランダムジェネレータプールに十分なエントロピーが表示されます。/dev/random偽の「エントロピーリーク」比率を割り当て、時々/dev/urandom暗号化品質のランダムデータを提供することを嬉しく思います。

FreeBSDの主張は正しいです。 FreeBSDでは/dev/random(または/dev/urandom同じです)、エントロピーが十分でない場合はブロックし、エントロピーが十分であれば、ランダムなデータを引き出し続けます。 Linuxでは、どちらもあまり役に立ちませ/dev/random/dev/urandom

実際に/dev/urandom使用してシステムを構成するときは、エントロピープール(ディスク、ネットワークとマウスのアクティビティ、ハードウェアソース、外部システムなど)を提供していることを確認してください。

読み取ったバイト数を読み取ろうとしますが、/dev/urandomこれは完全に意味がありません。読み取りは/dev/urandomエントロピープールを使い果たしません。各消費者は、指定された時間単位にゼロビットのエントロピーを使用します。

答え2

自動化されていませんが、straceなどのツールを使用して、urandomに関連するファイル記述子の読み取りを監視できます。次に、読み出し速度を得るために、特定の期間に読み出されたデータの量を確認する。

答え3

Linuxでどのプロセスがentropy_availableを消費できるかわからないか疑われる場合は、問題を解決する方法がいくつかあります。

前述のように、straceを使用できます。これは、見たいプロセスに関する洞察を得るのに役立ちます。

auditdを使用して監査できるプロセスは何ですか?開いている/dev/random または /dev/urandom ですが、これは読み取ったデータの量を知らせません (ロギングの問題を防ぐため)。以下は、ルールをリストし、2つのクロックを追加するいくつかのコマンドです。

auditctl -l
auditctl -w /dev/random
auditctl -w /dev/urandom
auditctl -l

ボックスにSSHと入力します(またはddなどの他の操作を実行すると、/ dev / urandomまたは同様の結果が開きます)。

ausearch -ts最近のaureport -f |

私の場合は、次の内容が表示されます。

[root@metrics-d02 vagrant]# ausearch -ts recent | aureport -f

File Report
===============================================
# date time file syscall success exe auid event
===============================================
1. 07/01/20 01:13:36 /dev/urandom 2 yes /usr/bin/dd 1000 6383
2. 07/01/20 01:16:43 /dev/urandom 2 yes /usr/sbin/sshd -1 6389
3. 07/01/20 01:16:43 /dev/urandom 2 yes /usr/sbin/sshd -1 6388
4. 07/01/20 01:16:43 /dev/urandom 2 yes /usr/sbin/sshd -1 6390
5. 07/01/20 01:16:44 /dev/urandom 2 yes /usr/sbin/sshd 1000 6408

この時計を無効にしてください

auditctl -W /dev/random
auditctl -W /dev/urandom

これは、読み取り/書き込み以外のシステムコールに関するデータのみをキャプチャするため、開いている項目がある場合は読み取っているものが表示されないことに注意してください。

しかし、Prometheusとnode_exporterを使用してVM(エントロピーを収集するエントリがないCentOS 7)では、entropy_availableがほぼ200に上昇し、ゼロに急落すると報告する歯パターンがまだ表示されることを確認しました。

lsof(または必要に応じてFuser)は何を提供しますか?

[root@metrics-d02 vagrant]# lsof /dev/random /dev/urandom
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
chronyd 2184 chrony    3r   CHR    1,9      0t0 5339 /dev/urandom
tuned   2525   root    5r   CHR    1,9      0t0 5339 /dev/urandom

文字デバイスのメイン番号とマイナー番号をメモして、別の方法でテストしてください。 (助けになるかどうかはわかりませんが、このVMで実行されていないDockerのようなものを検討してください。)

[root@metrics-d02 vagrant]# ls -l /dev/*random
crw-rw-rw-. 1 root root 1, 8 Dec 19 01:24 /dev/random
crw-rw-rw-. 1 root root 1, 9 Dec 19 01:24 /dev/urandom

[root@metrics-d02 vagrant]# lsof | grep '1,[89]'
chronyd    2184           chrony    3r      CHR                1,9      0t0       5339 /dev/urandom
tuned      2525             root    5r      CHR                1,9      0t0       5339 /dev/urandom
gmain      2525  2714       root    5r      CHR                1,9      0t0       5339 /dev/urandom
tuned      2525  2715       root    5r      CHR                1,9      0t0       5339 /dev/urandom
tuned      2525  2717       root    5r      CHR                1,9      0t0       5339 /dev/urandom
tuned      2525  2754       root    5r      CHR                1,9      0t0       5339 /dev/urandom

いいですね。 chronydとtunedという2つのプロセスがあります。 straceを使ってみましょう。 lsofは、chronyがファイル記述子3を使用して読み取るために/ dev / urandomを開いたことを伝えます。

[root@metrics-d02 vagrant]# strace -p 2184 -f
strace: Process 2184 attached
select(6, [1 2 5], NULL, NULL, {98, 516224}
.... (I'm waiting)

したがって、chronydはいくつかのアクティビティを待っており、このシステムコールの開始タイムアウトは98秒です。

待っている間、システムでの私の活動は、利用可能な任意のビットに対するカーネルの推定値を増やすことができることを強調する必要があります。 (entropy_available)...だから快適に座ってPrometheusチャートを見てください...

説明とともに、経時的なnode_entropy_available_bitsを示すPrometheusチャート

tunedで繰り返すこともできます...(今回はファイル記述子5のタイムスタンプとgrepフィルタを追加します(読み取りなどの呼び出しはこれを最初の引数として使用します)。

[root@metrics-d02 vagrant]# strace -p 2525 -f -tt -T 2>&1 | grep '(5,'

Red Hat には、これについて詳しく説明するブログがあります。CSPRNG(暗号的に安全な擬似乱数ジェネレータ)。プロセスが乱数にアクセスできるいくつかの異なる方法について説明します。

  • getrandom() システムコール <-- RHEL7.4+ に推奨され、高品質でエントロピープールが初期化された後の非ブロックです。
  • /dev/random <-- 簡単にブロックできる
  • プールが開始される前に/dev/urandom <--を使用すると問題が発生します。 「絶対にブロックしない」は、ほとんどのアプリケーションで使用する必要があります。
  • AT_RANDOM <-- 実行時に 16 個のランダムバイトを 1 回設定します。

AT_RANDOM は役に立ちませんが、すべてのプロセスに存在するため、プロセスを開始する行為だけで少しコストがかかります。

これで、lsofを使用して上記に示すだけでは十分ではなく、getrandom()の使用を明らかにしないことがわかります。しかし、getrandom()はシステムコールであるため、auditctlを使用してその目的を公開できる必要があります。

[root@metrics-d02 vagrant]# auditctl -a exit,always -F arch=b64 -S getrandom
[root@metrics-d02 vagrant]# auditctl -l
-a always,exit -F arch=b64 -S getrandom
[root@metrics-d02 vagrant]# tail -F -n0 /var/log/audit/audit.log 
... (now we wait)

私は退屈して箱にSSHでアクセスし、興味深くて素晴らしいものをたくさん見ましたが、getrandom()はありませんでした。以前は/dev/urandom APIを使用したことを見たことがあるので、驚くことはありません。

したがって、グラフの低下を説明しようとすると、/ dev / * randomが開かれておらず、それを開くことも現在使用中ではなく、getrandom()を呼び出すこともないようです...データを使用できる他のものはありますか? [プールの背部/開発者/ランダム]からか。カーネルはどうですか? ASLR(Address Space Layout Randomization)などの機能を検討してください。

https://access.redhat.com/solutions/44460 [購読が必要]

[root@metrics-d02 vagrant]# cat /proc/sys/kernel/randomize_va_space 
2

ここで「2」は、mmapやスタックなどがロードされる位置をランダム化するほか、ヒープランダム化も有効にするという意味です。オフにしたらどうなりますか?

[root@metrics-d02 vagrant]# echo 0 > /proc/sys/kernel/randomize_va_space
[root@metrics-d02 vagrant]# cat /proc/sys/kernel/randomize_va_space 
0

(答え:同じです。おそらく他の人がこれについてもっと明らかにすることができます。)

カーネルはAT_RANDOMが設定されている場所にもあります。以下は簡単な例です。 strace を使用して、/dev/*random または getrandom() を呼び出さないことを観察できます。

[vagrant@metrics-d02 ~]$ cat at_random.c 
#include <stdio.h>
#include <stdint.h>
#include <sys/auxv.h>

#define AT_RANDOM_LEN 16

int main(int argc, char *argv[])
{
    uintptr_t at_random;
    int i;

    at_random = getauxval(AT_RANDOM);

    for (i=0; i<AT_RANDOM_LEN; i++) {
        printf("%02x", ((uint8_t *)at_random)[i]);
    }
    printf("\n");

    /* show that it's a one-time thing */

    for (i=0; i<AT_RANDOM_LEN; i++) {
        printf("%02x", ((uint8_t *)at_random)[i]);
    }
    printf("\n");
}
[vagrant@metrics-d02 ~]$ make at_random
cc     at_random.c   -o at_random
[vagrant@metrics-d02 ~]$ ./at_random 
255f8d5711b9aecf9b5724aa53bc968b
255f8d5711b9aecf9b5724aa53bc968b
[vagrant@metrics-d02 ~]$ ./at_random 
ef4b25faf9f435b3a879a17d0f5c1a62
ef4b25faf9f435b3a879a17d0f5c1a62

これが役に立つことを願っています。

私は実際にJavaワークロードに最初に焦点を当てています。これは通常、Javaワークロードが私が最も困難な部分であるためです。バラよりhttps://blogs.oracle.com/luzmestre/why-does-my-weblogic-server-takes-a-long-time-to-start例えば。

関連情報