web-dev-qa-db-ja.com

/ dev / randomのエントロピーソースとしてファイルを追加します

私が持っているもの:大量の秘密の真のランダムバイトを含む大きなファイル(はい、私はそれらが単なる疑似ランダムではないと確信しています) 。それをFと呼びます。

やりたいこと:Linuxに、このファイルを/dev/randomのエントロピーソースとして使用できることを伝えます(各バイトは、完全な8ビットのエントロピー)

私がすでに知っていて、講義を受けたくない

  • /dev/urandom
  • システム内の他のデバイスからエントロピーを収集するための既存のツール

私が探しているもの:次のいずれかになるシェルコマンドまたはツールの名前(および関連する関数):

  • Fを/dev/randomに追加
  • /dev/randomにアクセスすると、Fからのバイトがデバイスのように消費され、再利用されません。

これは可能ですか?セキュリティへの影響は何ですか?

11
Clayton

まず第一に、あなたの質問に直接答えること:これは実行できません。意図的に許可されていません。

実際に/ dev/randomに書き込むと、入力がランダムプールに混合され、出力品質が向上する可能性があります。しかし、チートとなるため、entropy_countを更新せず、/ dev/randomを読み取り用にロック解除しません。それ以外の場合は、次のようなことができます。

cat /dev/urandom > /dev/random  # Sup dawg, I heard you like random pools...

あなたができることを除いて。ちょっと。

エントロピープールを更新し、それに応じてentropy_countをインクリメントする/ dev/randomで利用可能なRNDADDENTROPYと呼ばれるioctlがあります。アイデアは、ユーザー空間でハードウェアRNGから読み取り、独自のドライバーを作成せずにカーネルプールにダンプできるようにすることです。気の利いた。そして、誰もがエントロピーを/ dev/randomにダンプすることを許可されていますが(hurt)、rootだけがRNDADDENTROPYの使用を許可されています。

そして、はい、比較的簡単にこれを行うことができるツールがあります。これはrngdと呼ばれます。その主な目的は、/dev/hwrandomのようなRNGまたはプロセッサのRDRAND命令から読み取り、エントロピープールが低くなったら常に再シードすることです。しかし、入力には任意のファイル名が必要なため、そうすることもできます。

rngd -r /dev/urandom

これは、正直なところ、これを行うこととまったく同じです。

ln -sf /dev/urandom /dev/random

しかし、最初に述べたように、これは、このツールを使用してカーネルがファイルをエントロピーのソースとして使用できることを意味するわけではありません。そのビットは、少なくとも、許可されていません。 他のすべてと混合された追加のエントロピーのソースソースとして使用できますが、唯一のエントロピーのソース。

ファイルが最高級のランダム性であると確信している場合は、それを使用してください。カーネルのエントロピー推定システムを通してそれを注入する必要はありません。代わりに、TRNGを生成するためのメカニズムがある場合は、それをすべてのエントロピーソースとともにダンプします。 rngdを使用すると、非常に簡単になります。

実際にサーバーで/ dev/urandomを宗教的に回避することのまったくばかげたことについては、わざわざ説明することはしません。その講義を何度か聞いたことがあり、聞いないことを選択したからです。

しかし、他のすべての人にとって、/ dev/randomと/ dev/urandomの違いは、起動条件が正確に反復可能であり、ランダムプールがどこにあるかについて、ランダム性の合理的なソースがないデバイス(一部の組み込みデバイスなど)がない起動時にすぐに重要になりますブーツ間で保存されません。それ以外の場合はすべて、/ dev/urandomに対する理論的な攻撃には、文字通り存在せず、かつ存在することもない技術やテクノロジーが必要になります。

質問の文言から、/ dev/randomはTRNGの結果を出力するのに対し、/ dev/urandomはPRNGを使用しているように見えますこれは正確ではありません。出力の唯一の違いは、randomがランダムなイベントを観察するよりも高速にバイトを生成している場合、urandomは「ロックアップ」することです。それ以外の場合は、どちらもそれぞれのプールでまったく同じコードを実行します。どちらも、TRNGから生のビットを直接出力しません。どちらもランダムなイベントを使用して、PRNGを常に再シードします。

19
tylerl

あなたが言ったことをすべて考えれば、おそらく/ dev/randomからではなく、ファイルから直接読み取るべきです。/dev/randomがどのように機能するかをおそらく信用していないので(おそらく この論文 を読んでください)、宣言的になり、それに信頼を置かないでください。

誰もがエントロピープールに直接データを注入できるようにする方法はないはずです。それ以外の場合は、SSL/TLS鍵の生成を危険にさらす可能性のある攻撃経路となり、すべての悪意のある人がすでにそれを行っています。

前進を強く求める場合は、rng-toolsがエントロピープールにデータを挿入する方法を確認してください。ハードウェアRNGからの出力を統合するように設計されており、ハードウェアデバイスからではなくファイルから読み取るように変更できます。私の懸念は、ファイルから十分なデータを提供したとしても、/ dev/randomが他のソースから十分なエントロピーを得られない場合、ブロックされる可能性があることです。単一のソースからすべてのエントロピービットを取得することは想定されていないため、どれだけ速くそれらを供給しても、ブロックされる可能性があります。

実際のハードウェア乱数ジェネレーターを使用してファイルを作成している場合は、rng-toolsを使用して、ファイルシステムにコミットする中間ステップなしでエントロピープールに直接結合することを検討します。

このアプローチの良い点は、ファイルが乱数に影響を与えるリスクが軽減され(データが他のエントロピーのソースと混合される)、攻撃者がファイルをコピーして乱数を学習するリスクが軽減されることです(エントロピーの他のソースによる)。

3
John Deters

ほとんどのLinuxシステムでは、 / dev/random によって使用されるエントロピープールは ブート時に初期化されます を使用して/var/run/random-seedを使用します。このプロセスを省略した場合、同じディストリビューションのLinuxを使用する2つの同一のサーバーが同一のブートシーケンスを持つ可能性があるため、同一の/ dev/random状態になります。

これを防ぐために、シャットダウン時に/dev/randomエントロピープールの現在の値が/var/run/random-seedに保存され、起動時に復元されます。みんなのエントロピープールを少し違うものにするのは素晴らしい設計です。

0
rook

カーネルのエントロピーカウンターを増やすには、RNDADDENTROPY ioctlが必要です。

これを呼び出す最も簡単な方法は、rng-toolsパッケージのrngdデーモンを使用することです。

rngd -r /path/to/F

(注:rngdは、これがハードウェアデバイスであると想定していたため、ファイルの最後に到達すると、エントロピーソースが機能していないというメッセージが表示されます。)

0
CL.