Manpages

名 前

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 を 返 し 、 errnoEAGAIN が 設 定 さ れ る 。

/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) を 実 行 す る プ ロ セ ス を 起 こ す 。 こ の 値 は フ ァ イ ル に 書 き 込 み を 行 う こ と に よ っ て 変 更 で き る 。 読 み 込 み 専 用 の フ ァ イ ル uuidboot_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/ に 書 か れ て い る 。