🐧 Linux 総合学習プラットフォーム
セキュリティ/権限強化 ・ 中級

umaskと特殊権限(suid・sgid・sticky)

ファイルの権限は作られた瞬間から始まっています。その初期値を決めるのがumaskです。さらにLinuxには通常のrwxとは別に、suid・sgid・sticky bitという特殊な権限が存在し、passwdコマンドの仕組みや共有ディレクトリの運用、/tmpの安全性を支えています。ここでは、この見落とされがちな権限の層を丁寧に紐解きます。

ファイルを新しく作ると、権限は空っぽの状態からではなく、あらかじめ決まった初期値からスタートする。この初期値を決める仕組みがumaskだ。

Linuxのファイル権限はrwx(読み・書き・実行)の組み合わせで表されるが、通常のファイルは実行権限なしの666、ディレクトリは実行権限ありの777が理論上のフルオープンな状態になる。umaskは、この最大値から「引き算」して実際の初期権限を決める。

🔗
たとえumaskは新入社員に渡すロッカーの初期設定のようなものだ。全部開けっぱなしの状態からスタートするのではなく、あらかじめ「この扉は最初から閉めておく」というルールを差し引いてから鍵を渡すイメージになる。

➖ 022と077の違い

多くのディストリビューションでは、一般ユーザーのデフォルトumaskは022に設定されている。フルオープンの666から022を引くと644(所有者は読み書き、グループと他人は読み取りのみ)、777から引くと755(所有者は全権、グループと他人は読み取りと実行のみ)になる。

💡
ポイントumaskは「許可を足す」設定ではなく「許可を差し引く」設定だ。022は「グループと他人から書き込み権限だけを引く」という意味になる。
最大値(ファイル)666-umask022=実際の初期権限644ディレクトリは777から引く

一方、077というより厳しい値を使う環境もある。022との差は「グループにも権限を渡すか」だ。022はグループと他人の両方に読み取りを残すが、077はグループと他人の権限を丸ごと落とし、所有者本人しかアクセスできない状態にする。共有マシンでない個人サーバーや、秘密情報を多く扱うホームディレクトリでは077が好まれる。

つまずきumaskは既存ファイルの権限を変えない。あくまで「これから新規作成されるファイル・ディレクトリ」にだけ効く設定であることに注意する。

👑 suid(実行時だけ所有者権限)

通常、プログラムを実行すると、そのプログラムは実行した本人の権限で動く。ところが特定のプログラムに suid(set user id)というビットが立っていると、実行した人が誰であっても、そのファイルの所有者の権限で動作する。

この仕組みの代表例がpasswdコマンドだ。パスワードの実体は一般ユーザーが直接書き込めないファイルに保存されているが、passwdコマンド自体にはroot所有のsuidが立っており、一般ユーザーが実行しても内部的にはrootの権限でそのファイルを書き換えられる。

🔗
たとえsuidは「この作業台に限っては、誰が使っても持ち主の道具を使ってよい」という特別な許可証のようなものだ。作業台(プログラム)の外に出れば、その人はいつも通りの自分の権限に戻る。
コツあるファイルにsuidが立っているかどうかは、ls -l の権限表示で所有者の実行位置がxではなくsになっていることで見分けられる(例: -rwsr-xr-x)。
つまずきsuidは強力な分、任意のスクリプトや自作プログラムに安易に付けるのは危険だ。特にシェルスクリプトへのsuidは多くの環境で無効化されており、意図通りに動かないことがある。

👪 sgid(グループ継承)

sgid(set group id)はsuidのグループ版だが、ディレクトリに立てたときの挙動が実務でよく使われる。ディレクトリにsgidを立てると、そのディレクトリの中に新しく作られるファイルやサブディレクトリは、作成者の所属グループではなく、親ディレクトリのグループを自動的に引き継ぐ。

これは複数人で1つの共有ディレクトリを使うときに便利だ。sgidがないと、Aさんが作ったファイルはAさんのグループ、Bさんが作ったファイルはBさんのグループとバラバラになり、他のメンバーが編集できないことがある。sgidを立てておけば、誰が作っても同じグループになり、グループ全体で編集権限を揃えやすい。

💡
ポイント共有ディレクトリを作るなら、まずそのディレクトリの所有グループを揃え、そこにsgidを立てておくのが定石だ。以後に作られるファイルが自動でグループを継承する。

📌 sticky bit(消せるのは自分の物だけ)

sticky bitはディレクトリに立てる特殊権限で、代表例が /tmp だ。/tmpは誰でも書き込める共有の一時置き場だが、sticky bitがないと、そのディレクトリに書き込み権限を持つ誰もが、他人のファイルを削除できてしまう。

sticky bitを立てると、たとえディレクトリへの書き込み権限があっても、ファイルを削除・リネームできるのは「そのファイルの所有者」「ディレクトリの所有者」「root」に限定される。これにより、/tmpのような共有スペースでも、他人のファイルを勝手に消される心配がなくなる。

/tmp (sticky bit)A作成B作成Bは自分の物だけ削除可他人のA作成ファイルをBは削除できない
🔗
たとえsticky bitは、共有のごみ捨て場に「自分が出した袋しか回収してはいけません」という掲示を出すようなものだ。場所自体はみんなで使えるが、他人の荷物には手を出せない。

🔍 find -permで点検する

特殊権限が立ったファイルは強力な分、意図せず残っていると脆弱性になりうる。定期的にfindコマンドで洗い出す習慣が有効だ。

システム全体からsuidの立ったファイルを探す例。 $ find / -perm -4000 -type f 2>/dev/null /usr/bin/passwd /usr/bin/sudo 出力されたファイルが、本来suidが必要なものだけかを見比べる。
コツ-perm -4000 はsuid、-perm -2000 はsgid、-perm -1000 はsticky bitを検索する条件になる。心当たりのないsuidファイルを見つけたら、それが正規のパッケージ由来かを必ず確認する。

普段パッケージ管理経由でインストールしたソフトウェアのsuidは、そのままにしておいて問題ない場合がほとんどだ。注意すべきは、自分で手動コピーしたバイナリや、出所の分からない実行ファイルに気づかぬうちにsuidが付いているケースになる。

umask・suid・sgid・sticky bitは、どれも普段の ls -l では見落としがちな層だ。だが、この層を理解しておくと、権限まわりの「なぜこう動くのか」が一気につながって見えてくる。

この項目に出てくる用語

umaskゆーますく
新規作成されるファイルやディレクトリの初期権限を決める差し引き値。
suid・sgidえすゆーあいでぃー・えすじーあいでぃー
実行時に所有者・所属グループの権限で動作させる特殊なファイル権限。
sticky bitすてぃっきーびっと
共有ディレクトリで、自分が作成したファイルしか削除・リネームできなくする特殊権限。

▶ 学習アプリでこの続きを学ぶ・演習する