0 / 4
スティッキービット(Sticky Bit)
Linuxでファイルを削除できるかどうかは、そのファイルの権限ではなく、ファイルが入っているディレクトリの書き込み権限で決まる。ファイルを削除すると、実際にはディレクトリのファイル一覧からその名前が消えるからだ。そのため、すべてのユーザーに書き込み権限がある共有ディレクトリでは他人のファイルも削除できる。スティッキービットはこれを防ぐ特殊権限だ。
例: Aliceが共有ディレクトリ/sharedに作ったファイルを、Bobが削除しようとする。
1 / 4
Alice: ファイルを作る
Aliceが/sharedにalice.txtを作る。ディレクトリの書き込み権限がすべてのユーザーにあるのでできることだ。ファイルの所有者はAlice、権限はrw-r--r--だ。内容を変更できるのはAliceだけで、ほかのユーザーには読み取り権限しかない。
2 / 4
Bob: alice.txtを削除
Bobがalice.txtを削除するコマンドを実行する。このファイルの所有者ではないので、ファイルの権限で見れば読み取りしか許されない。しかしOSは削除できるかを判断するとき、ファイルの権限を見ない。コマンドに付けた-fは、確認せずに削除するオプションだ。
3 / 4
OS: ディレクトリの権限を確認
OSが/sharedの権限を見る。Bobはディレクトリの所有者(root)でもrootグループのメンバーでもないので、「その他」の欄に従う。その欄に書き込み(w)があるので、Bobもこのディレクトリでファイルを作ったり削除したりできる。実行の欄はtではなくxなので、スティッキービットもない。ファイルの所有者が誰かは確かめずに先へ進む。
4 / 4
結果: Aliceのファイルが削除された
alice.txtがディレクトリの一覧から消え、削除される。所有者のAliceは許可していない。スティッキービットのない共有ディレクトリでは、ファイルの権限をどれだけ絞っても他人による削除は防げない。
1 / 5
Alice: ファイルを作る
Aliceが/tmpにalice.txtを作る。スティッキービットがあっても、ファイルは誰でも作れる。止められるのは、他人のファイルの削除と名前の変更だけだ。
2 / 5
Bob: alice.txtを削除
Bobが前のタブと同じコマンドでalice.txtを削除しようとする。
3 / 5
OS: 所有者かを確認
Bobにはディレクトリの書き込み権限がある。しかし「その他」の実行の欄がtなので、スティッキービットが設定されている。OSはさらに、Bobがファイルの所有者か、ディレクトリの所有者か、rootかを確かめる。どれにも当たらない。
4 / 5
結果: 削除を拒否
OSは削除を拒否し、「Operation not permitted」(許可されていない操作)エラーを返す。ファイルalice.txtはそのまま残る。mvで名前を変えようとしても同じように拒否される。
5 / 5
Bob: 自分のファイルを削除
bob.txtはBob自身のファイルなので、そのまま削除される。Aliceがalice.txtを、rootがどのファイルを削除する場合も同じだ。スティッキービットは自分のファイルを削除することまでは止めない。
1 / 4
10文字を区切って読む
先頭のdはディレクトリを表す。残りの9文字は3文字ずつ順に、所有者、グループ、その他の権限だ。「その他」は所有者でもそのグループのメンバーでもないユーザー全員だ。権限がない欄には-が入る。
2 / 4
スティッキービットを設定するとt
rootがchmod +tでスティッキービットを設定する。「その他」の実行の欄のxが小文字のtに変わる。小文字のtは、実行権限とスティッキービットの両方があるときに表示される。
3 / 4
数字では1777
数字ではchmod 1777のように、権限777の前に1を付ける。先頭の桁が特殊権限を表し、1がスティッキービットだ。この桁に4を書くとSetUID、2を書くとSetGIDという別の特殊権限が設定される。
4 / 4
実行権限がなければT
「その他」の実行権限なしでスティッキービットを設定すると(chmod 1776)、その欄が大文字のTで表示される。実行権限があれば小文字のt、なければ大文字のTだ。