昨日の再起動以来、仮想サーバーの1つ(Debian Lenny、Xenで仮想化)は常にエントロピーを使い果たしており、SSH/TLS対応プロトコルを介して接続しようとするとタイムアウトなどが発生します。どのプロセスがすべてのエントロピーを使い果たしているかを確認する方法はありますか?
編集:
私が試したこと:
最終的に何が機能したか:
診断ユーティリティのソースとしてlsof
を使用すると、監査を使用して何かを設定できますか? /dev/random
を開かずにエントロピープールを使い果たす方法はありません。したがって、/dev/random
を開く処理を監査すると、犯人(または少なくともさらなる調査の候補のセット)はかなり急速に脱落するはずです。
通常、「十分な」エントロピーを必要とする公開サーバーの場合、エントロピーキー、Linuxエントロピープールにランダムビットを追加するハードウェアデバイス(USB)のようなものを提案します。しかし、あなたは外の世界と話をしません。
仮想マシンには、外部のランダム性の欠如という問題が発生する可能性があります。
あなたの発言「バックアップドメインコントローラー」は、エントロピーの使用の可能性を追加します:Windowsドメインは証明書で乱数を使用します。
おそらくlsof(開いているファイルのリスト)が役立つかもしれません。これは、現在どのプロセスがどのファイルを開いているかを示しています。あなたの場合、これは、エントロピーを排出するプロセスをキャッチした場合にのみ役立ちます。そのプロセスがハンドルを長時間開いたままにしない場合です。
$ lsof /dev/urandom
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
xfce4-ses 1787 to 15r CHR 1,9 0t0 8199 /dev/urandom
applet.py 1907 to 9r CHR 1,9 0t0 8199 /dev/urandom
scp-dbus- 5028 to 10r CHR 1,9 0t0 8199 /dev/urandom
firefox 6603 to 23r CHR 1,9 0t0 8199 /dev/urandom
thunderbi 12218 to 23r CHR 1,9 0t0 8199 /dev/urandom
私のワークステーションからのほんの一例。しかし、lsofを深く掘り下げることは役立つかもしれません。
より良い解決策がない場合は、大きな銃を持ち込み、open()syscallをグローバルにラップして、/ etc/[u] randomを開こうとするプロセスをログに記録することができます。
Just(tm)は、ログを記録するopen()を定義するlibを記述し、その後、元のlibc open()を呼び出します。
そのためのヒント:man ld.soおよび/ etc/ld.so.preload。
ここに似たようなものがあります: https://stackoverflow.com/questions/9614184/how-to-trace-per-file-io-operations-in-linux
警告:これを自分でやったことはありません。 everyopen()がライブラリを介して実行されるため、システムが破損する可能性があります。デバッグ環境で、またはR.M.ストールマン。