仮想化Linuxシステムでエントロピーが不足することは、一般的な問題のようです(例: / dev/random Extremely Slow? 、 Linuxを/ dev/randomにバッファリングする )。ハードウェア乱数ジェネレーター(HRNG)を使用しているにもかかわらず、 [〜#〜] haveged [〜#〜] のようなエントロピー収集デーモンの使用がしばしば推奨されます。ただし、エントロピー収集デーモン(EGD)はDockerコンテナー内で実行できません。ホストによって提供される必要があります。
EGDの使用は、Ubuntu、RHELなどのLinuxディストリビューションに基づいたdockerホストで正常に動作します。このようなデーモンをTiny Core Linux(TCL)に基づいたboot2docker内で動作させることは別の話のようです。 TCLには拡張メカニズムがありますが、エントロピー収集デーモンの拡張機能 利用できないようです 。
したがって、EGDは(実稼働)ホスティング環境でDockerコンテナを実行するための適切なソリューションのように見えますが、boot2dockerで開発/テストするためにそれを解決する方法はありますか?
Boot2dockerでEGDを実行するのは難しすぎると思われたため、/ dev/randomではなく/ dev/urandomを使用することを考えました。/dev/urandomの使用は安全性はそれほど高くありませんが、長期の暗号化キーを生成しないほとんどのアプリケーションでは問題ありません。少なくとも、boot2docker内での開発/テストには問題ありません。
ホストから/ dev/urandomを/ dev/randomとしてコンテナにマウントするだけで簡単であることに気付きました。
$ docker run -v /dev/urandom:/dev/random ...
結果は期待どおりです。
$ docker run --rm -it -v /dev/urandom:/dev/random ubuntu dd if=/dev/random of=/dev/null bs=1 count=1024
1024+0 records in
1024+0 records out
1024 bytes (1.0 kB) copied, 0.00223239 s, 459 kB/s
少なくとも、今は自分のboot2dockerイメージを構築する方法を知っています;-)
私が見つけた最もエレガントなソリューションは、別のコンテナでHavegedを実行することです。
docker pull harbur/haveged
docker run --privileged -d harbur/haveged
十分なエントロピーが利用可能かどうかを確認します。
$ cat /proc/sys/kernel/random/entropy_avail
2066
別のオプションは、rng-toolsパッケージをインストールし、/ dev/urandomを使用するようにマップすることです。
yum install rng-tools
rngd -r /dev/urandom
これにより、ドッカーコンテナにボリュームをマッピングする必要がなくなりました。
開発/テスト用にDockerコンテナを変更したくないので、boot2dockerイメージを変更しようとしました。幸いなことに、boot2dockerイメージはDockerでビルドされており、簡単に extended にできます。そこで、独自のDockerビルドをセットアップしました boot2docker-urandom 。標準のboot2dockerイメージを、 here が見つかったudevルールで拡張します。
独自のboot2docker.isoイメージの構築は次のように簡単です
$ docker run --rm mbonato/boot2docker-urandom > boot2docker.iso
Boot2dockerに付属している標準のboot2docker.isoを置き換えるには、次を行う必要があります。
$ boot2docker stop
$ boot2docker delete
$ mv boot2docker.iso ~/.boot2docker/
$ boot2docker init
$ boot2docker up
制限事項、Dockerコンテナ内から/ dev/randomはまだブロックします。最も可能性が高いのは、Dockerコンテナがホストの/ dev/randomを直接使用せず、対応するカーネルデバイスを使用するためです-依然としてブロックします。
Alpine Linux は、軽量のdocker
ホストに適した選択肢です。 Alpine LXC
&docker
画像は5MBのみです(boot2docker
)
haveged
のゲストには Alpine で、LXC
のゲストにはDebianでdocker
を使用します。コンテナにgpg
/ssh
キーとopenssl
証明書を生成するのに十分なエントロピーを与えます。 Alpineには公式のdocker
リポジトリがあります 。
または、Tiny Core用のhaveged
パッケージをビルドします- パッケージビルドシステム が利用可能です。
Java app(たとえばFROM Tomcat:Alpine
を作成))を実行する自己構築イメージから作成されたドッカーコンテナーにこの問題があり、ホストにアクセスできない場合(たとえば管理されたk8sクラスターで)、次のコマンドをdockerfileに追加して、SecureRandom
の非ブロッキングシードを使用できます。
RUN sed -i.bak \
-e "s/securerandom.source=file:\/dev\/random/securerandom.source=file:\/dev\/urandom/g" \
-e "s/securerandom.strongAlgorithms=NativePRNGBlocking/securerandom.strongAlgorithms=NativePRNG/g" \
$Java_HOME/lib/security/Java.security
2つの正規表現は、file:/dev/random
をfile:/dev/urandom
で置き換え、NativePRNGBlocking
をNativePRNG
で$Java_HOME/lib/security/Java.security
ファイルで置き換えます。これにより、Tomcatはvm上でかなり高速に起動します。 Alpineベース以外のopenjdkイメージでもこれが機能するかどうかは確認していませんが、sed
コマンドが失敗した場合は、コンテナー内のファイルJava.security
の場所を確認し、それに応じてパスを調整します。
note: jdk11では、パスが$Java_HOME/conf/security/Java.security
に変更されました