クラウドサーバーに対してHavegedを使用して追加のエントロピーを設定する方法
エントロピーとランダム性の簡単な紹介
Linuxの擬似乱数生成器(PRNG)は、ハードウェアの割り込み(キーボード、マウス、ディスク/ネットワークI/O)やその他のオペレーティングシステムのソースからランダムネスを生成する特別なデバイスです。このランダムネスは主にSSL/TLSのような暗号化に使用されますが、他にも多くの用途があります。仮想サイコロのペアを振るプログラムのような単純なものでも、良質なランダムネスのためにエントロピーに依存しています。
エントロピーのプールが干上がるとき
Linuxには2つの一般的な乱数生成デバイスがあります:/dev/randomと/dev/urandom。最も良い乱数は/dev/randomから得られます。これはブロッキングデバイスであり、出力を提供するために十分なエントロピーが利用可能になるまで待機します。エントロピーが十分であると仮定すると、/dev/urandomからも同じ品質の乱数が得られるはずですが、これはノンブロッキングデバイスであるため、エントロピープールが枯渇しても「ランダム」データを生成し続けます。これにより、以前のデータの繰り返しが非常に可能性が高くなるため、低品質のランダムデータが生成される可能性があります。特に、このサーバーが暗号機能を実行する場合、プロダクションサーバーで使用可能なエントロピーが少なくなった場合、さまざまな悪いことが起こる可能性があります。たとえば、次のデーモンを実行しているクラウドサーバーがあるとしましょう(すべてSSL/TLSまたはブロック暗号を使用):
- ウェブサーバー
- 受信/送信メールサーバー
- SSH/SFTP
これらのデーモンが、使用可能なエントロピーが尽きたときにランダム性を必要とする場合、さらなるエントロピーを待つために一時停止することがあり、これがアプリケーションに過剰な遅延を引き起こす可能性があります。さらに悪いことに、ほとんどの現代のアプリケーションは、プログラム初期化時に作成された独自の乱数シードを使用するか、ブロッキングを避けるために/dev/urandomを使用することになります。そのため、アプリケーションは低品質なランダムデータに悩まされることになります。これは、安全な通信の整合性に影響を与え、プライベートデータに対する暗号解析の可能性を高めることがあります。
エントロピープールを充填するためのユーザーランドソリューション
Linuxは上述のハードウェアソースから非常に良質なランダムデータを取得していますが、ヘッドレスマシンは通常キーボードやマウスがないため、生成されるエントロピーはずっと少なくなります。ディスクやネットワークI/Oはこれらのマシンのエントロピー生成源の大部分を占めており、これらは非常に少量のエントロピーを生成します。サーバーやクラウドサーバー/仮想マシンのようなヘッドレスマシンは、専用のハードウェアRNGソリューションが入手できることは非常に少ないため、「ハードディスク」よりも「ノイズの多い」デバイスからハードウェア割り込みを使用して追加のエントロピーを生成するためのいくつかのユーランドソリューションが存在します。残念ながら、これはサーバーにとって再び問題となります。なぜなら、サーバーは一般的にそれらを含まないからです。 havegedは、HAVEGE原則に基づいており、以前はその関連ライブラリに基づいて、プロセッサ上のコード実行時間の変動に基づいてランダム性を生成することを可能にします。同じハードウェアの同じ環境であっても、1つのコードが正確に同じ時間を実行することはほぼ不可能なので、単一または複数のプログラムを実行するタイミングはランダムソースのシードに適しているはずです。havegedの実装は、ループを繰り返し実行した後に、プロセッサのタイムスタンプカウンタ(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 defaultsRHEL/CentOS/Fedoraにhavegedをインストールする
RHEL/CentOS に haveged をインストールするには(Fedora ではこのステップをスキップします)、まず公式サイトの指示に従って EPEL リポジトリを追加する必要があります。
EPELリポジトリをインストールして有効にしたら(RHEL/CentOSで)、次のコマンドを実行してhavegedをインストールできます:
yum install havegedFedoraユーザーは、リポジトリの変更なしに上記のyumインストールコマンドを実行できます。デフォルトのオプションは通常問題ありませんので、起動時に自動で開始するように設定されていることを確認してください:
chkconfig haveged onソースからのインストール
プレパッケージされたバイナリが利用できないシステムでは、ソースタールボールからビルドする必要があります。これは実際には予想よりもずっと簡単です。まず、ダウンロードページに訪れ、最新のリリースタールボール(この記事を書いている時点での1.7a)を選択します。タールボールをダウンロードしたら、現在の作業ディレクトリに展開します:
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
再起動せずにデーモンを開始するために、同じコマンドを手動で(ルートとして)実行するか、Windows好きな人なら再起動してください。
エントロピーの可用性とランダムデータの品質のテスト
最小限のインストール/設定作業を行った後、あなたはすでにhavegedの動作するインストールを持っているはずで、あなたのシステムのエントロピープールは、生成されたランダム性から埋まってきているはずです。セキュリティは、他者やその効果の主張を盲目的に信頼するのであればセキュリティとは言えませんので、標準テストを使用してランダムデータをテストしてみませんか?このテストでは、rngtestで使用されるFIPS-140方式を使用します。これは、ほとんどすべての主要なLinuxディストリビューションでrng-toolsなどのさまざまなパッケージ名の下で利用可能です。
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_availhavegedのアイデアは、利用可能なビットが1024に近づいたときに、このプールを再び満たすことです。この数は変動しますが、非常に多くの乱数が必要でない限り(SSHキーの生成など)、1000を下回ることはないはずです。
