特殊権限(setuid / setgid / sticky bit)
『Linux』には通常の読み取り・書き込み・実行権限に加え、setuid・setgid・sticky 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
構文一覧
| 特殊権限 | 設定コマンド(シンボル) | 設定コマンド(数値) | 説明 |
|---|---|---|---|
| setuid | chmod u+s {ファイル} | chmod 4{xxx} {ファイル} | 実行時にファイル所有者の権限で動作します。/usr/bin/passwd が root 権限でパスワードファイルを更新する際に使われています。 |
| setgid(ファイル) | chmod g+s {ファイル} | chmod 2{xxx} {ファイル} | 実行時にファイルのグループ権限で動作します。グループ共有のコマンドに使用します。 |
| setgid(ディレクトリ) | chmod g+s {ディレクトリ} | chmod 2{xxx} {ディレクトリ} | ディレクトリ内に作成されたファイルのグループが、親ディレクトリのグループを自動継承します。チーム共有ディレクトリに便利です。 |
| sticky bit | chmod +t {ディレクトリ} | chmod 1{xxx} {ディレクトリ} | ディレクトリ内のファイルをファイル所有者・ディレクトリ所有者・root のみが削除できるようにします。/tmp に標準設定されています。 |
| 権限の削除(setuid) | chmod u-s {ファイル} | — | setuid を無効化します。 |
| 権限の削除(setgid) | chmod g-s {ファイル/ディレクトリ} | — | setgid を無効化します。 |
| 権限の削除(sticky bit) | chmod -t {ディレクトリ} | — | sticky bit を無効化します。 |
| 特殊権限の検索 | find {パス} -perm /4000 | — | setuid が設定されたファイルを検索します。/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 のページを参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。