はじめに
スティッキービットの説明は以下のような記載が多いです。
スティッキービットがディレクトリにセットされると、ディレクトリ配下のファイルのファイル名変更や削除はそのファイルの所有者、ディレクトリの所有者、スーパーユーザーのいずれかしかできなくなる。
確かにその通りなんですが、この記載は大事な前提が抜けているので初学者の人にはあまり必要性がピンとこないです。
本記事では「なぜスティッキービットという概念があるのか?」について分かりやすく解説しました。
スティッキービットが必要な理由
冒頭に述べた大事な前提とは
ファイルの書き込み権限が無くても、そのファイルが置かれているディレクトリに書込み権限があればファイルは削除可能
ということです。
どういうことでしょうか?
読めないが消せる不思議
ディレクトリに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 が存在しません。
中を読めないし書き込めないファイルが何故か消せてしまいます。
*1
安易にディレクトリにother書き込み権限を与えるのは危険ということが分かります。
スティッキービットのありがたさ
そうはいっても、みんなが書き込みができる場所は必要な場合があります。
そんな時に登場するのがスティッキービットとなります。
もう一度文頭の説明を再掲します。
スティッキービットがディレクトリにセットされると、ディレクトリ配下のファイルのファイル名変更や削除はそのファイルの所有者、ディレクトリの所有者、スーパーユーザーのいずれかしかできなくなる。
スティッキービットの必要性が感じられるのではないでしょうか。
UNIX系だと、/tmp はスティッキービットが設定されています。
# ls -ld /tmp drwxrwxrwt XX bin bin XX ... /tmp
終わりに
UNIX系OSにて利用されるスティッキービットですが、英語圏では「restricted deletion bit」と説明されたりします。
直訳すると「削除を制限するビット」なのでこちらの方が言い得て妙ですね。
以上です。ご参考になれば幸いです。
*1:権限としてi-node情報が更新できてしまう事に起因しています。要は、「ファイルを見えなくしてしまう=消す」ということが権限上できてしまいます。