umaskと特殊権限(suid・sgid・sticky)
ファイルの権限は作られた瞬間から始まっています。その初期値を決めるのがumaskです。さらにLinuxには通常のrwxとは別に、suid・sgid・sticky bitという特殊な権限が存在し、passwdコマンドの仕組みや共有ディレクトリの運用、/tmpの安全性を支えています。ここでは、この見落とされがちな権限の層を丁寧に紐解きます。
ファイルを新しく作ると、権限は空っぽの状態からではなく、あらかじめ決まった初期値からスタートする。この初期値を決める仕組みがumaskだ。
Linuxのファイル権限はrwx(読み・書き・実行)の組み合わせで表されるが、通常のファイルは実行権限なしの666、ディレクトリは実行権限ありの777が理論上のフルオープンな状態になる。umaskは、この最大値から「引き算」して実際の初期権限を決める。
➖ 022と077の違い
多くのディストリビューションでは、一般ユーザーのデフォルトumaskは022に設定されている。フルオープンの666から022を引くと644(所有者は読み書き、グループと他人は読み取りのみ)、777から引くと755(所有者は全権、グループと他人は読み取りと実行のみ)になる。
一方、077というより厳しい値を使う環境もある。022との差は「グループにも権限を渡すか」だ。022はグループと他人の両方に読み取りを残すが、077はグループと他人の権限を丸ごと落とし、所有者本人しかアクセスできない状態にする。共有マシンでない個人サーバーや、秘密情報を多く扱うホームディレクトリでは077が好まれる。
👑 suid(実行時だけ所有者権限)
通常、プログラムを実行すると、そのプログラムは実行した本人の権限で動く。ところが特定のプログラムに suid(set user id)というビットが立っていると、実行した人が誰であっても、そのファイルの所有者の権限で動作する。
この仕組みの代表例がpasswdコマンドだ。パスワードの実体は一般ユーザーが直接書き込めないファイルに保存されているが、passwdコマンド自体にはroot所有のsuidが立っており、一般ユーザーが実行しても内部的にはrootの権限でそのファイルを書き換えられる。
👪 sgid(グループ継承)
sgid(set group id)はsuidのグループ版だが、ディレクトリに立てたときの挙動が実務でよく使われる。ディレクトリにsgidを立てると、そのディレクトリの中に新しく作られるファイルやサブディレクトリは、作成者の所属グループではなく、親ディレクトリのグループを自動的に引き継ぐ。
これは複数人で1つの共有ディレクトリを使うときに便利だ。sgidがないと、Aさんが作ったファイルはAさんのグループ、Bさんが作ったファイルはBさんのグループとバラバラになり、他のメンバーが編集できないことがある。sgidを立てておけば、誰が作っても同じグループになり、グループ全体で編集権限を揃えやすい。
📌 sticky bit(消せるのは自分の物だけ)
sticky bitはディレクトリに立てる特殊権限で、代表例が /tmp だ。/tmpは誰でも書き込める共有の一時置き場だが、sticky bitがないと、そのディレクトリに書き込み権限を持つ誰もが、他人のファイルを削除できてしまう。
sticky bitを立てると、たとえディレクトリへの書き込み権限があっても、ファイルを削除・リネームできるのは「そのファイルの所有者」「ディレクトリの所有者」「root」に限定される。これにより、/tmpのような共有スペースでも、他人のファイルを勝手に消される心配がなくなる。
🔍 find -permで点検する
特殊権限が立ったファイルは強力な分、意図せず残っていると脆弱性になりうる。定期的にfindコマンドで洗い出す習慣が有効だ。
普段パッケージ管理経由でインストールしたソフトウェアのsuidは、そのままにしておいて問題ない場合がほとんどだ。注意すべきは、自分で手動コピーしたバイナリや、出所の分からない実行ファイルに気づかぬうちにsuidが付いているケースになる。
umask・suid・sgid・sticky bitは、どれも普段の ls -l では見落としがちな層だ。だが、この層を理解しておくと、権限まわりの「なぜこう動くのか」が一気につながって見えてくる。