SGIDを実行ファイルに設定した際の挙動
SGIDとは
SGID(Set Group ID)とは、実行権のあるファイルに設定される特殊なアクセス権の1つ。 実行ファイルにSGID(Set Group ID)が設定されている場合は、その実行ファイルを実行すると、実行ファイルの所有グループの権限でファイルが実行される。
知りたいこと
実行ファイルの所有グループの権限でファイルが実行されるとは具体的にはどういうことか?
Linuxのプロセスにおいては、実効グループIDというIDが設定される*1。通常はプロセスは、実行ファイルを実行したユーザの所有グループが実効グループIDになる。ここで、実行ファイルにSGIDというフラグを設定すると、実行ファイルの所有者がプロセスの実効グループIDになる。
動作検証
概要
phil
というユーザで検証用のプログラムを実行し、実行中のプロセスの実効グループIDを確認する。検証用のプログラムの所有グループはtestuser
である。
phil
の所有グループIDは1007である。
[phil@nuc-centos8 ~]$ id uid=1002(phil) gid=1007(accounting) groups=1007(accounting) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
testuser
の所有グループIDは1001である。
[testuser@nuc-centos8 test]$ id uid=1001(testuser) gid=1001(testuser) groups=1001(testuser),10(wheel) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
検証用プログラムの作成
簡単なC言語のプログラムを用意する。無限ループするだけのものである。
#include <stdio.h> int main() { printf("now executing\n"); while (1) { } }
コンパイルする。loop
という名前の実行ファイルができている。
[testuser@nuc-centos8 test]$ gcc loop.c -o loop [testuser@nuc-centos8 test]$ ls -lhtra total 20K -rw-rw-r--. 1 testuser testuser 123 Jan 13 07:33 loop.c drwxrwxrwx. 5 testuser testuser 144 Jan 13 07:33 .. drwxrwxr-x. 2 testuser testuser 32 Jan 13 07:33 . -rwxrwxr-x. 1 testuser testuser 13K Jan 13 07:33 loop
loop
をコピーしてloop-sgid
という実行ファイルを用意し、loop-sgid
にSGIDを設定する。見づらいが、パーミッションが-rwxrwxr-xから-rwxrwsr-xに変化している。
[testuser@nuc-centos8 test]$ cp loop loop-sgid [testuser@nuc-centos8 test]$ ls -lhtra total 36K -rw-rw-r--. 1 testuser testuser 93 Jan 13 07:48 loop.c drwxrwxrwx. 5 testuser testuser 144 Jan 13 07:48 .. drwxrwxr-x. 2 testuser testuser 49 Jan 13 07:48 . -rwxrwxr-x. 1 testuser testuser 13K Jan 13 07:48 loop -rwxrwxr-x. 1 testuser testuser 13K Jan 13 07:52 loop-sgid [testuser@nuc-centos8 test]$ sudo chmod g+s loop-sgid [testuser@nuc-centos8 test]$ ls -lhtra total 36K -rw-rw-r--. 1 testuser testuser 123 Jan 13 07:33 loop.c drwxrwxrwx. 5 testuser testuser 144 Jan 13 07:33 .. -rwxrwxr-x. 1 testuser testuser 13K Jan 13 07:33 loop drwxrwxr-x. 2 testuser testuser 49 Jan 13 07:35 . -rwxrwsr-x. 1 testuser testuser 13K Jan 13 07:35 loop-sgid
実効グループIDの確認
SGIDの設定されていないプログラム(loop)を実行した場合。このとき、phil
の所有グループ1007が実効グループIDになることが期待される。
[phil@nuc-centos8 test]$ ./loop now executing
別端末でプロセスIDを確認し、実効ユーザIDを出力する。期待通り、testuser
の所有グループのIDの1007で実行されている。
[root@nuc-centos8 ~]# top top - 08:18:21 up 16 days, 8:07, 4 users, load average: 0.38, 0.43, 0.28 Tasks: 237 total, 2 running, 235 sleeping, 0 stopped, 0 zombie %Cpu(s): 12.7 us, 0.0 sy, 0.0 ni, 87.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st MiB Mem : 31778.6 total, 30562.0 free, 471.7 used, 744.8 buff/cache MiB Swap: 16036.0 total, 16036.0 free, 0.0 used. 30888.3 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 280107 phil 20 0 4328 808 744 R 93.8 0.0 0:17.97 loop (略) [root@nuc-centos8 ~]# ps -o sgid 280107 SGID 1007
一方、SGIDを設定したプログラム(loop-sgid)を実行する。このとき、testuser
の所有グループ1001が実効グループIDになることが期待される。
[phil@nuc-centos8 test]$ ./loop-sgid now executing
期待通り、所有グループID 1001で実行されている。
[root@nuc-centos8 ~]# top top - 08:22:14 up 16 days, 8:11, 4 users, load average: 1.00, 0.75, 0.46 Tasks: 240 total, 3 running, 237 sleeping, 0 stopped, 0 zombie %Cpu(s): 12.9 us, 0.0 sy, 0.0 ni, 87.1 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st MiB Mem : 31778.6 total, 30561.7 free, 472.1 used, 744.8 buff/cache MiB Swap: 16036.0 total, 16036.0 free, 0.0 used. 30887.9 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 280140 phil 20 0 4328 688 624 R 93.8 0.0 1:17.09 loop-sgid (略) [root@nuc-centos8 ~]# ps -o sgid 280140 SGID 1001
今後の課題
実行中プロセスの所属グループ(Linux) - Qiita によると、/proc/プロセスID/status
のGroups
でもプロセスの所属グループが確認できるとのこと。
ところが、実行してみると、どうも実効グループIDを表していない様子。
SGIDを設定していないプログラムを実行した場合。
[root@nuc-centos8 ~]# cat /proc/280107/status | grep Group Groups: 1007
SGIDを設定したプログラムを実行した場合(実効グループIDを表すのであれば1001になっているはず)。
[root@nuc-centos8 ~]# cat /proc/280140/status | grep Group Groups: 1007
おそらく、ここは実グループIDのほうを設定していると予想されるだが、詳細を確認する時間がなくなったので今後の課題とする。
参考にしたもの
*1:実効ユーザIDもある。それに関する記事は多いのだが実効ユーザIDについて書かれているものが少ないので記事を書いた。また、実ユーザID、実グループIDもあり、これらも実効ユーザIDや実効グループIDとは別である