web-dev-qa-db-ja.com

再起動/シャットダウン時にランダムシードを保存し、システムブート中に復元する

Debian(そして私は他のLinuxディストリビューションでもそうだと思います)には、initスクリプト/etc/init.d/urandomがあり、その機能は次のとおりです。

"Save and restore random seed between restarts"

私の場合、このファイルは/var/lib/urandom/random-seedに保存されています。

暗号化におけるランダムシードの全体的な仮定が秘密にされていることである場合、ランダムシードをディスク上のファイルに保存することはどの程度賢明かと思います。

そもそもなぜそうするのか。再起動の間にランダムシードを「保持」する必要がありますか?そうしないとどうなりますか?コンピューターは起動時にランダム性が0になりますか?

6
Martin Vegter

そもそもなぜそうするのか。再起動の間にランダムシードを「保持」する必要がありますか?そうしないとどうなりますか?コンピューターは起動時にランダム性が0になりますか?

これは、あなたが理解しているよりもはるかに深い質問であることがわかります。私は教科書を書かずにそれを正義にしようとします。

基本的に、コンピュータはランダムに吸います。真のランダムさ(別名エントロピー)がある場合は、それを維持することをお勧めします。

コンピューターにハードウェア乱数ジェネレーターがないと仮定します。 (最新のIntelチップには、ハードウェアのRNGを利用するrdrand命令がありますが、政治的な理由により、Linuxカーネルはそれを使用していません。)

起動時に、カーネルはどこから純粋なランダム性を取得しますか? Wikipedia によると:

Linuxカーネルは、キーボードのタイミング、マウスの動き、およびIDEのタイミングからエントロピーを生成し、特殊なファイル/ dev/randomおよび/ dev/urandomを通じて他のオペレーティングシステムプロセスでランダムな文字データを利用できるようにします。この機能は、Linuxバージョン1.3.30で導入されました。

したがって、マウス、キーボード、およびハードドライブのタイミングIOイベント。OSの起動中にエントロピーが必要であるとします(たとえば、最初の起動時にキーを生成する必要があるsshdを起動したとします)。 、まだマウスとキーボードのドライバーをロードしていないため、ブートサイクルの早い段階では、あまり多くのディスクIO呼び出し-地獄、ブートの十分早い段階で、カーネルはまだRAM= FSで実行されています。その後も、予測可能なIO回のSSDまたはフラッシュドライブを使用している可能性があります。

だからあなたの質問に戻ってください:

そうしないとどうなりますか?コンピューターは起動時にランダム性が0になりますか?

それが可能だ。


フラッシュメモリから起動するルーターなどの小さな組み込みLinuxデバイス(小さなホームデバイスと、インターネットに電力を供給する大きなデータセンターデバイスの両方)では、これは実際には深刻な問題です。

このトピックに関する素晴らしい記事については、2012年の論文を参照してください Mining Your Ps and Qs:Detection of Widespread Weak Keys in Network Devices =衝撃的な発見

[インターネット上]のTLS証明書の0.75%は、鍵の生成中にエントロピーが不十分であるため、鍵を共有します。

6
Mike Ounsworth

引用したShort-Descriptionの数行下の/etc/init.d/urandomは、機密性に関するいくつかの仮定を示しています。

## Assumption 1:  We assume [/var/lib/urandom/random-seed] is a file (or a symlink
## to a file) that resides on a non-volatile medium that persists
## across reboots.
## Case 1a: Ideally, it is readable and writeable.  Its is unshared,
## i.e. its contents are unique to this machine.  It is protected so
## that its contents are not known to attackers.
## Case 1b: Less than ideally, it is read-only.  Its contents are
## unique to this machine and not known to attackers.

シードがディスクに書き込まれるそのファイルの後半には、コメントがあります。

# see documentation in linux/drivers/char/random.c

これは読む価値があります が含まれます:

* When any operating system starts up, it will go through a sequence
* of actions that are fairly predictable by an adversary, especially
* if the start-up does not involve interaction with a human operator.
* This reduces the actual number of bits of unpredictability in the
* entropy pool below the value in entropy_count.  In order to
* counteract this effect, it helps to carry information in the
* entropy pool across shut-downs and start-ups.

... Even with
* complete knowledge of the start-up activities, predicting the state
* of the entropy pool requires knowledge of the previous history of
* the system.
5
user15392

再起動の間にエントロピーを保存することは、起動時のエントロピー不足に対する不完全な解決策です。なぜ不完全なのですか?第1に、保存されたエントロピーは発見可能であるため、潜在的な攻撃者がその保存されたシードを手に入れることができる場合、シードされたすべての乱数ジェネレーターを危険にさらす可能性があります。第2に、システムがバックアップまたは複数のVM=インスタンスが同じ保存されたシードで生成されたものから復元された場合、それらはすべて同じ保存されたエントロピーを再利用するためです。

それでも、このような災害は、システムで使用できる起動時エントロピーがないよりも望ましいです。

FIPSと他のほとんどすべての暗号およびinfosec関連の標準がこの慣行を禁止しているため、エントロピーを保存するように構成した場合、ソリューションは認証されません。

3
Kirill Sinitski