Provided by: manpages-ja_0.5.0.0.20180315+dfsg-1_all
名前
random, urandom - カーネル乱数ソースデバイス
書式
#include <linux/random.h> int ioctl(fd, RNDrequest, param);
説明
(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 からの読み出しは、 更なる環境ノイズが得られるまで、ブロック される。 open(2) が /dev/random に対して O_NONBLOCK フラグ付きで呼ばれると、 それ以降の read(2) は要求したバイト数のデータが利用可能になるまで停止しない。 その代わり、 利用可能な データが返される。 利用可能なバイトが全くない場合、 read(2) は -1 を返し、 errno に EAGAIN が設定される。 /dev/urandom デバイスから読み出しでは、 エントロピーがより高くなるのを待つためのブロックは 行われない。 十分なエントロピーがない場合、 要求されたバイトを作成するのに疑似乱数生成器が 使用される。 その結果、 この場合の返り値はこのドライバで使われているアルゴリズムに基づく暗 号攻撃に対して、 論理的には弱くなることになる。 この攻撃をどのように行うかという事について は、現在研究論文などの 形で入手できる資料はない、しかし、そのような攻撃は論理的に存在可能 である。 もし、この事が心配なら、(/dev/urandom ではなく) /dev/random を利用すればいい。 O_NONBLOCK は /dev/urandom をオープンする際には効果がない。 デバイス /dev/urandom に対して read(2) を呼び出した際、 要求されたランダムバイトが生成されるまでシグナルは処理されない。 /dev/random や /dev/urandom に書き込みを行うと、 書き込まれたデータでエントロピープールが 更新される。 しかし、 エントロピーカウントが増えるわけではない。 つまり、 /dev/random と /dev/urandom の両方のファイルから読み出される内容に影響があるが、 /dev/random からの読み出 しが早くなるわけではないということだ。 使い方 /dev/random と /dev/urandom のどちらを使うべきか迷った場合、たいていは /dev/urandom の方を 使いたいと思っているはずだろう。 一般に、長期に渡って使われる GPG/SSL/SSH のキー以外の全て のものに /dev/urandom を使用すべきである。 下記で推奨しているように再起動の前後で乱数種ファイルが保存される場合 (全ての主な Linux の ディストリビューションは少なくとも 2000 年以降は 乱数種を保存するようになっている)、起動 シーケンスにおいて乱数種が 再ロードされた直後から、その出力はローカルのルートアクセスがで きない 攻撃者に対して暗号的に安全なものとなり、ネットワーク暗号化のセッションキー として使 うには完全に最適なものとなる。 /dev/random からの読み出しは停止 (block) する可能性があるの で、ユーザーは普通 このファイルを非停止 (nonblocking) モードで開こうとし (もしくはタイムア ウトを指定して読み出しを実行し)、希望するレベルの エントロピーはすぐには利用できない場合に は、何らかの通知を行うことだろう。 カーネルの乱数ジェネレーターは、暗号疑似乱数ジェネレーター (Cryptographic pseudo-random number generator; CPRNG) の種として使用できる 高品質な乱数種の材料を少し生成するために設計 されている。 これは速度ではなく安全性を重視して設計されており、 ランダムなデータを大量に生 成するのには全くもって適していない。 ユーザーは /dev/urandom (と /dev/random) から読み出す 乱数種の材料の量をできるだけ節約すべきである。 このデバイスから不必要に大量のデータを読み 出すと、このデバイスを使う 他のユーザーにマイナスの影響を与えてしまうだろう。 暗号鍵を生成するのに必要な乱数種の材料の量は、鍵の実効サイズと同じである。 例えば、3072 ビットの RSA および Diffie-Hellman の秘密鍵の実効サイズは 128 ビット (この秘密鍵を破るには 2^128 回の操作が必要ということ) であり、 そのため鍵生成器が /dev/random から読み出す必要が ある乱数種の材料の量は 128 ビット (16 バイト) だけである。 CPRNG アルゴリズムの欠陥に対する保護として、この最小値に対していくらかの 安全上のマージン を取るのはもっともだが、現在利用可能な暗号プリミティブで 256 ビットより多くの安全な乱数を 必要とするようなものはない。 起動する度に、もしくは乱数種を変更する妥当な間隔 (1 分より短 くなることはない) の度に、カーネルの乱数プールから 256 ビット (32 バイト) よりたくさん読み 出す ような場合には、そのプログラムの暗号処理がうまく実装されて「いない」可能性が あると考 えるべきであろう。 Configuration システムにあらかじめ作成された /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 はエントロピープールのサイズを表す。 このファイルの意味はカーネルバー ジョンにより異なる。 Linux 2.4: このファイルはエントロピープールのサイズを「バイト」単位で規定する。 通 常、このファイルの値は 512 になるが、書き込み可能であり、 アルゴリズム で利用可能な任意の値に変更できる。 選択可能な値は 32, 64, 128, 256, 512, 1024, 2048 である。 Linux 2.6: このファイルは読み出し専用であり、 エントロピープールのサイズを「ビッ ト」単位で規定する。 値は 4096 である。 ファイル read_wakeup_threshold は /dev/random からのエントロピーを待って休止しているプロセ スを起こすのに必要な エントロピーのビット数を保持している。 デフォルトは 64 である。 ファ イル write_wakeup_threshold はエントロピーのビット数を保持しており、この値以下になったら /dev/random への書き込みアクセスのために select(2) または poll(2) を実行するプロセスを起 こす。 この値はファイルに書き込みを行うことによって変更できる。 読み込み専用のファイル uuid と boot_id は 6fd5a44b-35f4-4ad4-a9b9-6b9be13e1fe9 のような ラ ンダムな文字列を保持している。 前者は読み込みの度に新たに生成され、 後者は 1 度だけ生成さ れる。 ioctl(2) インターフェース 以下の ioctl(2) 要求が /dev/random や /dev/urandom に接続されたファイルディスクリプターに 対して定義されている。 実行されたすべての要求は、 /dev/random と /dev/urandom に影響を与え る入力エントロピープールとやり取りを行う。 RNDGETENTCNT 以外のすべての要求には CAP_SYS_ADMIN ケーパビリティが必要である。 RNDGETENTCNT 入力エントロピープールのカウントを取得する。 取得される内容は proc の entropy_avail ファイルと同じである。 結果は引き数が指す整数 (int) に格納される。 RNDADDTOENTCNT 入力エントロピープールのカウントを引き数が指す値だけ加算または減算する。 RNDGETPOOL Linux 2.6.9 で削除された。 RNDADDENTROPY 入力プールに追加のエントロピーを追加し、エントロピーカウントを増やす。 この要求は /dev/random や /dev/urandom への書き込みとは異なる。 /dev/random や /dev/urandom へ の書き込みでは、 何らかのデータが追加されるだけで、 エントロピーカウントは増やされ ない。 以下の構造体が使用される。 struct rand_pool_info { int entropy_count; int buf_size; __u32 buf[0]; }; entropy_count はエントロピーカウントに加算 (または減算) する値である。 buf は大きさ が buf_size のバッファーで、この内容がエントロピープールに追加される。 RNDZAPENTCNT, RNDCLEARPOOL すべてのプールのエントロピーカウントを 0 にし、何らかのシステムデータ (現在の時刻な ど) をプールに追加する。
ファイル
/dev/random /dev/urandom
関連項目
getrandom(2), mknod(1) RFC 1750, "Randomness Recommendations for Security"
この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクト の説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。