言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

Linux & Mac & Bashコマンド辞典

  1. トップページ
  2. Linux & Mac & Bashコマンド辞典
  3. 特殊権限(setuid / setgid / sticky bit)

特殊権限(setuid / setgid / sticky bit)

『Linux』には通常の読み取り・書き込み・実行権限に加え、setuidsetgidsticky bit という3つの特殊権限があります。setuid はファイルの所有者の権限で実行させる仕組みで、/usr/bin/passwd が root 権限でパスワードファイルを書き換える際に使われています。setgid はディレクトリに設定するとそこに作成されたファイルが親ディレクトリのグループを継承します。sticky bit/tmp に設定されており、自分以外のユーザーが作成したファイルを削除できないようにします。

構文

# -----------------------------------------------
#  特殊権限の付与・確認
# -----------------------------------------------

# chmod でシンボル指定する場合
#   u+s  → setuid  (所有者の実行ビットに s を立てる)
#   g+s  → setgid  (グループの実行ビットに s を立てる)
#   +t   → sticky  (その他の実行ビットに t を立てる)
#   例: sudo chmod u+s /usr/local/bin/kof_tool
#   例: sudo chmod g+s /home/kof_team/shared
#   例: sudo chmod +t /tmp/kof_arena

# chmod で数値指定する場合
#   chmod {特殊ビット}{rwx通常権限} {ファイル/ディレクトリ}
#     特殊ビットは3桁の先頭に付加する4ビット目
#     4 → setuid
#     2 → setgid
#     1 → sticky bit
#   例: sudo chmod 4755 /usr/local/bin/kof_tool   # setuid + rwxr-xr-x
#   例: sudo chmod 2775 /home/kof_team/shared      # setgid + rwxrwxr-x
#   例: sudo chmod 1777 /tmp/kof_arena             # sticky + rwxrwxrwx

# 権限の確認(ls -l の出力で特殊ビットを確認できます)
#   所有者の実行ビット部分が s → setuid が有効
#   グループの実行ビット部分が s → setgid が有効
#   その他の実行ビット部分が t → sticky bit が有効
#   小文字の s / t → 実行権限あり+特殊ビットあり
#   大文字の S / T → 実行権限なし+特殊ビットのみ(意図しない設定の可能性あり)
ls -l /usr/bin/passwd
ls -l /tmp

構文一覧

特殊権限設定コマンド(シンボル)設定コマンド(数値)説明
setuidchmod u+s {ファイル}chmod 4{xxx} {ファイル}実行時にファイル所有者の権限で動作します。/usr/bin/passwd が root 権限でパスワードファイルを更新する際に使われています。
setgid(ファイル)chmod g+s {ファイル}chmod 2{xxx} {ファイル}実行時にファイルのグループ権限で動作します。グループ共有のコマンドに使用します。
setgid(ディレクトリ)chmod g+s {ディレクトリ}chmod 2{xxx} {ディレクトリ}ディレクトリ内に作成されたファイルのグループが、親ディレクトリのグループを自動継承します。チーム共有ディレクトリに便利です。
sticky bitchmod +t {ディレクトリ}chmod 1{xxx} {ディレクトリ}ディレクトリ内のファイルをファイル所有者・ディレクトリ所有者・root のみが削除できるようにします。/tmp に標準設定されています。
権限の削除(setuid)chmod u-s {ファイル}setuid を無効化します。
権限の削除(setgid)chmod g-s {ファイル/ディレクトリ}setgid を無効化します。
権限の削除(sticky bit)chmod -t {ディレクトリ}sticky bit を無効化します。
特殊権限の検索find {パス} -perm /4000setuid が設定されたファイルを検索します。/2000 で setgid、/1000 で sticky bit を検索できます。

使用例

/usr/bin/passwd の setuid を確認する
# -----------------------------------------------
#  passwd コマンドの setuid を確認します
# -----------------------------------------------

# ls -l で権限を表示します
# 所有者の実行ビットが s になっていれば setuid が有効です
ls -l /usr/bin/passwd

実行するコマンドは次の通りです。

$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 59976  3月 22 06:28 /usr/bin/passwd

実装例は次の通りです。

# -----------------------------------------------
#  一般ユーザー kyo でパスワードを変更する
# -----------------------------------------------

# kyo ユーザーとして passwd を実行します
# setuid により root 権限で /etc/shadow を書き換えられます
# (一般ユーザーは直接 /etc/shadow を編集できません)
passwd

実行するコマンドは次の通りです。

