エントロピーとランダム性の簡単な紹介

Linux疑似乱数ジェネレーター(PRNG)は、ハードウェア割り込み(キーボード、マウス、ディスク/ネットワークI / O)およびその他のオペレーティングシステムソースからランダム性を生成する特別なデバイスです。 このランダム性は主にSSL/TLSのような暗号化に使用されますが、他にも多くの用途があります。 仮想サイコロのペアを振るプログラムのような単純なものでさえ、高品質のランダム性のためにエントロピーに依存しています。

エントロピープールが枯渇したとき

Linuxには、/ dev/randomと/dev/urandomの2つの一般的なランダムデバイスがあります。 最高のランダム性は/dev/ randomから得られます。これはブロッキングデバイスであり、出力を提供し続けるのに十分なエントロピーが利用可能になるまで待機します。 エントロピーが十分であると仮定すると、/ dev/urandomから同じ品質のランダム性が見られるはずです。 ただし、これは非ブロッキングデバイスであるため、エントロピープールが不足した場合でも、「ランダム」データを生成し続けます。 以前のデータが繰り返される可能性が非常に高いため、これによりランダムデータの品質が低下する可能性があります。 本番サーバーで使用可能なエントロピーが少なくなると、特にこのサーバーが暗号化機能を実行するときに、多くの悪いことが起こる可能性があります。 たとえば、次のデーモンを実行しているクラウドサーバーがあるとします(すべてSSL / TLSまたはブロック暗号を使用)。

  • Webサーバー
  • 着信/発信メールサーバー
  • SSH / SFTP

利用可能なすべてのエントロピーが使い果たされたときにこれらのデーモンのいずれかがランダム性を必要とする場合、それらはさらに待機するために一時停止する可能性があり、アプリケーションで過度の遅延を引き起こす可能性があります。 さらに悪いことに、最近のほとんどのアプリケーションは、プログラムの初期化時に作成された独自のランダムシードを使用するか、ブロックを回避するために/ dev / urandomを使用するため、アプリケーションは低品質のランダムデータに悩まされます。 これは、安全な通信の整合性に影響を与える可能性があり、個人データの暗号解読の可能性を高める可能性があります。

エントロピープールを作成するためのユーザーランドソリューション

Linuxは、前述のハードウェアソースからすでに非常に高品質のランダムデータを取得していますが、ヘッドレスマシンには通常、キーボードやマウスがないため、生成されるエントロピーははるかに少なくなります。 ディスクとネットワークのI/Oは、これらのマシンのエントロピー生成ソースの大部分を占めており、これらは非常にまばらな量のエントロピーを生成します。 サーバーやクラウドサーバー/仮想マシンなどのヘッドレスマシンで専用のハードウェアRNGソリューションを利用できるものはほとんどないため、ビデオカードなどのハードディスクよりも「ノイズの多い」デバイスからのハードウェア割り込みを使用して追加のエントロピーを生成するユーザーランドソリューションがいくつかあります。サウンドカードなど 残念ながら、サーバーには通常どちらも含まれていないため、これもサーバーの問題であることがわかります。 havegedと入力します。 HAVEGEの原則に基づいており、以前は関連するライブラリに基づいていたhavegedを使用すると、プロセッサでのコード実行時間の変動に基づいてランダム性を生成できます。 同じハードウェア上の同じ環境であっても、1つのコードの実行に同じ正確な時間をかけることはほぼ不可能であるため、単一または複数のプログラムを実行するタイミングは、ランダムなソースをシードするのに適している必要があります。 ハッジされた実装は、ループを繰り返し実行した後、プロセッサのタイムスタンプカウンター(TSC)の違いを使用して、システムのランダムソース(通常は/ dev / random)をシードします。 これにより、予測可能なデータが作成されるはずですが、この記事の下部にあるFIPSテストの結果を見て驚かれるかもしれません。

Debian/Ubuntuにhavegedをインストールする

次のコマンドを実行することで、DebianとUbuntuにhavegedを簡単にインストールできます。

# apt-get install haveged

このパッケージがデフォルトのリポジトリで利用できない場合は、ソースからコンパイルする必要があります(以下を参照)

