補助グループ権限もつけてくれる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

runit の chpst を使う

できそうな気がしますが試してません。