私のCMSで、ディレクトリに実行可能ビット(+x
)ユーザーがそれらを開くように設定します。ディレクトリの読み取りに実行権限が必要なのはなぜですか?また、Linuxのディレクトリ権限はどのように機能しますか?
Linuxでディレクトリに権限を適用する場合、権限ビットは通常のファイルとは異なる意味を持ちます。
r
)を使用すると、影響を受けるユーザーはディレクトリ内のファイルを一覧表示できますw
)を使用すると、影響を受けるユーザーがディレクトリ内のファイルを作成、名前変更、または削除し、ディレクトリの属性を変更できますx
)は、影響を受けるユーザーがディレクトリに入り、内部のファイルとディレクトリにアクセスすることを許可しますT
、またはt
(実行ビットが他の場合に設定されている場合))は、そのディレクトリ内のファイルおよびディレクトリは、所有者(またはルート)まず、考えてみましょう:ディレクトリとは何ですか?これは、内部に存在するアイテム(ファイルおよびその他のディレクトリ)のリストにすぎません。だから:ディレクトリ=名前のリスト。
読み取りビット =設定されている場合、このリストを読み取ることができます。したがって、たとえば、poems
という名前のディレクトリがあるとします。
ls poems
内にあるアイテムのリストを取得します(-l
は詳細を明らかにしません!)。touch poems/so <TAB> poems/somefile
。poems
を作業ディレクトリにすることはできません(つまり、cd
をそこに入れます)。ビットを書き込む =設定されている場合、このリストを変更できます。つまり、リストの名前を{追加、名前変更、削除}できます。だが!実際に実行できるのは、実行ビットも設定されている場合のみです。
ビットを実行 =このディレクトリを作業ディレクトリ、つまりcd
にします。次のことを行う場合は、この権限が必要です。
興味深いケース1:ディレクトリへの書き込み+実行権限がある場合、それらのアイテムに書き込み権限がない場合でも、その中にあるアイテムを{delete、rename}できます。 (これを防ぐにはスティッキービットを使用してください)
興味深いケース2:ディレクトリに対する実行(書き込みではない)権限があり、その中に存在するファイルに対する書き込み権限がある場合、ファイルを削除することはできません(リストからの削除が含まれるため)。 。ただし、その内容は消去できます。テキストファイルの場合は、viを使用してファイルを開き、すべて削除できます。ファイルはまだ存在しますが、空になります。
概要:
読み取りビット =リストの名前を読み取ることができます。
書き込みビット =実行ビットも設定されている場合は、リストの名前を{追加、名前変更、削除}できます。
実行ビット =このディレクトリを作業ディレクトリにすることができます。
PS:Kusalanandaによって言及された記事は良い読み物です。
この表には、可能なすべての権限とその実際の影響を記載しています。
(*)ファイル名のみ:サイズや日付などの他の属性にはアクセスできません。例えば。タブキーを使用してオートコンプリートできますが、lsコマンドは使用できません。
いくつかの考え:
概要:
x
ビットが設定されたディレクトリにより、ユーザーはこのディレクトリにcd
(ディレクトリを変更)し、その中のファイルにアクセスできます。
詳細:
読み取り(r
)
このディレクトリに保存されているファイルの名前を読み取る機能。
書き込み(w
)
実行権限も持っている場合、ディレクトリ内のファイルの名前を変更する機能、新しいファイルを作成する機能、または既存のファイルを削除する機能。実行権限がない場合、書き込み権限は意味がありません。
実行(x
)
このディレクトリに
cd
して、このディレクトリ内のファイルにアクセスする機能。
以下に、理解を容易にするいくつかの例を示します。
# "Full Access". Reegen can list, create, delete, rename, delete,
# and stat any files in dir.
# Access to file contents is subject to the permissions
# of the file itself.
# New files can be created, any file can be deleted, regardless of
# file permissions.
drwx------ 1 reegen reegen 4096 Jan 01 2003 dir
# Reegen can do everything in the "Full Access" list except create,
# delete, or rename files in this directory.
dr-x------ 1 reegen reegen 4096 Jan 01 2003 dir
# Reegen can do everything in the "Full Access" list except list the
# filenames in this directory. If she suspects there is a file
# named "program" she can list it, but cannot do an 'ls'
# of the directory itself. She can access any file (file
# permissions permitting) if she knows its name. She can
# create new files, or rename/delete existing ones.
d-wx------ 1 reegen reegen 4096 Jan 01 2003 dir
# Reegen cannot create or delete any files in this directory.
# She can access any file (permissions permitting) if she
# knows its name already.
d--x------ 1 reegen reegen 4096 Jan 01 2003 dir
Hacking Linux Exposed記事 にはさらに詳しい情報があります。
Robert Love の本「LINUX System Programming」の第1章のセクションの許可から-
ファイルまたはディレクトリにアクセスする操作では、最初にファイルまたはディレクトリへのパスを解決する必要があります。解決には、最終パスコンポーネントを除く、パスに沿ったすべてのディレクトリに対する実行権限がユーザーに必要です。したがって、ディレクトリの場合、実行ビットは「解決可能」を意味すると考えることができます。
例としてパス_/a/b/c.txt
_を例にとります。ユーザーが1)_/
_および_/a
_に対する実行権限を持っているとします。 2)_/a/b
_に対する読み取り権限があります。 3)_/a/b/c.txt
_に対する読み取りおよび書き込み権限。
ユーザーには読み取り権限がないため、(リスト)_/a
_の読み取りに失敗します。しかし、パスの解決は失敗しません。
ユーザーは_/a/b
_に対する実行権限と_/
_に対する読み取り権限と_/a
_に対する読み取り権限を持っているため、ユーザーは_/a/b
_を読み取る(一覧表示する)ことができます。 _/a/b
_を読み取ると、ファイル名_c.txt
_は表示されますが、メタデータ(ファイルサイズなど)とコンテンツは表示されません。これは、ファイル名はファイルではなくディレクトリに保存されるためです。メタデータはファイルのiノードに保存されます。
_/a/b/c.txt
_から_/
_から_/a
_へのパスを解決するとき、ユーザーは_/a/b
_で失敗するため、ユーザーは_/a/b
_を読み取れません。実行権限を持っている。
パス名をファイルに解決する方法 も参照してください。
便利な例えは、各ファイルを本と見なし、各ディレクトリを本が保管されている部屋と見なすことです。
部屋のすべての名前をリストできるようにするルールがあります。ディレクトリの読み取りビットです。部屋から本を削除するためのルール:ディレクトリの書き込みビット。そして、部屋に入って探索するためのルール:結果のディレクトリ実行ビット。
これらのルールは、それぞれの本のルールとは異なり、異なります。誰かが本を開いてその内容を読み取ることを許可するルールがあります。各ファイルの読み取りビットです。ブックの内容を変更するためのルールがあります。各ファイルの書き込みビットです。そして、ファイルを実行するには、各ファイルの実行ビット。
各アクションには3つのビットがあるため、ビットを書き込みます。所有者には1つの読み取りビット、グループには1つの読み取りビット、他のすべてのユーザー(その他)には1つの読み取りビットがあります。これらの3ビットのいずれかが特定のユーザーに設定されている場合、そのユーザーは読み取りビットをアクティブにします。 serまたはg roupまたはo therによって、そのビットがどのようにアクティブであることが判明したかは関係ありません。同じ効果があります。結果。
したがって、ユーザーは部屋に入ることができ、図書館から本を削除できますが、同じ本の内容を読むことはできません。
これが、ディレクトリのreadビットが必要な理由です。ルームのコンテンツ(本のタイトル)をリストできるユーザーを制御するためです。
executeビットは、誰が本の部屋に入ることができるかを制御するために使用されます。
ディレクトリの実行の意味は非常に明確です。 Windowsとは異なり、トラバース権限がないため、何かをオーバーロードする必要があります。デザイナーは実行を選択しました、それは無限の混乱を引き起こします。コンピューターのセキュリティ担当者として、実際に実行するつもりのないものに実行権を割り当てると、実行は危険なように見えます。