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


19

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

VM内でKerberosをセットアップする必要がありますがkrb5_newrealm、システムが何も生成しないため、「ランダムデータのロード」が永遠にハングします。

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

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

編集:vm上のcat / dev / randomは、非常にゆっくりと出力を生成するようです。「ランダムなデータをロード中」に約2時間待機して、レルムをセットアップしました。結局、それは継続するのに十分になりました。私はまだこれを加速する方法に興味があります。

回答:


10

「正常に動作する」はずです。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」リクエストであるかにかかわらず、任意のソースからパイプを埋めることができます。


2番目の提案は理論的には興味深いように見えますが、プログラミングを伴わない解決策を望んでいました。usbドライブからホストへ、またはホストから大きなファイルをコピーすると、vmのエントロピープールに影響する(つまり、動作が速くなる)のだろうか?もしそうなら、ホスト上でマシンイメージのバックアップを実行中にレルムを作成しようとすることができます
ニック

1
いくつかのテストを実行して、エントロピープールを補充するものを確認できます。動作する何かを見つけたら、それを行うことができます。ネットワークトラフィックがそれを行う必要があります。ドライブアクティビティで実行する必要があります。このコマンドで何が機能するかをテストして確認できcat /proc/sys/kernel/random/entropy_availます。
デビッドシュワルツ

実行中の猫はエントロピーを「食べる」ことに注意してください(アドレス空間のランダム化)。を使用できますpython -c 'while True: import time; print str(time.sleep(1))[0:0] + open("/proc/sys/kernel/random/entropy_avail", "rb").read(),'。...読みにくいのですが、私はコメント欄に新しい行を入力する方法を参照していない葉、
Doncho Gunchev

10

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

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

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


また、確実にNISTテストスイートを実行する必要があります。
マイケルハンプトン

7

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

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コマンドをルーターに通すとボーナス* :)


私は中間部分について混乱しています。システムに「/ dev / xvda」がありません。sshを使用してホストの/ dev / randomをvmの/ dev / urandomにルーティングするのが目標ですか?「/ dev / urandom」に必要なものを送信できますが、「/ dev / random」から送信されますか?
ニック

「ssh 192.168.1.1 'cat / dev / random'」を使用してホストからランダムデータを取得できますが、ゲスト「/ dev / random」に影響を与える方法はわかりません。「ssh 192.168.1.1 'cat / dev / random'> / dev / urandom」は何もしないようです。
ニック

1つの端末で「cat / dev / random」を実行し、データの出力が停止するまで待機することでテストしました。次に、別の「cat somerandomfile> / dev / urandom」を実行し、「cat / dev / random」が再び出力を開始しました。/ dev / random入力を有効にするには、/ dev / urandomに大量のランダム入力が必要なようです。猫をやるとき... '// dev / urandomでは、/ dev / randomに出力がまったく表示されないと言っていますか?
多項式

最終的に出力が表示されますが、非常に遅いです。それが自然に生成されるもの以上のものであるかどうかはわかりません。VMで非常に低速で少量のランダムデータが生成されることを発見しました。領域を作成し、約2時間 "ランダムデータを収集"した後、領域を作成しました。
ニック

有益な回答のために+1。
ニック

5

これは私のために働いた

VM内でkrb5_newrealmを実行すると、完了するまでに時間がかかる場合があります(「ランダムデータの読み込み中」メッセージが表示された後)。次のハックを使用して、物事を少し速くすることができます。

$ 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に投稿


1

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 <jgarzik@pobox.com>.

0

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

cat /dev/sda > /dev/urandom

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

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


ポスターの名前を使用して、他の投稿を参照してください。「上」または「下」と言っても意味がありません。すべての投稿が同じ順序で表示されるわけではないからです。
ジョン・ガーデニアーズ

4
これは機能する可能性がありますが、/ dev / sdaには多くの非ランダムデータ(少なくとも0トン)が含まれているため、セキュリティの観点からはあまり良くありません。ゼロに加えて、それは実際には非常に予測可能なMBRで始まり、少なくとも3バイトを推測できます...または起動しません;)
ドンチョグンチェフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.