Provided by: manpages-ja_0.5.0.0.20210215+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/ に書かれている。
Linux 2015-02-01 RANDOM(4)