tanke25616429のアウトプット

IT技術の基本を勉強したことをアウトプットします。Linux、Kubernetes、クラウド中心です。百番煎じくらいだけど誰かの役に立てばそれはそれでうれしい。

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/statusGroupsでもプロセスの所属グループが確認できるとのこと。

ところが、実行してみると、どうも実効グループ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のほうを設定していると予想されるだが、詳細を確認する時間がなくなったので今後の課題とする。

参考にしたもの

SGID(Set Group ID) - 特殊なアクセス権

unix.stackexchange.com

qiita.com

*1:実効ユーザIDもある。それに関する記事は多いのだが実効ユーザIDについて書かれているものが少ないので記事を書いた。また、実ユーザID、実グループIDもあり、これらも実効ユーザIDや実効グループIDとは別である