新タイプの蛇口を作っていてデータの暗号化をするときに、なかなかおわらないことがあり調べていったところ、仮想マシン上でエントロピー(質のいいランダムな値を作るために必要な値)がとても少ない状態であったことがわかりました。
環境:guest : ubuntu 18.04LTS
host: ubuntu 16.04.LTS
CPU: Ryzen 2700
cat /proc/sys/kernel/random/entropy_avail
この結果が1000以下だと少ないようですが、使っていた仮想マシンのエントロピーはなんと1桁でした。少なすぎる。
/dev/randomを使うときにエントロピーが少ないと、エントロピーがたまるまで動作が止まってしまいます。
それでは使いものにならないのでどうするか探していたところ、まずハードウェアをいじるなら、AMDのRyzen PROを使えば、TPMというファームウェアに直結したランダムジェネレーターがある。ただしお金がかかる。お金を使わない方ではrng-toolsというソフトを使えばいいことがわかりました。
apt install rng-tools
これ、仮想マシンにもホストマシンにも入れましょう。
仮想マシンで実行してみたものの、このままでは使えませんでした。
KVMコマンドを使って起動しているので、起動時のパラメータに、
-device virtio-rng-pci
を追加して、無事に使えるようになりました。
しかし、ホストOSでもエントロピーが1000以下になることがあったため、ホストにもrng-toolsをインストールします。
参考資料
/dev/randomと/dev/urandomの違いを調べていたらhavegedというのを入れていた - 以下省略!
暗号技術のすべてという本にまとまっていました。(上記サイトを見たあとにふと気がついて読んでみたらわかりやすくまとまっていました)
これから先、暗号がらみのプログラムをする人は増えていくと思いますが、上記の1冊あれば、暗号化技術に対してかなりの程度の知識が入ってくると思うのでおすすめです。