名 前
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/ に 書 か れ て い る 。