パッケージをインストールしたら、/ etc / default / havegedにある構成ファイルを編集するだけで、次のオプションが設定されていることを確認できます(通常はすでにデフォルトのオプションです)。

DAEMON_ARGS="-w 1024"

最後に、起動時に起動するように構成されていることを確認してください。

# update-rc.d haveged defaults

RHEL / CentOS/Fedoraにhavegedをインストールする

havegedをRHEL/CentOSにインストールするには(Fedoraの場合はこの手順をスキップしてください)、最初に公式サイトの指示に従ってEPELリポジトリーを追加する必要があります。

EPELリポジトリ(RHEL / CentOS上)をインストールして有効にしたら、次のコマンドを実行してhavegedをインストールできます。

# yum install haveged

Fedoraユーザーは、リポジトリーを変更せずに上記のyuminstallコマンドを実行できます。 通常はデフォルトのオプションで問題ないため、起動時に開始するように構成されていることを確認してください。

# chkconfig haveged on

ソースからのインストール

havegedに使用できる事前にパッケージ化されたバイナリがないシステムでは、ソースtarballからビルドする必要があります。 これは実際には予想よりもはるかに簡単です。 まず、ダウンロードページにアクセスして、最新リリースのtarball(この記事の執筆時点では1.7a)を選択します。 tarballをダウンロードしたら、現在の作業ディレクトリに解凍します。

# tar zxvf /path/to/haveged-x.x.tar.gz

次に、コンパイルしてインストールします。

# cd /path/to/haveged-x.x
# ./configure
# make
# make install

デフォルトでは、これは/ usr / localのプレフィックスでインストールされるため、次のようなものを/etc/rc.local(またはシステムの同等のもの)に追加して、起動時に自動的に起動するようにする必要があります(必要に応じてパスを調整します) )::

# Autostart haveged
/usr/local/sbin/haveged -w 1024

同じコマンドを手動で(rootとして)実行して、再起動せずにデーモンを起動するか、Windowsの場合は再起動します。

エントロピーの可用性とランダムデータの品質のテスト

最小限のインストール/構成作業の後、havegedのインストールが機能するはずです。また、システムのエントロピープールは、生成されるランダム性からすでにいっぱいになっているはずです。 他の人とその有効性の主張を盲目的に信頼している場合、セキュリティはセキュリティではありません。標準のテストを使用してランダムデータをテストしてみませんか? このテストでは、rngtestで使用されるFIPS-140メソッドを使用します。これは、rng-toolsなどのさまざまなパッケージ名でほとんどまたはすべての主要なLinuxディストリビューションで利用できます。

# cat /dev/random | rngtest -c 1000

次のような出力が表示されます。

rngtest 2-unofficial-mt.14
Copyright (c) 2004 by Henrique de Moraes Holschuh
This is free software; see the source for copying conditions.  There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

rngtest: starting FIPS tests...
rngtest: bits received from input: 20000032
rngtest: FIPS 140-2 successes: 999
rngtest: FIPS 140-2 failures: 1
rngtest: FIPS 140-2(2001-10-10) Monobit: 0
rngtest: FIPS 140-2(2001-10-10) Poker: 0
rngtest: FIPS 140-2(2001-10-10) Runs: 1
rngtest: FIPS 140-2(2001-10-10) Long run: 0
rngtest: FIPS 140-2(2001-10-10) Continuous run: 0
rngtest: input channel speed: (min=1.139; avg=22.274; max=19073.486)Mibits/s
rngtest: FIPS tests speed: (min=19.827; avg=110.859; max=115.597)Mibits/s
rngtest: Program run time: 1028784 microseconds

乱数ジェネレーターではごくわずかな失敗が許容されますが、havegedを使用すると、998〜1000回の成功が頻繁に見られることが期待できます。

使用可能なエントロピーの量をテストするには、次のコマンドを実行できます。

# cat /proc/sys/kernel/random/entropy_avail

ヘイジドの考え方は、使用可能なビットが1024に近づくたびに、このプールを埋め戻すことです。 したがって、この数は変動しますが、実際に多くのランダム性(SSHキーの生成など)を要求しない限り、1000程度を下回ることはありません。