(O+P)ut

ITエンジニアのアウトプット録



(O+P)ut

OutPut Log by SE

スティッキービットはなぜ必要なのか

スティッキービットが必要な理由

スティッキービットの説明は以下のような記載が多いです。

スティッキービットがディレクトリにセットされると、ディレクトリ配下のファイルのファイル名変更や削除はそのファイルの所有者、ディレクトリの所有者、スーパーユーザーのいずれかしかできなくなる。

確かにその通りなんですが、この記載は大事な前提が抜けているので初学者の人にはあまり必要性がピンとこないです。


その大事な前提とは
ファイルの書き込み権限が無くても、そのファイルが置かれているディレクトリに書込み権限があればファイルは削除可能
ということです。

以下、説明します。

読めないが消せる不思議

ディレクトリに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以外でも削除できてしまいます。


個人ユーザにスイッチ catechormを順に試していきます。
それぞれ、読み取り、書き込み、消去に対応しています。

$ 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

ちなみに、英語圏だとスティッキービットは「restricted deletion bit」と説明されたりします。削除を制限するビット、その通りですね。

以上です。ご参考になれば幸いです。

*1:権限としてi-node情報が更新できてしまう事に起因しています。要は、「ファイルを見えなくしてしまう=消す」ということが権限上できてしまいます。