rmが別のユーザーの所有権の下でファイルを削除できるのはなぜですか?


52

投稿からなぜ読み取り専用ファイルをrmで削除できるのですか?rmファイルを削除するには、ディレクトリへの書き込み許可が必要なだけだと理解しています。しかし、所有者とグループが異なるファイルを簡単に削除できる動作を消化するのは難しいと思います。

私は次を試しました

mtk:私のユーザー名
abc:新しいユーザーを作成しました

$ ls -l file
-rw-rw-r-- 1 mtk mtk       0 Aug 31 15:40 file
$ sudo chown abc file
$ sudo chgrp abc file
$ ls -l file
-rw-rw-r-- 1 abc abc       0 Aug 31 15:40 file
$ rm file
$ ls -l file
<deleted>

私はこれが許可されるべきではないと考えていました。ユーザーは、所有権のあるファイルのみを削除できますか?誰かがこれが許可されている理由を明らかにできますか?そして、これを避ける方法は何ですか?親ディレクトリの書き込み許可を制限するだけで、ファイルの不意の削除を禁止できます。

回答:


100

これが許可される理由は、ファイルの削除が実際に行うことと関連しています。概念的に、rmの仕事はディレクトリから名前エントリを削除することです。ファイルがファイルの唯一の名前である場合、ファイルに到達できなくなる可能性があり、そのため、その時点でファイルが占有しているiノードとスペースを回復できるという事実は、ほとんど偶発的なものです。rmコマンドが呼び出すシステムコールの名前は、unlinkこの事実を示唆しています。

また、ディレクトリから名前エントリを削除することは、基本的にそのディレクトリに対する操作であるため、そのディレクトリは書き込み権限を持っている必要があります。


次のシナリオは、より快適に感じるかもしれませんか?ディレクトリがあるとします:

/home/me    # owned and writable only by me
/home/you   # owned and writable only by you

そして、私が所有し、2つのハードリンクを持つファイルがあります。

/home/me/myfile
/home/you/myfile

そもそもそのハードリンク/home/you/myfileがどのようにそこに到達したか気にしないでください。たぶんrootそこに置いてください。

この例の考え方は、ハードリンクを削除できるようにすることです/home/you/myfile。結局のところ、それはあなたのディレクトリを混乱させていますあなたはありませんし、内部に存在しないものを制御することができるはずです/home/you。また、removeを実行すると/home/you/myfile、実際にファイルを削除していないことに注意してください。リンクを1つだけ削除しました。


スティッキービットは、ファイルを含むディレクトリに設定されている場合ことに注意してください(などのショーアップtls)、あなたがやる(あなたがディレクトリを所有していない限り)それを削除することが許可されるために、ファイルの所有者である必要性を。通常、スティッキービットはオンに設定されてい/tmpます。


6
ディレクトリのスティッキービットを使用して、ファイルを変更して削除できるようにする必要があります。つまり、ファイルがあなたと同じグループの他の誰かに属していて、そのグループがファイルに書き込みを行っている場合、そのファイルを削除できます。当然:誰でもファイルをパブリックの書き込み許可で削除できます。(もちろん、ディレクトリを変更できることを条件とします。)
ジョナサンレフラー

1
私はあなたを誤解しているかもしれませんが、私はそれを書くことが許可されているので、私は-rw-rw-rw- 1 root root 0 Sep 1 11:11 /tmp/foo通常のユーザーとして削除することができます(/tmpスティッキーです)?まだできません。
セラダ

4
ユーザー(ファイルを所有していない人)がリンクを作成したと仮定すると、me/ youシナリオがより明確に焦点を当てると信じています。代名詞は使いにくいです。たとえば、Alが作成し/home/al/file1、Bobが実行(およびおそらく読み取り)アクセス権を持ち/home/al、ファイルをにハードリンクするとします/home/bob/als_file。ボブは、リンクを削除することを防止しなければならないことを彼が作成しましたか?  そして、Alに/home/bob/als_file書き込みアクセス権がない場合、Alに削除(リンク解除)を許可する必要があります/home/bobか?この道は混乱を招きます。
スコット

2
@JonathanLeffler:Scottの例が示すように、ハードリンクがある場合、いいえ、リンク解除および切り捨ては最終的に同じ結果にはなりませ
ケビン

6
@Kevinポイントは、誰かがファイルへの書き込み許可を持っている場合、コンテンツを破壊できる場合、リンクを解除することも許可されるかもしれないと思います(ディレクトリへの書き込み許可も持っていると仮定して)。逆は当てはまりません。あるディレクトリからファイルを削除できるからといって、別のディレクトリからアクセスできる可能性があるため、コンテンツを破壊できるわけではありません。これが、スティッキービットの動作の背後にあるロジックです。
バーマー

9

ファイルを削除するには、ファイルが存在するディレクトリに書き込むことができる必要があります。

あなたは、このようにしないと経由して、あなたは「スティッキー」ビットを設定することができchmod +t dirますが、途中、最近のOS上にある場合(この機能は、SunOSの1986年を中心に導入されました)。

よりきめ細かくしたい場合は、ZFSのような最新のACL実装を備えたファイルシステムが必要です。NTFSに基づく標準のNFSv4 ACLには、ユーザーごとのファイル固有の削除アクセス許可とディレクトリの「delete_child」アクセス許可のサポートが含まれています。


9
tビットを追加するには、ディレクトリを所有する必要があることに注意してください。ディレクトリを所有している場合、tビットが設定されているかどうかに関係なく、いつでもファイルを削除できます。ファイルを他の誰かのディレクトリにリンクする場合、他の誰かがそれを削除できるように準備する必要があります。別の方法として、最初にサブディレクトリを作成し、代わりにファイルを追加します。所有者はそのサブディレクトリが空でない場合、そのサブディレクトリを削除できないためです。
ステファンシャゼル

6
誤解を招くような方法で状況を説明します。技術的には、ファイルはディレクトリにありません。むしろ、ファイルの名前はディレクトリ内にありrm、ファイル上ではなくディレクトリ上での操作です。ファイルは、最後の参照が削除されると削除されますが、技術的には副作用です。
reinierpost

0

ロジックは家のロジックと似ています。所有者またはテナントは、ゲストの所有者に関係なく、どのゲストを捨てるかを決定します。また、別の家で歓迎されている(他の誰かのディレクトリに別のハードリンクがある)追い出されたゲストは、外で凍結することはありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.