web-dev-qa-db-ja.com

Linuxカーネルエントロピー-/ dev / urandomに関係ありますか?また、最小値は何ですか?

この質問は何度か尋ねられましたが、それでも他の回答から何かが明確に理解されていません

カスタムビルドのLinuxカーネル(最小限のドライバーモジュールなど)で実行しているサーバーがいくつかあり、ディスクが接続されていません(すべてNASベース)。カーネル_entropy_avail_は180-200にすることができます私のアプリケーションは_/dev/urandom_(a Javaを使用するアプリケーション SecureRandom() 内部的に_/dev/urandom_)を使用します

  • このニース writeup から、_/dev/urandom_ランダムストリームは、インストール時に生成されたシードファイル(およびブート時の後での再シード)にほとんど依存しているようです。 _entropy_avail_の数値が_/dev/urandom_で生成される乱数に影響を与えないことを意味しますか?質問は、_/dev/urandom_乱数は、利用可能なエントロピーに何らかの方法で依存していますか?
  • はいの場合、システムで利用可能なエントロピーの許容下限は何ですか? (200、256?そこに引用されているたくさんあります。)
  • いいえの場合は、manページを引用します。

    / dev/urandomデバイスからの読み取りは、エントロピーの待機をブロックしません。十分なエントロピーがない場合は、疑似乱数ジェネレータを使用して、要求されたバイトを作成します。

  • _entropy_avail_の重要性。マニュアルページから、完全なエントロピープールサイズは4096bitsであることがわかります。これは、結果に2 ^ 4096の可能性があることを意味します。したがって、_entropy_avail_が140の場合、それは2 ^ 140に縮小されることを意味しますか?それでも膨大な数だと思いますが、どの時点から心配する必要がありますか?
  • 私の場合、ご覧のとおり、_entropy_avail_は通常のデスクトップシステムで観察される値よりもおそらく低くなります。ソフトウェアエントロピー生成ツール(haveged、rngdなど)または特定のハードウェアを検討して、それを改善する必要がありますか?それは本当に_/dev/urandom_の出力に影響しますか?
9
user3461411

エントロピーは次の意味で必要です:PRNGにnビットのエントロピーしかない場合、これは(概念的に)2しかないことを意味しますn 内部状態の可能性があるため、これらの2つの残酷な列挙によって破壊される可能性があります。nnがこのようなブルー​​トフォース攻撃を実行可能にするのに十分な低さである場合、.

カーネルが報告する「エントロピーレベル」はエントロピーではないため、状況は複雑になります。上記の話ではありません。

暗号化の観点から/dev/random/dev/urandomの両方の出力を計算するアルゴリズムは、(おそらく)- 暗号的に安全なPRNG 。実際のセキュリティにとって重要なのは、実際、内部状態の蓄積されたエントロピーです。そのPRNG(現時点では不明)の暗号化の弱点を除けば、エントロピーは時間の経過とともに増加するか、一定のままでしかありません。実際、「エントロピー」は「攻撃者が知らないもの」と呼ぶこともでき、PRNGが実際に暗号的に安全である場合、定義上、出力のギガバイトを監視すると、内部では無視できる情報しか得られません。状態。それが暗号的に安全の意味です。

したがって、/dev/urandomに最後のブート以降のある時点で200ビットのエントロピーがあった場合、stillには200ビット以上のエントロピーがあります。

そのコード(および恐ろしい対応するmanページ)を書いた人の観点から、エントロピーは使用時に「枯渇」します。これは、議論のために、PRNGがnot暗号的に安全であると想定し、実際には、内部状態をです。その観点からすると、/dev/randomnビットのエントロピーで始まり、kビットを出力する場合、nkビットになります。エントロピーの。

ただし、この観点は、PRNGが完全に壊れていて操作がないという仮定に基づいているので、最終的にはテナブルではありませんが、alsoに基づいています。同時に、PRNGは「ハードウェアエントロピー」(ややランダムであると想定されるデータ要素のソース)をビットの適切なシーケンスに変換するのに十分な暗号学的に安全であるという前提に基づいています。要するに、エントロピー枯渇の概念は、PRNGが完全に弱いという極端な仮定を採用している場合にのみ機能しますが、この仮定の下では、エントロピーの推定値本当に =完全にオフです。

本質的に、その視点は自己矛盾しています。残念ながら、/dev/randomはこの欠陥のあるエントロピー推定に依存するブロッキング戦略を実装していますが、これは非常に不便です。

/dev/urandomは、最後の起動以降に収集された「ハードウェアエントロピー」の量に関係なく、ブロックすることはありません。ただし、「通常の」Linuxインストールでは、ランダムシードがブートプロセスの早い段階で挿入されます。そのシードは前回の起動時に保存され、挿入後すぐに更新されます。そのシードは、主に再起動時に/dev/urandomのエントロピーを拡張します。したがって、アサーションは次のようになります。/dev/urandomに200ビットのエントロピーがある場合OSが最初にインストールされてからの任意の時点の場合、200ビットのエントロピーがまだあります。

この動作は、一部の特定のケースでは、やや厄介な場合があります。ディスクレスブート。起動マシンは、ランダム性beforeにファイルへのアクセス権を必要とする場合があります(たとえば、上記のファイルを含むサーバーに到達するために必要な IPsec コンテキストを確立するため)。 /dev/urandomの適切な実装は、十分な量のハードウェアエントロピー(128ビットなど)が収集されるまでブロックしますが、何らかのエントロピー枯渇を実装せずにビットを「永久に」生成します。これはまさにFreeBSDの/dev/urandomが行うことです。そして、これは良いことです。


概要:心配しないでください。カーネルで使用されているPRNGが暗号的に安全であると思われる場合、「entropy_avail」の数は無意味です。カーネルで使用されているPRNGがnot暗号学的に安全である場合、 "entropy_avail"カウントはstillに欠陥があり、とにかく深刻な問題に直面しています。

VMスナップショットはエントロピーを壊すことに注意してください。これは、リストア後のVMの動作は常にスナップショットに保存された状態で機能し、新鮮なデータの蓄積によってのみ発散するためですハードウェアイベント(VMハードウェアは本当のハードウェアではないため、VMでは注意が必要です)。カーネルの "entropy_avail"カウンターと/dev/randomブロッキング動作は、何もないをそれに変更します。 VMスナップショット/復元は、「entropy_avail」がキャプチャしようとする(実際には失敗する)アカデミックで純粋に理論的なシナリオよりも、システムにとってはるかにもっともらしいセキュリティ脆弱性PRNGです。

17
Thomas Pornin