補助グループ権限もつけてくれるsetuidgidのようなもの
daemontoolsのsetuidgidは補助グループ(supplementary groups)権限をつけてくれないのですが、どうしてもつけたい時もあります。あるはずです。
いくつか検討したのでそのメモです。
自分で書く!
結局この方法にしました。
daemontools-encore の setuidgid を使う
これの setuidgid は -s オプションで補助グループ権限をつけてくれるようです。
daemontools の setuidgid をいじる
数行足すだけです。
--- setuidgid.c 2001-07-13 01:49:49.000000000 +0900 +++ setuidgidgroups.c 2012-11-20 20:21:21.574829697 +0900 @@ -3,6 +3,7 @@ #include "prot.h" #include "strerr.h" #include "pathexec.h" +#include <grp.h> #define FATAL "setuidgid: fatal: " @@ -21,6 +22,8 @@ if (prot_gid(pw->pw_gid) == -1) strerr_die2sys(111,FATAL,"unable to setgid: "); + if (initgroups(account, pw->pw_gid) == -1) + strerr_die2sys(111,FATAL,"unable to initgroups: "); if (prot_uid(pw->pw_uid) == -1) strerr_die2sys(111,FATAL,"unable to setuid: ");
su を使う
suはexecじゃなくてforkするので setuidgid の代わりとしては使えません。
$ cat /tmp/p.sh #!/bin/sh echo $$ # sh -c 'echo $$ && exec su nobody -c "/tmp/p.sh"' 21231 21232
runuser を使う
runuserはRHEL系のcoreutilsに含まれているコマンドのようです。
これも fork するのでダメです。
# sh -c 'echo $$ && exec runuser nobody -c "/tmp/p.sh"' 21198 21199
sudo を使う
バージョン(?)によって挙動が違うのでイマイチです。。
CentOS 6.2
# cat /etc/redhat-release CentOS release 6.2 (Final) # sudo -V | head -n 1 Sudo version 1.7.4p5 # sh -c 'echo $$ && exec sudo -u nobody /tmp/p.sh' 21253 21255
Ubuntu 10.04
# lsb_release -ir Distributor ID: Ubuntu Release: 10.04 # sudo -V | head -n 1 Sudo version 1.7.2p1 # sh -c 'echo $$ && exec sudo -u nobody /tmp/p.sh' 29309 29309
Ubuntu 12.04
# lsb_release -ir Distributor ID: Ubuntu Release: 12.04 # sudo -V | head -n 1 Sudo version 1.8.3p1 # sh -c 'echo $$ && exec sudo -u nobody /tmp/p.sh' 2206 2207