SUID, SGID, スティッキービット

Linux Permission 2/N

公開日: 2021-05-08
更新日: 2023-08-08
所要時間: 10 min

  Table of Contents

What is “SUID(= Set User ID)”?

Def: SUID

LinuxではユーザはUIDと呼ばれるID番号で管理されているが, 一時的にファイルの実行権限を別のUIDのユーザに変更できる 機能のことをSUID(Set User ID)という.

  • SUIDが付与されたファイルは実行時にそのファイルの所有者の権限で実行される
  • Linuxのファイルシステム上では, ディレクトリに対して設定しても効果はない

セキュリティ的に一般ユーザーの書き込み権限などは絞っておきたいが, 利便性を考えると root ユーザーでなくても更新させたい」というファイルがあるとき, SUID をうまく使うことで用途を限定した上で, セキュアなファイルへの書き込みを一般ユーザーにも許可できるというメリットがあります.

SUIDの使用例として, passwdコマンドがあります. Linuxではパスワードのデータを/etc/shadowで管理しています.

1
2
% ls -l /etc/shadow 
-rw-r----- 1 root shadow 9812 Jul 15 19:03 /etc/shadow

このファイルの特徴として以下があります

  • root以外は読み取れない(= 暗号化パスワード解読を防ぐため)
  • パスワード情報は暗号化されている

そのためパスワードを変更したいときは直接編集するのではなくpasswdコマンドを使いますが, このコマンドにSUIDの仕組みが使われています.

1
2
% ls -l  $(which passwd)
-rwsr-xr-x 1 root root 68208 Nov 24  2022 /usr/bin/passwd*

SUIDが設定されているファイル(プログラム)においては所有者の実行権限がsと表記されます. そのため, passwdコマンドは一般ユーザが実行した場合においても, passwdコマンドの所有者であるroot権限で実行できます.

SUIDの設定方法

chmodでSUIDを設定する場合は

  • オクタルモード: 4000を加算
  • シンボリックモード: u+sを付与
1
2
3
4
5
## オクタルモードで755に加えて設定したい場合
% sudo chmod 4755 test.sh

## シンボリックモード
% sudo chmod u+s test.sh

SUIDはどのように機能しているのか?

Linuxではコマンドを実行するとプロセスが走りますが, そのプロセスのUSERには2種類あります:

  • 実ユーザーID(= real user ID): プロセス起動ユーザー, プロセス所有ユーザー
  • 実効ユーザーID(= effective user ID): プロセスが実行されるときの権限

ps auxで確認できるUSERは実ユーザーIDを指しています.

カーネルはプロセスの実行権限を実効ユーザーID(または実行グループ)で判断しています. 通常は実ユーザーIDと実行ユーザーIDは一致しますが, SUIDを設定すると実効ユーザーIDがコマンドファイル所有者へ変化します.

passwdコマンドを実行した状態でプロセス情報を調べると

1
2
% ps -eo ruser,euser,pid,cmd | grep passwd
ryo root       11092 passwd

実効ユーザーIDがrootになっていることがわかります.

What is “SGID(= Set Group ID)”?

Def: SGID

  • ファイルのグループIDが実効グループIDとして設定される仕組みのこと
  • SGIDではグループの実行権限がsとなる
  • ディレクトリに対してSGIDが設定された場合, そのディレクトリ以下において作成したファイルやサブディレクトリの所有グループには, 自動的にディレクトリ自体の所有グループが適用される

SGIDが設定されているディレクトリ例は以下があります

1
2
3
4
5
6
7
8
## permissionでSGIDが設定されているディレクトリを検索
% find /usr/bin/ -perm -g+s
/usr/bin/ssh-agent
/usr/bin/chage
/usr/bin/wall
/usr/bin/crontab
/usr/bin/write.ul
/usr/bin/expiry

SGIDの設定方法

chmodでSUIDを設定する場合は

  • オクタルモード: 2000を加算
  • シンボリックモード: g+sを付与
1
2
3
4
5
## オクタルモードで755に加えて設定したい場合
% sudo chmod 2755 test.sh

## シンボリックモード
% sudo chmod g+s test.sh

What is Sticky bit?

Def: スティッキービット

  • スティッキービットが設定されたディレクトリ以下のファイルとディレクトリは, 実際に設定したアクセス権に関係なく, ファイルのファイル名変更や削除は所有者とrootユーザしかできなくなる.
  • その他グループの実行権限がtとなる
1
2
%  ls -ld /tmp
drwxrwxrwt 32 root root 4096 Aug 16 12:46 /tmp/

/tmpでは多くのユーザーが作業できるようにアクセス権がすべて許可されていますが, あるユーザーが作成した ファイルを他のユーザーが消してしまうことを防ぐためにスティッキービットが設定されています.

スティッキービットの設定方法

chmodでスティッキービットを設定する場合は

  • オクタルモード: 1000を加算
  • シンボリックモード: o+tを付与
1
2
3
4
5
## オクタルモードで755に加えて設定したい場合
% sudo chmod 1755 test.sh

## シンボリックモード
% sudo chmod o+t test.sh

References



Share Buttons
Share on:

Feature Tags
Leave a Comment
(注意:GitHub Accountが必要となります)