kazmax - Linux で自宅サーバー

random - スペシャルファイル (デバイス)の説明 - Linux コマンド集 一覧表

  1. 名前
  2. 説明
  3. 設定
  4. PROC インタフェース
  5. ファイル
  6. 著者
  7. 関連項目
  8. 翻訳者

名前

random, urandom - カーネル乱数ソースデバイス

説明

(Linux 1.3.30 から提供されている) /dev/random/dev/urandom キャラクタスペシャルファイルは カーネル乱数ジェネレータへのインタフェースを提供する。 /dev/random ファイルはメジャーデバイスナンバー 1 マイナーデバイス番号 8 である。 /dev/urandom はメジャーデバイスナンバー 1 マイナーデバイスナンバー 9 である。

乱数ジェネレータはデバイスドライバやその他の源からの環境ノイズを エントロピー・プールへ集める。 また、ジェネレータはエントロピー・プール内のノイズビットの数の見積りを 保存する。 このエントロピー・プールから乱数が生成される。

読み込みが行われると、 /dev/random デバイスはエントロピー・プールのノイズビットの数の評価値から、ランダム バイトのみを返す。 /dev/random はワンタイムパッド (one-time pad) や鍵の生成のような 非常に高い品質を持った無作為性が必要になる場合に適切であろう。 エントロピー・プールが空の時は、/dev/random からの読み出しは、 更なる環境ノイズが得られるまで、ブロックされる。

/dev/urandom デバイスから読み出しでは、 エントロピーがより高くなるのを待つためのブロックは行われない。 その結果、もしエントロピー・プールに十分なエントロピーが存在しない場合、 返り値はこのドライバで使われているアルゴリズムに基づく暗号攻撃に対して、 論理的には弱くなることになる。 この攻撃をどのように行うかという事については、現在研究論文などの 形で入手できる資料はない、しかし、そのような攻撃は論理的に存在可能である。 もし、この事が心配なら、(/dev/urandom ではなく) /dev/random を利用すればいい。

設定

システムにあらかじめ作成された /dev/random/dev/urandom が存在しないなら、次のようなコマンドで作成できる。

        mknod -m 644 /dev/random c 1 8
        mknod -m 644 /dev/urandom c 1 9
        chown root:root /dev/random /dev/urandom

オペレータの操作なしに Linux システムが起動した直後は、 エントロピー・プールは意外性の乏しい均一な状態にあるだろう。 これにより、エントロピー・プールの実際のノイズ量は評価値より少なくなる。 この効果を打ち消すために、シャットダウンから (次の) 起動時まで持ち越した エントロピー・プールの情報が助けになる。 エントロピー・プールを持ち越すためには、 Linux システムの起動時に実行される適切なスクリプトに、 以下の行を追加すればよい:
	echo "Initializing random number generator..."
	random_seed=/var/run/random-seed
	# 乱数種を今回のスタートアップから次回のスタートアップまで持ち越す。
	# ロードを行い、その後、全てのエントロピー・プールを保存する。
	if [ -f $random_seed ]; then
	    cat $random_seed >/dev/urandom
	else
	    touch $random_seed
	fi
	chmod 600 $random_seed
	poolfile=/proc/sys/kernel/random/poolsize
	[ -r $poolfile ] && bytes=`cat $poolfile` || bytes=512
	dd if=/dev/urandom of=$random_seed count=1 bs=$bytes

また、Linux システムのシャットダウン時に実行される適切なスクリプトに、 以下の行を追加すればよい:
	# 乱数種を今回のシャットダウンから次回のスタートアップまで持ち越す。
	# 全てのエントロピー・プールを保存する。
	echo "Saving random seed..."
	random_seed=/var/run/random-seed
	touch $random_seed
	chmod 600 $random_seed
	poolfile=/proc/sys/kernel/random/poolsize
	[ -r $poolfile ] && bytes=`cat $poolfile` || bytes=512
	dd if=/dev/urandom of=$random_seed count=1 bs=$bytes

PROC インタフェース

ディレクトリ /proc/sys/kernel/random にあるファイル (2.3.16 から存在する) は、 /dev/random デバイスへのその他のインタフェースを提供する。

読み込み専用のファイル entropy_avail は使用可能なエントロピーを表す。 通常、これは 4096 (ビット) になり、エントロピー・プールが満杯の状態である。

ファイル poolsize はエントロピー・プールのサイズを表す。 通常、これは 512 (バイト) になる。 この値はアルゴリズムで使用可能な任意の値に変更することができる。 現在の選択肢は 32, 64, 128, 256, 512, 1024, 2048 である。

ファイル read_wakeup_threshold/dev/random からのエントロピーを待って休止しているプロセスを起こすのに必要な エントロピーのビット数を保持している。 デフォルトは 64 である。 ファイル write_wakeup_threshold はエントロピーのビット数を保持しており、この値以下になったら /dev/random への書き込みアクセスのために select ()または poll ()を実行するプロセスを起こす。 この値はファイルに書き込みを行うことによって変更できる。

読み込み専用のファイル uuidboot_id は 6fd5a44b-35f4-4ad4-a9b9-6b9be13e1fe9 のような ランダムな文字列を保持している。 前者は読み込みの度に新たに生成され、 後者は 1 度だけ生成される。

ファイル

/dev/random
/dev/urandom

著者

カーネル・ランダムナンバー・ジェネレータは Theodora Ts'o (tytso@athena.mit.edu) によって書かれた。

関連項目

mknod (1)
RFC1750, "Randomness Recommendations for Security"

翻訳者

石川 睦 <ishikawa@linux.or.jp>