haku-maiのブログ

インフラエンジニアですが、アプリも作ります。

/dev/randomと/dev/urandomの違い

本記事で行うこと

  • /dev/randomと/dev/urandomの違いについて簡単に試す

モチベーション

  • /dev/randomを利用している本番処理があったが、ブロック待ちが発生してしまい障害になった。
  • /dev/randomを推奨されておらず、/dev/urandomを利用することが推奨されていることを知ったため、なぜ何かを確認する。

環境

  • CentOS7

調査

早速wikiの参照になるが、
/dev/random - Wikipedia

/dev/randomは真の乱数を発生させるためにデバイス入力とかのノイズを利用するけど、 エントロピープールにノイズが内場合、ブロックする仕様なんですね。なのでノイズ収集するまで待たされる。
その一方、/dev/urandomはブロック待ちがない。
というのを理解した。

真の乱数を発生させるためには、"機械的"ではだめで、外的要因が必要とのこと。
・/dev/randomは外的要因=デバイス入力 を要求し、
・/dev/urandomは機械的に乱数を計算する。
(同じことを2回言った気がするが気にしないこととする)

実際の世界では、
オンプレミスでも、クラウド利用でも基本的にVMを利用することが多く、今回の障害が発生したシステムはオンプレミスでリモート越しにアクセスする。
リモート越しにアクセスすると言うことは特にデバイス入力とかあまり発生しないイメージなので、ブロックが頻繁に起きそうじゃないか? と考え、/dev/randomの動作を手元のCentOS7で試してみると以下の結果となった。

mac上からterminalでssh → CentOS7(VMFusion) mac上のssh越しだと、新しく乱数を全然生成しない。
以下は意味不明な文字列だが乱数と理解してほしい。
この状態では以下の状態で固まった状態に見える。

# cat /dev/random
�^\
   �i��Z  >?���ݚ�K�M�E�ڛ�Mk�

・CentOS7(VMFusion)のConsoleでマウスを動かすと、新たに乱数を生成する。
上記の乱数から新たに乱数が増えていることがわかる。

# cat /dev/random
�^\
   �i��Z  >?���ݚ�K�M�E�ڛ�Mk���ES�8�g���>=z�rPomD:��:;
                                                     �8؆+

つまり我々が普段利用しているデータセンターにあるVMに対しては基本リモートで接続するため
/dev/randomを利用すると、ほぼブロックしてしまう。 誰かがデータセンタに駆けつけてコンソールアクセスしないと、ノイズ発生しないのでエントロピープールが空状態ということ。
真の乱数を使うことなんでないはずなので基本dev/randomは使わないほうが良さそう。