From: Hidetoshi NAGAI Date: 2003-07-22T06:47:45+09:00 Subject: [ruby-list:37924] Re: control user ID / group ID 永井@知能.九工大です. 補足です. From: YOKOYAMA Takehiro Subject: [ruby-list:37916] Re: control user ID / group ID Date: Mon, 21 Jul 2003 17:31:38 +0900 Message-ID: <200307210830.AA01412@ludwig.amris.co.jp> > restore_re_gid() を上記のように書き換えることにより、正常に動作するように > なりました。ここでsetrgid()ではなくsetgid()を使っているのは、 > man setrgidに非推奨と書いてあるからです。 > これも他のOSとは異なる点だと思います。 OpenBSD の場合も同様に setruid()/setrgid() は非推奨ですが, 存在する限りは使うようにインプリメントしています. 非推奨としているのは,ユーザ ID 等を変更できる範囲 (条件) を 厳しくしていこうという動きだと思いますが,それゆえ setruid()/setrgid() を使わなければ対応しようのない変更が存在します. 現状,やむをえず setruid()/setrgid() を使っているのは, 非特権ユーザの状態で権限放棄を行いたい場合です. この時 setgid() は実効グループ ID の変更はするものの, 実/保存グループ ID の変更はなされません.同様に非特権ユーザでは setegid() でも保存グループ ID の変更はできません. 実/実効/保存のすべてが変更されていない限り,完全な特権放棄には なりませんから,setrgid() なしに非特権ユーザの状態で権限放棄が できるのは実/保存グループ ID が権限放棄先の ID である場合のみです. setrgid() と setegid() とを組み合わせて使卯場合は, 実または保存グループ ID が権限放棄先の ID である場合となります. 実と実効グループ ID が交換可能な環境でなければ「実/保存グループ ID が権限放棄先の ID 」という状態は作れませんので(だったはずです), re_exchangeable? で条件判断して false なら非特権ユーザの状態からの 権限放棄はできないものとした実装を選択するという方法で良いはずです. しかし,チェックを忘れている (サボっている) スクリプトにおいて, 非推奨とはいえ実装されている機能を使えば救うことができる処理を あっさり「できません」としてしまうのは少々忍びないと思えました. それゆえ,非推奨を承知の上で用いるように実装しています. # この辺りのドキュメントはもっときちんとしたものが必要ですね. 将来 setrgid() が消滅し,setregid() も使えないままであるなら 「できないものはどうしようもない」ということで受け入れるしかありません. その場合でも,re_exchangeable? で条件判断して実装しているスクリプトは 問題なく動くはずです. ポータビリティを維持するための最低限のチェックをサボっているという こととなれば,「やむを得ない」と言ってもよいのではないでしょうか. 「それなら最初から不可として,setrgid() を禁止する方がいい」という 意見が強いなら,例えば #if defined(__OpenBSD__) || defined(__bsdi__) || defined(MAC_OSX) #undef HAVE_RUID #undef HAVE_RGID #end という定義を加えるようにするだけのことです. -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp