From: Hidetoshi NAGAI Date: 2003-07-17T20:21:14+09:00 Subject: [ruby-dev:20712] Re: portable(?) UserID/GroupID control 永井@知能.九工大です. From: Hidetoshi NAGAI Subject: [ruby-dev:20690] portable(?) UserID/GroupID control (Re: frozen ThreadGroup) Date: Wed, 16 Jul 2003 12:52:58 +0900 Message-ID: <20030716.125256.41640495.nagai@ai.kyutech.ac.jp> > ex_reid ex_re, re_exchange, exchange, exchange_re 実/実効 ID の交換 > ex_reid? ex_re?, re_exchangeable?, exchangable? 実/実効 ID の交換可否 これらですが,少し名前は長くなりますが, --------------------------------------------- re_exchange 実/実効 ID の交換 re_exchangeable? 実/実効 ID の交換可否 --------------------------------------------- がメソッドの機能が一番わかりやすいのではという気がしてきました. というわけで,今のところは次のメソッド名を第一候補としたいと思います. --------------------------------------------- rid 実 ID の獲得 eid 実効 ID の獲得 to(id) 指定 ID への完全移行 eid=(id) 実効 ID の設定 re_exchange 実/実効 ID の交換 re_exchangeable? 実/実効 ID の交換可否 has_sid? 保存 ID の有無 switch 権限の一時的な変更 --------------------------------------------- いかがでしょうか? システムコールの解釈等に誤りがなければ, 各 OS のシステムコールの仕様を気にすることなく,例えば ・root で起動して,root 権限が必要な処理を行った後, 特定ユーザの権限に完全に移行してしまう. ==> Process::UserID.to(id) ・setuid したバイナリで起動し,起動したユーザの権限でファイルを開き, バイナリ所有者権限で必要処理を行った後,起動したユーザの権限に移行する. ==> rid = Process::UserID.rid f1 = Process::UserID.switch{open(file1, 'w') f2 = open(file2, 'r') Process::UserID.to(rid) ・root で起動 (あるいは root に setuid) して, user1 と user2 との二つの権限を与えて処理を続ける. ==> if Process::UserID.re_exchangeable? Process::UserID.eid = user1 Process::UserID.re_exchange Process::UserID.eid = user2 else raise NotImprementedError end などというように書けて,OS 依存性を低下できる *はず* (^_^; です. -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp