2015年5月30日土曜日

Gnupg 鍵作成とかのためにエントロピーを増加させる

Gnupg 鍵を作成する場合によく以下のメッセージが出てエントロピーが貯まるまで待たされます。

$ gpg --gen-key
... snip ...
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy! (Need 241 more bytes)

メッセージに従ってキーボードのキーを一生懸命に打ったりするのですが、効いているかどうかいまいちわからないので調べてみました。

環境

Ubuntu 14.04 (Trusty Tahr) Server

まずは結論から。

  • キーボードのキーを打つとエントロピーを貯めることができました。
  • $ sudo bash -c 'while true; do date; find / > /dev/null; sleep 1; done' では、2回目以降のループでの find ではエントロピーは貯まりませんでした。
  • しかし、毎回の find の前にページキャッシュをクリアするとエントロピーを貯めることができました。

以下詳細です。


貯まっているエントロピー量の確認方法

以下のように確認できます。

$ cat /proc/sys/kernel/random/entropy_avail
783

キーボードのキーを打つとエントロピーが貯まることを確認

gpg --gen-key を実行していない状態でキーボードのキーをぐちゃぐちゃと打ってみました。

エントロピーの変化は以下のとおりです。

https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisR051yOlGi0ju-LtXc5JOP3iOeA0aEUu-2t9i8rO7toHUgPHqhgDqnVst1Td_YfYbwwMoNo3p_vtFeMp94xYxgzuVauUx6sCl1Rbv1ovCfQ1l1fK6tJpIWDuNdO1Kx-w1pJYLCAFH/s1600/typing.png
  • 12:33:15 タイピング開始
  • 12:36:15 タイピング終了

1分間隔で 150程度エントロピーが減るのがなぜなのかわかりませんが、とにかくキーボードのキーを打つとエントロピーが貯まるようです。


‘find /’ でエントロピーの変化を確認

ディスクアクセスがあるとエントロピーが増えるとのことなので、 $ sudo bash -c 'while true; do date; find / > /dev/null; sleep 1; done' を実行してみました。

エントロピーの変化は以下のとおりです。

https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0yWvAWuywBtKZZDILnWUU2XhWnMV6LnL1clUhNcccVBm4KQWk9JGVNxQgrP3MUenKN8nKocThobfpN-7ncvHdAeC2lzS13AP16aiHsrS0-sfjVYnyjkOmE-IaBREvZ9lPxsm575_8/s1600/finding.png
  • 12:33:55 コマンド開始
  • 12:34:19 1回目の find 終了 (以降、while ループで find を繰り返す)
  • 12:36:55 コマンド終了

while ループで find を実行しているのですが、1回目の find が 12:34:19 頃に終わりました。

1回目の find の間はエントロピーが増えているのですが、その次の find 以降は増えませんでした。

ファイル状態のキャッシュ等なんらかの要因で、2回目以降はディスクアクセスが無かったのではないかと思われます。


毎回 find の前にページキャッシュをクリアしてエントロピーの変化を確認

上で確認したように、 $ sudo bash -c 'while true; do date; find / > /dev/null; sleep 1; done' だと 2回目以降の find はページキャッシュのためにエントロピーを増やすことができなさそうなので、毎回の find の前にページキャッシュをクリアしてみます。

コマンド

sudo bash -c "
while true
do
    date
    sync
    echo 3 > /proc/sys/vm/drop_caches
    find / > /dev/null
    sleep 1
done
"
  • 毎回の find の前に sysncecho 3 > /proc/sys/vm/drop_caches を実行します。

エントロピーの変化は以下のとおりです。

https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzinKg6qddVKTrEATrntN3Q_2J-Unv4kFapvjqqGOQpi6J1E-nxrruGrr_AcGck4z8jzmuz0kjobUN2SLYbo-LgRPcaQ5CihG4iRIbP7DIs2GXk940MRdPebEW29X8aiaGhCBd-a8N/s1600/findig_and_cachedel.png
  • 12:33:25 コマンド開始
  • 12:36:25 コマンド終了

上のキーボードのキーを打つ場合と同様に1分間隔で 150程度エントロピーが減るのがなぜなのかわかりませんが、エントロピーをためることができました。


0 件のコメント:

コメントを投稿