【Linux】SUID, SGID, スティッキービット

SUID

SUID(Set User ID)とは、実行権のあるファイルに設定されている特殊なアクセス権のこと。

例えば、一般ユーザ(rootでないユーザ)が自身のパスワードを変更すると、この変更は/etc/passwdファイルに保存されます。そこで、/etc/passwdファイルのパーミションを見ると以下のようになっています。

$ ls -l /etc/passwd
-rw-r--r-- 1 root root 667 Apr 21 00:21 /etc/passwd


このファイルの所有者はrootで、rootのみ書込み可であることがわかります。
これによると、一般ユーザは/etc/passwdに書き込みができないように思えますが、ここでpasswdコマンドを調べると、

$ ls -l `which passwd`
-rws--x--x 1 root bin 4731 Mar 09 10:43 /usr/bin/passwd


所有者のアクセス権が”rws”となっています。実行権の部分がsとなっていますが、これは実行権を持っているユーザによってプログラムが実行された場合は、ファイルの所有者の権限で実行されることを意味します。これをSUIDと呼びます。

つまり、一般ユーザはpasswdの実行権を持っているので、passwdが/etc/passwdに書き込む際はそのファイルの所有者であるrootの権限(rw)で実行されることになりますSUIDが設定されると、所有者の実行権限にsが入り、8進数表記にすると4000になります。なので、/usr/bin/passwdの権限は4611となります。

SGID

SGID(Set Group ID)は、SUIDと同じことが所有グループに適用され、所有グループの実行権にsが入ります。8進数表記だと2000です。

スティッキービット

スティッキービットは、特定のディレクトリに対しアクセス権が許可されていてもファイルの削除は行えないようにする設定です。

/tmpのアクセス権を見ると、

$ ls -ld /tmp
drwxrwxrwt 1 root root 4096 Apr 21 23:45 /tmp


となっており、その他のユーザの実行権がtとなっています。これがスティッキービットで、これによりその他のユーザに読み取り書込み権限があっても、自分以外のユーザが所有するファイルを削除することはできなくなります。

スティッキービットは8進数表記だと1000になります。なので、/tmpの権限は1777です。

まとめ

名称権限8進数表記
SUID所有者の実行権限にs ( e.g. -rws--x--x )4000
SGID所有グループの実行権限にs ( e.g. -rwx--s--x )2000
スティッキービットその他のユーザの実行権限にt ( e.g. drwxrwxwt )1000