web-dev-qa-db-ja.com

/ dev / randomをUbuntu仮想マシンで動作させるにはどうすればよいですか?

どうやら、/ dev/randomはハードウェア割り込みまたは物理ハードウェアの同様の予測不可能な側面に基づいています。仮想マシンには物理ハードウェアがないため、cat /dev/random仮想マシン内では何も生成されません。私はUbuntuサーバー11.04をホ​​ストおよびゲストとして、libvirt/KVMと共に使用しています。

VM内にKerberosを設定する必要がありますが、krb5_newrealmシステムが生成していないため、「ランダムデータのロード」が永久にハングします。

誰かがこれを回避する方法を知っていますか?ホストの/ dev/random(とてもおしゃべりです)をvmに渡して、vmがランダムデータを使用できるようにすることは可能ですか?

いくつかの代替ソフトウェアがあることを読みましたが、それらは十分にランダムではないため、暗号学には適していません。

編集:vmのcat/dev/randomは非常にゆっくりと出力を生成するようです。 「ランダムデータの読み込み」が行われている間、約2時間待機して領域を設定しました。結局、それは継続するのに十分になりました。私はまだこれを加速する方法に興味があります。

19
Nick

「うまくいく」はずです。 vmには専用の物理ハードウェアはありませんが、ランダム性の非常に優れたいくつかのソースにアクセスできます。たとえば、CPUのTSCを使用して、仮想ディスクからの読み取りの時間を計ることができます。これにより、最終的にタイミング物理ディスクが10億分の1秒に巻き上げられます。これらのタイミングは、予測できないハードドライブの乱気流せん断に依存します。

同様のロジックがネットワークトラフィックに適用されます。インターフェースが仮想化されていても、パケットが物理ネットワークから発信されている(そしてボックスにローカルではない、たとえば別のvmから発信されている)限り、パケットタイミングはネットワークカード上の水晶発振器間の位相オフセットに依存しますTSCを駆動する水晶発振器。これは、2つの水晶の微視的なゾーンの温度変化に依存します。これも予測できません。

何らかの理由で機能しない場合、最も簡単な解決策は、エントロピーをマイニングしてシステムプールに追加するプログラムを作成することです。ネットワークインターフェイスは、最も信頼できるソースです。たとえば、次のようなコードを記述できます。

1)TSCに問い合わせます。

2)同じ物理マシン上にないことがわかっているサーバーにDNSクエリを発行します。

3)クエリが完了したら、TSCをクエリします。

4)これを数回繰り返し、すべてのTSC値を累積します。

5)蓄積されたTSC関数に対して安全なハッシュを実行します。

6)セキュアハッシュ関数の出力をシステムのエントロピープールに渡します。

7)エントロピープールレベルを監視し、それが低くなるまで待ちます。その場合は、手順1に戻ります。

Linuxには、プールにエントロピーを追加したり、プールのレベルを確認したりするための単純なIOCTL呼び出しがあります。おそらくrngdがあります。これは、パイプからエントロピーを取得してシステムプールに供給することができます。 TSCであろうと、独自のエントロピーソースからの「wget」リクエストであろうと、任意のソースからパイプを埋めることができます。

10
David Schwartz

私は、暗号化操作(TLSハンドシェイク、ケルベロスなど)を実行するすべてのヘッドレスサーバーでhasgedを使用しています。ほとんどのUbuntuバージョンのパッケージリポジトリにあるはずです。 http://packages.ubuntu.com/search?keywords=haveged&searchon=names&suite=all&section=all

havegedはHAVAGEアルゴリズムを使用して、最新のプロセッサーの内部状態からエントロピーを抽出します。これは詳細な説明です: http://www.irisa.fr/caps/projects/hipsor/

生成されたエントロピーのランダム性は、entパッケージで確認できます。私のシステムでは、老人から生成されたエントロピーは、entによるすべてのランダム性テストに合格しました

10
Frank L

ええ、あなたはそれをシードすることができます:

