From: Hidetoshi NAGAI Date: 2003-07-21T13:37:04+09:00 Subject: [ruby-list:37913] Re: control user ID / group ID 永井@知能.九工大です. From: YOKOYAMA Takehiro Subject: [ruby-list:37912] Re: control user ID / group ID Date: Mon, 21 Jul 2003 11:37:45 +0900 Message-ID: <200307210236.AA01410@ludwig.amris.co.jp> > 実ユーザー/グループID、実効ユーザー/グループIDを操作するシステムコールは、 > 似た名前のものがたくさんあるし、実際に相手にしているOSでは > 書籍の説明どおりに動かなかったりして苦労が多いので、 > 今回の試みは意義のあることだと思います。 ありがとうございます. > 実装方法に関して、私が普段使っているBSD/OSの場合の事情ですが、 > 次のような考慮事項があります。 助かります.こういう情報が欲しかったのです. > 何のパラメーターもつけずに ./configure すると > #define HAVE_SETREUID 1 > となるので、setreuid/setregidを使った実装になるのですが、 > 実際にはsetuid/seteuid / setgid/setegidを使わないと正常に > IDが切り替わらない場合があります。 (中略) > なお、 > #elif defined HAVE_SETRGID && defined HAVE_SETEGID > のときsetrgid/setegidを使っているようですが、そうではなくsetgid/setegidです。 この記述があるのは権限の完全放棄の部分のことかと思います. setgid があるのでしたら HAVE_SETGID も 1 に定義されているものと 仮定すると,root 権限を持ったユーザがの場合には preprocessor の #if の優先順で setgid が用いられますので問題なしですよね? root 権限を持たない場合,HAVE_SETRESGID が定義されていないと仮定すると, setregid が用いられることになりますが,ここでの処理が BSD/OS (と Mac OS X) では正しく動かないということでしょうか? 念のため,ここでの処理は (1) 保存グループ ID が新 ID と等しい. 実/実効グループ ID が新 ID と等しいかに応じて 次のいずれかを実行 (等しいところは -1) setregid(gid, gid) setregid(-1, gid) setregid(gid, -1) setregid(-1, -1) (2) (1) ではなく,実グループ ID も新 ID に等しくない. 実効グループ ID が新 ID と等しいかに応じて 次のいずれかを実行 (等しいければ -1) setregid(gid, gid) setregid(gid, -1) (3) (2) でもなく (実グループ ID は等しい),実効グループ ID が異なる. 実/実効グループ ID の入れ替え (実 != 新 ID && 実効 == 新 ID) 後, 実グループ ID を変更 setregid(getegid(), gid) setregid(gid, -1) (4) (1)〜(3) 以外,つまり,実/実効グループ ID は新 ID に等しいが, 保存グループ ID だけが異なっている場合. 保存グループ ID が新 ID になるように操作した後, 実/実効グループ ID を新 ID に再設定する. setregid(-1, 保存ID) setregid(保存ID, gid) setregid(gid, -1) ということになっています. BSD/OS の setregid の仕様上,正しく動かない部分を 教えていただけますと助かります. それとも,正しく動かないのはここではなくて別の部分でしょうか? もし可能なら,samba 用の変更パッチを送っていただけると どういう状況をどう修正しなければならなかったかの理解の 助けになるかと思います. また,もし BSD/OS だけを特別扱いしなければならなくなった場合, #if defined(????) には何を指定したら良いかも教えていただけませんか? -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp