LinuxのSUID/SGID/スティッキービット入門|特殊パーミッションの仕組みと設定

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtipsセキュリティ > LinuxのSUID/SGID/スティッキービット入門|特殊パーミッションの仕組みと設定
「一般ユーザーなのに passwd でパスワードを変更できるのはなぜ」
「ls -l で出てくる rwsr-xr-x の s や、/tmp に付いている t は何を意味しているの」
通常の読み書き実行(rwx)は理解できても、この特殊な s や t でつまずく方は少なくありません。

これらは「特殊パーミッション」と呼ばれる仕組みで、SUID・SGID・スティッキービットの3種類があります。仕組みを正しく理解しておくと、権限まわりの動きが腑に落ち、セキュリティ上の落とし穴も避けられるようになります。

この記事では、SUID・SGID・スティッキービットそれぞれの意味と用途、chmod による記号指定と数値指定(4000・2000・1000)の両方の設定方法、passwd や /tmp の実例、そして設定時に必ず押さえておきたいセキュリティ上の注意点までを解説します。
動作確認は RHEL 9.4 / Ubuntu 24.04 LTS で行っています。

この記事のポイント

・ SUIDはファイル所有者の権限で実行させる仕組み(例:passwd)
・ SGIDはグループの権限継承、スティッキーは削除制限を行う
・ chmod は記号(u+s・g+s・+t)と数値(4000・2000・1000)で設定する
・ SUIDの付いたファイルは権限昇格の踏み台になり得るため要注意


LinuxのSUID/SGID/スティッキービット入門|特殊パーミッションの仕組みと設定

「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

特殊パーミッションとは|通常のrwxとの違い

特殊パーミッションに入る前に、通常のパーミッションを一度おさらいします。Linuxのファイルには「所有者・グループ・その他」の3区分ごとに、r(読み取り)・w(書き込み)・x(実行)の権限が設定されています。基本の読み方に不安がある方は、先にLinuxのパーミッション入門に目を通しておくと、この先がスムーズに理解できます。

特殊パーミッションは、この通常のrwxに「もう1段上の挙動」を加える仕組みです。通常の3区分(合計9ビット)に対して、特殊パーミッションは先頭にもう1桁を加えた4桁目で表現されます。

種類 記号指定 数値(4桁目) 主な対象
SUID u+s 4000 実行ファイル
SGID g+s 2000 実行ファイル・ディレクトリ
スティッキービット +t 1000 ディレクトリ

SUID(Set User ID)|所有者の権限で実行させる

SUIDが設定された実行ファイルは、それを実行したユーザーが誰であっても、「ファイル所有者の権限」で動作します。

代表例が /usr/bin/passwd です。一般ユーザーがパスワードを変更できるのは、passwdにroot所有のSUIDが設定されているためです。パスワードの実体(/etc/shadow)はrootしか書き込めませんが、passwdを実行する一瞬だけroot権限で動くことで、安全に変更が成立します。

# passwd の権限を確認する(所有者の x の位置が s になっている) [admin@server01 ~]$ ls -l /usr/bin/passwd -rwsr-xr-x 1 root root 27856 Feb 15 2024 /usr/bin/passwd

所有者の実行ビットの位置(4文字目)が x ではなく s になっているのがSUIDの目印です。

1. 記号指定で設定する

# u+s で SUID を付与する sudo chmod u+s /usr/local/bin/mytool # SUID を外す sudo chmod u-s /usr/local/bin/mytool

2. 数値指定で設定する(4000)

数値で指定する場合は、通常の3桁の前にSUIDを表す 4 を付けて4桁にします。たとえば 4755 は「SUID+所有者rwx・グループrx・その他rx」を意味します。

# 4755 = SUID(4) + rwxr-xr-x sudo chmod 4755 /usr/local/bin/mytool


LinuxのSUID/SGID/スティッキービット入門|特殊パーミッションの仕組みと設定 - 解説1

SGID(Set Group ID)|グループ権限の継承と共有ディレクトリ

SGIDは対象によって挙動が変わります。実行ファイルに付けると「所有グループの権限」で動作し、ディレクトリに付けると「その中で作られたファイルが親ディレクトリのグループを引き継ぐ」ようになります。

実務で特に役立つのが後者です。チームで共有するディレクトリにSGIDを付けておくと、誰がファイルを作っても自動的に共有グループに揃うため、「作った人のグループになっていて他のメンバーが触れない」というトラブルを防げます。

# 共有ディレクトリに SGID を付与(記号指定) sudo chmod g+s /var/shared/team # 数値指定なら 2 を先頭に付ける(2775) sudo chmod 2775 /var/shared/team # 確認(グループの x の位置が s になる) [admin@server01 ~]$ ls -ld /var/shared/team drwxrwsr-x 2 root devteam 4096 May 31 10:00 /var/shared/team