http://manpages.ubuntu.com/manpages/jaunty/man4/random.4.html

それを/ dev/urandomに入れるだけで、エントロピープールがシードされます。私はこれを確認することができました:

root@mx01-ewr:/proc/sys/kernel/random# cat entropy_avail 
128
root@mx01-ewr:/proc/sys/kernel/random# cat /dev/xvda >/dev/urandom  &
[1] 16187 # just using this as a source of data, you could do ssh hostIP 'cat /dev/random' >... etc
root@mx01-ewr:/proc/sys/kernel/random# cat entropy_avail 
1221
root@mx01-ewr:/proc/sys/kernel/random# cat entropy_avail 
1398

Sshコマンドにルーターを経由させると、エントロピーが生成されます* :)

7
polynomial

これは私のために働いた

VM内でkrb5_newrealmを実行すると、(「Loading random data」メッセージが表示された後)完了するまでに時間がかかる場合があります。次のハックを使用すると、処理を少し高速化できます。

$ Sudo aptitude install rng-tools -y
$ Sudo rngd -r /dev/urandom -o /dev/random  # don't do this in production!

http://fossies.org/linux/john/doc/Kerberos-Auditing-HOWTO.md に投稿

5
Vivek

X86の答えは、あなたのVMがRdRandまたはRdSeedをトラップしないことを確認することです。あなたはVMを信頼しますが、これはその1つです。

ポストSnady Bridge CPUで十分に新しいRNGdは、RdRandまたはRdSeedを使用し(または指示することができます)、トラップされていないRdRandまたはRdSeedがVMにエントロピーを取得します。/dev/randomは、エントロピーの実際の(仮想ではない)ソースを処理します。

これは偶然ではありません。これは、Intelアーキテクチャのドキュメントにあります。

デバイスベースのハードウェアエントロピーソース(IEがカーネルドライバーを使用してそれを共有する)の場合、VMが物理ソースを正しく仮想化するために必要です。これを行うかどうか、そしてそうする場合、どのデバイス。

RNGdに以下のdrngオプションがない場合は、更新してください。ハードウェアに高速ハードウェアRNGがない場合は、運命にあるので、セキュリティの目的で別のハードウェアを使用することを検討してください。

# rngd --help
Usage: rngd [OPTION...]
Check and feed random data from hardware device to kernel entropy pool.

  -b, --background           Become a daemon (default)
  **-d, --no-drng=1|0          Do not use drng as a source of random number input**
                             (default: 0)
  -f, --foreground           Do not fork and become a daemon
  -n, --no-tpm=1|0           Do not use tpm as a source of random number input
                             (default: 0)
  -o, --random-device=file   Kernel device used for random number output
                             (default: /dev/random)
  -p, --pid-file=file        File used for recording daemon PID, and multiple
                             exclusion (default: /var/run/rngd.pid)
  -q, --quiet                Suppress error messages
  -r, --rng-device=file      Kernel device used for random number input
                             (default: /dev/hwrng)
  -s, --random-step=nnn      Number of bytes written to random-device at a time
                             (default: 64)
  -v, --verbose              Report available entropy sources
  -W, --fill-watermark=n     Do not stop feeding entropy to random-device until
                             at least n bits of entropy are available in the
                             pool (default: 2048), 0 <= n <= 4096
 -?, --help                 Give this help list
  --usage                Give a short usage message
  -V, --version              Print program version

Mandatory or optional arguments to long options are also mandatory or optional
for any corresponding short options.

Report bugs to Jeff Garzik <[email protected]>.
1
David Johnston

また、krb5_newrealmのハングにも問題がありました。上記の答えに基づいて、これは私にとってうまくいきました:

cat /dev/sda > /dev/urandom

ランダムデータの必要性が完了したら、それを強制終了することができます。/dev/sdaにはおそらく必要以上のデータがあります。

注:この方法で生成されたランダムデータが実際にどれほどランダムかはわかりません。

0
mgwilliams