$ id
uid=1001(kyo) gid=1001(kyo) groups=1001(kyo)
$ passwd
現在のパスワード:
新しいパスワード:
新しいパスワードを再入力してください:
passwd: パスワードは正しく更新されました
setgid をディレクトリに設定してチーム共有フォルダを作る
# -----------------------------------------------
#  KOF チーム共有ディレクトリに setgid を設定します
# -----------------------------------------------

# kof_team グループを作成します
sudo groupadd kof_team

# kyo と iori をグループに追加します
sudo usermod -aG kof_team kyo
sudo usermod -aG kof_team iori

# 共有ディレクトリを作成してグループを設定します
sudo mkdir /home/kof_team/shared
sudo chown root:kof_team /home/kof_team/shared

# setgid を設定します(グループの実行ビットが s になります)
sudo chmod 2775 /home/kof_team/shared

# 設定を確認します
ls -ld /home/kof_team/shared

実行するコマンドは次の通りです。

$ ls -ld /home/kof_team/shared
drwxrwsr-x 2 root kof_team 4096  3月 25 10:00 /home/kof_team/shared

実装例は次の通りです。

# -----------------------------------------------
#  kyo がファイルを作成するとグループが自動継承されます
# -----------------------------------------------

# kyo ユーザーで共有ディレクトリにファイルを作成します
touch /home/kof_team/shared/kyo_movelist.txt

# ファイルのグループが kof_team になっていることを確認します
# setgid がなければ kyo の主グループ(kyo)になります
ls -l /home/kof_team/shared/kyo_movelist.txt

実行するコマンドは次の通りです。

$ ls -l /home/kof_team/shared/kyo_movelist.txt
-rw-rw-r-- 1 kyo kof_team 0  3月 25 10:05 /home/kof_team/shared/kyo_movelist.txt
/tmp の sticky bit を確認する
# -----------------------------------------------
#  /tmp の sticky bit を確認します
# -----------------------------------------------

# ls -ld でその他の実行ビットが t になっていれば sticky bit が有効です
ls -ld /tmp

実行するコマンドは次の通りです。

$ ls -ld /tmp
drwxrwxrwt 18 root root 4096  3月 25 10:10 /tmp

実装例は次の通りです。

# -----------------------------------------------
#  sticky bit による削除制限の動作を確認します
# -----------------------------------------------

# kyo が /tmp にファイルを作成します
touch /tmp/kyo_temp.txt
chmod 777 /tmp/kyo_temp.txt

# iori がそのファイルを削除しようとします
# sticky bit があるため、自分が作成していないファイルは削除できません
rm /tmp/kyo_temp.txt  # iori として実行

実行するコマンドは次の通りです。

$ id
uid=1002(iori) gid=1002(iori) groups=1002(iori)
$ rm /tmp/kyo_temp.txt
rm: '/tmp/kyo_temp.txt' を削除できません: 許可されていない操作です
setuid が設定されたファイルをシステム全体から検索する
# -----------------------------------------------
#  setuid・setgid ファイルをセキュリティ確認のために検索します
# -----------------------------------------------

# setuid が設定されたファイルを / 以下から検索します
# セキュリティ監査で不審な setuid ファイルを発見するために使います
sudo find / -perm /4000 -type f 2>/dev/null

# setgid が設定されたファイル・ディレクトリを検索します
sudo find / -perm /2000 2>/dev/null

# setuid と setgid の両方を一括検索します
sudo find / -perm /6000 -type f 2>/dev/null

実行するコマンドは次の通りです。

$ sudo find /usr/bin -perm /4000 -type f 2>/dev/null
/usr/bin/passwd
/usr/bin/sudo
/usr/bin/newgrp
/usr/bin/chsh
/usr/bin/chfn
/usr/bin/gpasswd
/usr/bin/mount
/usr/bin/su
/usr/bin/umount

概要

setuid・setgid・sticky bit は、通常の chmod / chown で管理する rwx 権限の上位に位置する特殊なアクセス制御の仕組みです。setuid はファイルを実行した際に「実行者」ではなく「ファイル所有者」の権限で動作させる機能で、/usr/bin/passwd のように一般ユーザーが root 専用ファイル(/etc/shadow)を安全に更新できる場面で使われています。setgid をディレクトリに設定するとメンバーが作成したファイルのグループが自動継承されます。sticky bit はパブリックな書き込みディレクトリ(/tmp など)で他ユーザーのファイルを誤削除・意図的削除から守る仕組みです。一方でセキュリティリスクもあり、不用意に setuid を付与したプログラムが悪用されると root 権限での任意コード実行につながります。find / -perm /4000 を定期実行して不審な setuid ファイルが追加されていないか監視することが重要です。ファイル権限の基礎については chmod / chown のページを参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。