Edited at

Linux: SUID、SGID、スティッキービットまとめ

More than 1 year has passed since last update.


基本

対象
r
w
x

ファイル
読み込み
書き込み
実行

ディレクトリ
ディレクトリ内ファイル一覧の取得(ls)
ディレクトリ内ファイルの作成・削除
ディレクトリに移動(cd)。子孫へのアクセス


SUID、SGID、スティッキービットの一覧表

比較項目
数値表現
文字列表現
ファイルにつけた場合
ディレクトリにつけた場合
実例

SUID
4000
u+s
そのコマンドが所有者の権限で実行される
意味なし
/usr/bin/su
/usr/bin/passwd

SGID
2000
g+s
そのコマンドが所有グループの権限で実行される
その中に作成されるファイルやディレクトリはそのグループを継承する
/usr/bin/write

スティッキービット
1000
o+t
意味なし
その中のファイルを名前変更・削除できるのは所有者のみ
/tmp

※シェルやperlのスクリプトにsuidを付けても効果がない(無視される)

※Linuxの場合。BSDやSolarisでもほぼ同じと考えてよい。


SUIDのついたファイルを探す

[/usr/bin:1]# find . -perm +4000 -ls

142970 28 -rwsr-xr-x 1 root root 27616 3月 13 23:36 ./chfn
153584 116 -rwsr-xr-x 1 root root 118128 3月 22 09:49 ./sudo
141038 52 -rwsr-xr-x 1 root root 52192 2月 13 12:59 ./ksu
142811 36 -rwsr-xr-x 1 root root 33904 3月 15 23:37 ./newuidmap
142806 56 -rwsr-xr-x 1 root root 55288 3月 15 23:37 ./chage
142944 32 -rwsr-xr-x 1 root root 31792 3月 13 23:36 ./su
142972 16 -rwsr-xr-x 1 root root 14872 3月 13 23:36 ./newgrp
142807 24 -rwsr-xr-x 1 root root 23584 3月 15 23:37 ./expiry
142810 36 -rwsr-xr-x 1 root root 33904 3月 15 23:37 ./newgidmap
142971 24 -rwsr-xr-x 1 root root 23432 3月 13 23:36 ./chsh
160521 428 -rwsr-xr-x 1 root root 434432 11月 12 2014 ./screen-4.2.1
142809 48 -rwsr-xr-x 1 root root 47224 3月 15 23:37 ./passwd
142951 40 -rwsr-xr-x 1 root root 40208 3月 13 23:36 ./mount
142808 68 -rwsr-xr-x 1 root root 68528 3月 15 23:37 ./gpasswd
141480 32 -rwsr-sr-x 1 root root 31368 6月 16 2014 ./unix_chkpwd
142958 28 -rwsr-xr-x 1 root root 27664 3月 13 23:36 ./umount
154745 16 -rwsr-xr-x 1 root root 14696 5月 17 01:47 ./suexec
163465 44 -rwsr-xr-x 1 root root 44512 11月 25 03:37 ./crontab
142812 40 -rwsr-xr-x 1 root root 36888 3月 15 23:37 ./sg


GUIDのついたファイルを探す

[/usr/bin:1]# find . -perm +2000 -ls

142966 16 -rwxr-sr-x 1 root tty 14992 3月 13 23:36 ./write
142965 28 -rwxr-sr-x 1 root tty 27480 3月 13 23:36 ./wall
141480 32 -rwsr-sr-x 1 root root 31368 6月 16 2014 ./unix_chkpwd
160691 40 -rwxr-sr-x 1 root locate 39520 12月 15 02:54 ./locate


おまけ:findでパーミッションを指定して検索するオプション

find . -perm xyz ビットが完全に一致するとき

find . -perm -xyz 指定ビットの全てが立っているとき(AND)

find . -perm +xyz 指定ビットのいずれかが立っているとき(OR)(これが一番よく使うと思う)

find . -perm -111 -lsfind . -perm +111 -lsを比較してみると分かりやすい。


SUID、GUIDテスト用のコマンド


printuid.c

// gcc -W -Wall printuid.c -o printuid

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main(void)
{
uid_t uid = getuid();
uid_t euid = geteuid();
gid_t gid = getgid();
gid_t egid = getegid();

printf("uid = %d\n", uid); // 実際に実行したユーザーのID
printf("euid = %d\n", euid); // 実効ユーザーID(SUIDされている場合所有者)
printf("gid = %d\n", gid); // 実際に実行したユーザーのグループ
printf("egid = %d\n", egid); // 実効グループID(GUIDされている場合所有グループ)

return 0;
}