グループの実行ビットの位置(7文字目)が s になっているのがSGIDの目印です。

スティッキービット|共有ディレクトリの削除を制限する

スティッキービットをディレクトリに付けると、そのディレクトリ内のファイルは「ファイルの所有者とroot以外は削除・名前変更できない」状態になります。

代表例が /tmp です。/tmp は誰でも書き込めますが、もし削除も自由にできてしまうと、他人が作った一時ファイルを勝手に消せてしまいます。スティッキービットが、この事故を防いでいます。

# /tmp のスティッキービットを確認(その他の x の位置が t になる) [admin@server01 ~]$ ls -ld /tmp drwxrwxrwt 10 root root 4096 May 31 10:00 /tmp # スティッキービットを付与(記号指定) sudo chmod +t /var/shared/uploads # 数値指定なら 1 を先頭に付ける(1777) sudo chmod 1777 /var/shared/uploads

その他の実行ビットの位置(10文字目)が t になっているのがスティッキービットの目印です。

LinuxのSUID/SGID/スティッキービット入門|特殊パーミッションの仕組みと設定 - 解説2

大文字のS・Tに注意|実行ビットがない場合の落とし穴

特殊パーミッションを設定したときに、目印が小文字の st ではなく、大文字の ST で表示されることがあります。これは「もとの実行ビット(x)が付いていない」ことを示すサインです。

# 実行ビットなしで SUID を付けると大文字 S になる [admin@server01 ~]$ chmod 4644 sample ; ls -l sample -rwSr--r-- 1 admin admin 0 May 31 10:00 sample

小文字 s/t:実行ビット(x)があり、特殊パーミッションが有効に働く状態。
大文字 S/T:実行ビット(x)がなく、特殊パーミッションが意図通りに機能しない状態。

SUIDやSGIDを設定したのに思った通りに動かないときは、まずこの大文字・小文字を確認してください。実行ビットを付け直せば(例:chmod u+x)小文字に変わり、正しく機能するようになります。

セキュリティの注意点|SUIDは権限昇格の踏み台になる

SUIDは便利な仕組みですが、扱いを誤ると重大なセキュリティリスクになります。root所有のSUIDファイルに脆弱性があると、一般ユーザーがそれを突いてroot権限を奪う「権限昇格」の踏み台にされかねません。実際の攻撃でも、まず狙われるのがこの不要なSUIDファイルです。

1. SUIDファイルを棚卸しする

サーバーのセキュリティ監査では、システム全体のSUID/SGIDファイルを定期的に洗い出し、身に覚えのないものがないか確認します。

# SUID が設定されたファイルを全検索する(権限のないディレクトリのエラーは捨てる) sudo find / -perm -4000 -type f 2>/dev/null # SGID が設定されたファイルを全検索する sudo find / -perm -2000 -type f 2>/dev/null

出力されたファイルの中に、自分でインストールした覚えのないものや、明らかに不要なものがあれば、SUIDを外す(chmod u-s)ことを検討します。

2. 自作スクリプトにSUIDを付けても効かない

実務でよくある誤解が、「シェルスクリプトにSUIDを付ければroot権限で動かせる」というものです。

現在のLinuxカーネルは、セキュリティ上の理由から、スクリプト(シェルスクリプトなど)に付けられたSUIDを無視します。SUIDが効くのはコンパイル済みのバイナリだけです。スクリプトを特権で実行したい場合は、SUIDではなく sudo の設定(visudo)で対象コマンドを限定して許可するのが、安全で正しい方法です。

LinuxのSUID/SGID/スティッキービット入門|特殊パーミッションの仕組みと設定 - まとめ

本記事のまとめ

特殊パーミッションは「s・t という目印」と「4桁目の数値」をセットで覚えると、見ても設定しても迷わなくなります。

やりたいこと コマンド
SUIDを付ける(実行ファイル) chmod u+s ファイル名
SGIDを付ける(共有ディレクトリ) chmod 2775 ディレクトリ名
スティッキービットを付ける chmod 1777 ディレクトリ名
SUIDファイルを棚卸しする find / -perm -4000 -type f
chmod・chown・umaskを含めた権限まわり全体を体系的に押さえたい方は、Linuxのファイル権限完全ガイドも合わせてご覧ください。特殊パーミッションは強力なぶん、設定する前に「本当に必要か」を一度立ち止まって考える習慣が、安全な運用につながります。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、20年以上の運用経験を持つ現役エンジニアが基礎から教えます。
Linux無料マニュアルを受け取る >>

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。