はじめに
UNIX系における権限管理用語である「スティッキービット」ですが、説明は以下。
スティッキービットがディレクトリにセットされると、ディレクトリ配下のファイルのファイル名変更や削除はそのファイルの所有者、ディレクトリの所有者、スーパーユーザーのいずれかしかできなくなる。
役割は確かに記載の通りなんですが、ここをもう少し深掘りして「なぜスティッキービットがありがたいのか」という観点で解説しました。
スティッキービットが必要な理由
Linuxのファイルシステムにおける重要な点として、ファイルの書き込み権限が無くても、そのファイルが置かれているディレクトリに書込み権限があればファイルは削除可能という前提があります。
例えばテスト用のディレクトリにOtherの書き込み権限を与えるとします。これによって全ユーザが同ディレクトリ配下にファイル作成ができます。
# ls -ld /test drwxrwxrwx XX root system XX ... /test
このような状況で同ディレクトリにrootユーザでファイルaを作成します。
# touch a # ls -l /test/a -rw------- XX root system XX ... a
このファイル、権限だけを見るとrootユーザ以外は読むことも書き込むことも消すこともできないように見えます。
しかし、実態はファイルaはroot以外でも削除できてしまいます。
試しに個人ユーザにスイッチ後、cat,echo,rmを押下した結果は以下。ちなみにそれぞれが読み取り書き込み消去に対応しています。
$ cat a cat: a を開けません。 $ echo hoge >> a 指定されたアクションにはファイルのアクセス権がありません。 $ rm a rm : a を除去しますか y $ ls -l /test/a ls: ファイル/test/a が存在しません。
ここから安易にディレクトリにother書き込み権限を与えるのは危険であることが分かります。
スティッキービットの役割
本題ですが、要件によっては全ユーザが書き込み可能なディレクトリを用意したいケースはあると思います。
そこで登場するのがスティッキービット。もう一度冒頭の説明を再掲します。
スティッキービットがディレクトリにセットされると、ディレクトリ配下のファイルのファイル名変更や削除はそのファイルの所有者、ディレクトリの所有者、スーパーユーザーのいずれかしかできなくなる。
これによって全ユーザに書き込み権限を付与しながら削除自体はファイル所有者に限定するような制限をかけることが可能となります。例えばUNIX系だと/tmpディレクトリはスティッキービットがデフォルトで設定されています。
# ls -ld /tmp drwxrwxrwt XX bin bin XX ... /tmp
終わりに
英語圏では「restricted deletion bit」と説明されたりするスティッキービットですが、ディレクトリにOther権限を付与したい場合の設計で利用します。ちなみにディレクトリにOther書き込み権限を付与することはi-node情報の更新を許容することに等しいので、この動き自体は正常な挙動でもあります。
以上、ご参考になれば幸いです。