.\" Copyright (c) 1997 John S. Kallal (kallal@voicenet.com) .\" .\" %%%LICENSE_START(GPLv2+_DOC_ONEPARA) .\" This is free documentation; you can redistribute it and/or .\" modify it under the terms of the GNU General Public License as .\" published by the Free Software Foundation; either version 2 of .\" the License, or (at your option) any later version. .\" %%%LICENSE_END .\" .\" Some changes by tytso and aeb. .\" .\" 2004-12-16, John V. Belmonte/mtk, Updated init and quit scripts .\" 2004-04-08, AEB, Improved description of read from /dev/urandom .\" 2008-06-20, George Spelvin , .\" Matt Mackall .\" Add a Usage subsection that recommends most users to use .\" /dev/urandom, and emphasizes parsimonious usage of /dev/random. .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .\" .\" Japanese Version Copyright (c) 1998 .\" ISHIKAWA Mutsumi, all rights reserved. .\" Translated into Japanese Mon Jan 12 03:20:27 JST 1998 .\" by ISHIKAWA Mutsumi .\" Japanese Version Last Modified Thu Feb 5 21:08:33 JST 1998 .\" by ISHIKAWA Mutsumi .\" Updated & Modified Sun Jun 6 14:48:03 JST 2004 .\" by Yuichi SATO .\" Updated & Modified Tue Jan 18 04:21:16 JST 2005 by Yuichi SATO .\" Updated & Modified Fri Apr 22 03:44:01 JST 2005 by Yuichi SATO .\" Updated 2008-08-13, Akihiro MOTOKI , LDP v3.05 .\" Updated 2013-05-07, Akihiro MOTOKI .\" .TH RANDOM 4 2015\-02\-01 Linux "Linux Programmer's Manual" .SH 名前 random, urandom \- カーネル乱数ソースデバイス .SH 書式 #include .sp \fBint ioctl(\fP\fIfd\fP\fB, RND\fP\fIrequest\fP\fB, \fP\fIparam\fP\fB);\fP .SH 説明 (Linux 1.3.30 から提供されている) \fI/dev/random\fP 、 \fI/dev/urandom\fP キャラクタースペシャルファイルは カーネル乱数ジェネレーターへのインターフェースを提供する。 \fI/dev/random\fP ファイルはメジャーデバイス番号 1 マイナーデバイス番号 8 である。 \fI/dev/urandom\fP はメジャーデバイス番号 1 マイナーデバイス番号 9 である。 .LP 乱数ジェネレーターはデバイスドライバやその他の源からの環境ノイズを エントロピープールへ集める。 また、ジェネレーターはエントロピープール内のノイズのビット数の推定値を 保持する。 このエントロピープールから乱数が生成される。 .LP 読み込みが行われると、 \fI/dev/random\fP デバイスはエントロピープールのノイズビットの数の推定値のうち、 ランダムバイトのみを返す。 \fI/dev/random\fP はワンタイムパッド (one\-time pad) や鍵の生成のような 非常に高い品質を持った無作為性が必要になる用途に向いているだろう。 エントロピープールが空の時は、\fI/dev/random\fP からの読み出しは、 更なる環境ノイズが得られるまで、ブロックされる。 \fBopen\fP(2) が \fI/dev/random\fP に対して \fBO_NONBLOCK\fP フラグ付きで呼ばれると、 それ以降の \fBread\fP(2) は要求したバイト数のデータが利用可能になるまで停止しない。 その代わり、 利用可能なデータが返される。 利用可能なバイトが全くない場合、 \fBread\fP(2) は \-1 を返し、 \fIerrno\fP に \fBEAGAIN\fP が設定される。 .LP \fI/dev/urandom\fP デバイスから読み出しでは、 エントロピーがより高くなるのを待つためのブロックは行われない。 十分なエントロピーがない場合、 要求されたバイトを作成するのに疑似乱数生成器が使用される。 その結果、 この場合の返り値はこのドライバで使われているアルゴリズムに基づく暗号攻撃に対して、 論理的には弱くなることになる。 この攻撃をどのように行うかという事については、現在研究論文などの 形で入手できる資料はない、しかし、そのような攻撃は論理的に存在可能である。 もし、この事が心配なら、(\fI/dev/urandom\fP ではなく) \fI/dev/random\fP を利用すればいい。 \fBO_NONBLOCK\fP は \fI/dev/urandom\fP をオープンする際には効果がない。 デバイス \fI/dev/urandom\fP に対して \fBread\fP(2) を呼び出した際、 要求されたランダムバイトが生成されるまでシグナルは処理されない。 .LP \fI/dev/random\fP や \fI/dev/urandom\fP に書き込みを行うと、 書き込まれたデータでエントロピープールが更新される。 しかし、 エントロピーカウントが増えるわけではない。 つまり、 \fI/dev/random\fP と \fI/dev/urandom\fP の両方のファイルから読み出される内容に影響があるが、 \fI/dev/random\fP からの読み出しが早くなるわけではないということだ。 .SS 使い方 \fI/dev/random\fP と \fI/dev/urandom\fP のどちらを使うべきか迷った場合、たいていは \fI/dev/urandom\fP の方を使いたいと思っているはずだろう。 一般に、長期に渡って使われる GPG/SSL/SSH のキー以外の全てのものに \fI/dev/urandom\fP を使用すべきである。 下記で推奨しているように再起動の前後で乱数種ファイルが保存される場合 (全ての主な Linux のディストリビューションは少なくとも 2000 年以降は 乱数種を保存するようになっている)、起動シーケンスにおいて乱数種が 再ロードされた直後から、その出力はローカルのルートアクセスができない 攻撃者に対して暗号的に安全なものとなり、ネットワーク暗号化のセッションキー として使うには完全に最適なものとなる。 \fI/dev/random\fP からの読み出しは停止 (block) する可能性があるので、ユーザーは普通 このファイルを非停止 (nonblocking) モードで開こうとし (もしくはタイムアウトを指定して読み出しを実行し)、希望するレベルの エントロピーはすぐには利用できない場合には、何らかの通知を行うことだろう。 カーネルの乱数ジェネレーターは、暗号疑似乱数ジェネレーター (Cryptographic pseudo\-random number generator; CPRNG) の種として使用できる 高品質な乱数種の材料を少し生成するために設計されている。 これは速度ではなく安全性を重視して設計されており、 ランダムなデータを大量に生成するのには全くもって適していない。 ユーザーは \fI/dev/urandom\fP (と \fI/dev/random\fP) から読み出す乱数種の材料の量をできるだけ節約すべきである。 このデバイスから不必要に大量のデータを読み出すと、このデバイスを使う 他のユーザーにマイナスの影響を与えてしまうだろう。 暗号鍵を生成するのに必要な乱数種の材料の量は、鍵の実効サイズと同じである。 例えば、3072 ビットの RSA および Diffie\-Hellman の秘密鍵の実効サイズは 128 ビット (この秘密鍵を破るには 2^128 回の操作が必要ということ) であり、 そのため鍵生成器が \fI/dev/random\fP から読み出す必要がある乱数種の材料の量は 128 ビット (16 バイト) だけである。 CPRNG アルゴリズムの欠陥に対する保護として、この最小値に対していくらかの 安全上のマージンを取るのはもっともだが、現在利用可能な暗号プリミティブで 256 ビットより多くの安全な乱数を必要とするようなものはない。 起動する度に、もしくは乱数種を変更する妥当な間隔 (1 分より短くなることはない) の度に、カーネルの乱数プールから 256 ビット (32 バイト) よりたくさん読み出す ような場合には、そのプログラムの暗号処理がうまく実装されて「いない」可能性が あると考えるべきであろう。 .SS Configuration システムにあらかじめ作成された \fI/dev/random\fP と \fI/dev/urandom\fP が存在しないなら、次のようなコマンドで作成できる。 .nf mknod \-m 644 /dev/random c 1 8 mknod \-m 644 /dev/urandom c 1 9 chown root:root /dev/random /dev/urandom .fi オペレータの操作なしに Linux システムが起動した直後は、 エントロピープールは意外性の乏しい均一な状態にあるだろう。 これにより、エントロピープールの実際のノイズ量は評価値より少なくなる。 この効果を打ち消すために、シャットダウンから (次の) 起動時まで持ち越した エントロピープールの情報が助けになる。 エントロピープールを持ち越すためには、 Linux システムの起動時に実行される適切なスクリプトに、 以下の行を追加すればよい: .nf 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 .fi また、Linux システムのシャットダウン時に実行される適切なスクリプトに、 以下の行を追加すればよい: .nf # 乱数種を今回のシャットダウンから次回のスタートアップまで持ち越す。 # 全てのエントロピープールを保存する。 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 .fi .SS "/proc インターフェース" ディレクトリ \fI/proc/sys/kernel/random\fP にあるファイル (2.3.16 から存在する) は、 \fI/dev/random\fP デバイスへのその他のインターフェースを提供する。 .LP 読み込み専用のファイル \fIentropy_avail\fP は使用可能なエントロピーを表す。 通常、これは 4096 (ビット) になり、エントロピープールが満杯の状態である。 .LP ファイル \fIpoolsize\fP はエントロピープールのサイズを表す。 このファイルの意味はカーネルバージョンにより異なる。 .RS .TP 12 Linux 2.4: このファイルはエントロピープールのサイズを「バイト」単位で規定する。 通常、このファイルの値は 512 になるが、書き込み可能であり、 アルゴリズムで利用可能な任意の値に変更できる。 選択可能な値は 32, 64, 128, 256, 512, 1024, 2048 である。 .TP Linux 2.6: このファイルは読み出し専用であり、 エントロピープールのサイズを「ビット」単位で規定する。 値は 4096 である。 .RE .LP ファイル \fIread_wakeup_threshold\fP は \fI/dev/random\fP からのエントロピーを待って休止しているプロセスを起こすのに必要な エントロピーのビット数を保持している。 デフォルトは 64 である。 ファイル \fIwrite_wakeup_threshold\fP はエントロピーのビット数を保持しており、この値以下になったら \fI/dev/random\fP への書き込みアクセスのために \fBselect\fP(2) または \fBpoll\fP(2) を実行するプロセスを起こす。 この値はファイルに書き込みを行うことによって変更できる。 .LP 読み込み専用のファイル \fIuuid\fP と \fIboot_id\fP は 6fd5a44b\-35f4\-4ad4\-a9b9\-6b9be13e1fe9 のような ランダムな文字列を保持している。 前者は読み込みの度に新たに生成され、 後者は 1 度だけ生成される。 .SS "ioctl(2) インターフェース" 以下の \fBioctl\fP(2) 要求が \fI/dev/random\fP や \fI/dev/urandom\fP に接続されたファイルディスクリプターに対して定義されている。 実行されたすべての要求は、 \fI/dev/random\fP と \fI/dev/urandom\fP に影響を与える入力エントロピープールとやり取りを行う。 \fBRNDGETENTCNT\fP 以外のすべての要求には \fBCAP_SYS_ADMIN\fP ケーパビリティが必要である。 .TP \fBRNDGETENTCNT\fP 入力エントロピープールのカウントを取得する。 取得される内容は proc の \fIentropy_avail\fP ファイルと同じである。 結果は引き数が指す整数 (int) に格納される。 .TP \fBRNDADDTOENTCNT\fP 入力エントロピープールのカウントを引き数が指す値だけ加算または減算する。 .TP \fBRNDGETPOOL\fP Linux 2.6.9 で削除された。 .TP \fBRNDADDENTROPY\fP 入力プールに追加のエントロピーを追加し、エントロピーカウントを増やす。 この要求は \fI/dev/random\fP や \fI/dev/urandom\fP への書き込みとは異なる。 \fI/dev/random\fP や \fI/dev/urandom\fP への書き込みでは、 何らかのデータが追加されるだけで、 エントロピーカウントは増やされない。 以下の構造体が使用される。 .IP .nf struct rand_pool_info { int entropy_count; int buf_size; __u32 buf[0]; }; .fi .IP \fIentropy_count\fP はエントロピーカウントに加算 (または減算) する値である。 \fIbuf\fP は大きさが \fIbuf_size\fP のバッファーで、この内容がエントロピープールに追加される。 .TP \fBRNDZAPENTCNT\fP, \fBRNDCLEARPOOL\fP すべてのプールのエントロピーカウントを 0 にし、何らかのシステムデータ (現在の時刻など) をプールに追加する。 .SH ファイル /dev/random .br .\" .SH AUTHOR .\" The kernel's random number generator was written by .\" Theodore Ts'o (tytso@athena.mit.edu). /dev/urandom .SH 関連項目 \fBgetrandom\fP(2), \fBmknod\fP(1) .br RFC\ 1750, "Randomness Recommendations for Security" .SH この文書について この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.79 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man\-pages/ に書かれている。