web-dev-qa-db-ja.com

実行対読み取りビット。 Linuxのディレクトリ権限はどのように機能しますか?

私のCMSで、ディレクトリに実行可能ビット(+x)ユーザーがそれらを開くように設定します。ディレクトリの読み取りに実行権限が必要なのはなぜですか?また、Linuxのディレクトリ権限はどのように機能しますか?

402
Nick.h

Linuxでディレクトリに権限を適用する場合、権限ビットは通常のファイルとは異なる意味を持ちます。

  • 読み取りビットr)を使用すると、影響を受けるユーザーはディレクトリ内のファイルを一覧表示できます
  • 書き込みビットw)を使用すると、影響を受けるユーザーがディレクトリ内のファイルを作成、名前変更、または削除し、ディレクトリの属性を変更できます
  • 実行ビットx)は、影響を受けるユーザーがディレクトリに入り、内部のファイルとディレクトリにアクセスすることを許可します
  • スティッキービットT、またはt(実行ビットが他の場合に設定されている場合))は、そのディレクトリ内のファイルおよびディレクトリは、所有者(またはルート)
378
Chris Down

まず、考えてみましょう:ディレクトリとは何ですか?これは、内部に存在するアイテム(ファイルおよびその他のディレクトリ)のリストにすぎません。だから:ディレクトリ=名前のリスト。

読み取りビット =設定されている場合、このリストを読み取ることができます。したがって、たとえば、poemsという名前のディレクトリがあるとします。

  • あなたはできる ls poems内にあるアイテムのリストを取得します(-lは詳細を明らかにしません!)。
  • コマンドライン補完を使用できます。つまり、touch poems/so <TAB> poems/somefile
  • poemsを作業ディレクトリにすることはできません(つまり、cdをそこに入れます)。

ビットを書き込む =設定されている場合、このリストを変更できます。つまり、リストの名前を{追加、名前変更、削除}できます。だが!実際に実行できるのは、実行ビットも設定されている場合のみです。

ビットを実行 =このディレクトリを作業ディレクトリ、つまりcdにします。次のことを行う場合は、この権限が必要です。

  • 内部にあるアイテムへのアクセス(読み取り、書き込み、実行)。
  • リスト自体を変更します。つまり、リストの名前を追加、名前変更、削除します(もちろん、ディレクトリに書き込みビットを設定する必要があります)。

興味深いケース1:ディレクトリへの書き込み+実行権限がある場合、それらのアイテムに書き込み権限がない場合でも、その中にあるアイテムを{delete、rename}できます。 (これを防ぐにはスティッキービットを使用してください)

興味深いケース2:ディレクトリに対する実行(書き込みではない)権限があり、その中に存在するファイルに対する書き込み権限がある場合、ファイルを削除することはできません(リストからの削除が含まれるため)。 。ただし、その内容は消去できます。テキストファイルの場合は、viを使用してファイルを開き、すべて削除できます。ファイルはまだ存在しますが、空になります。

概要:

読み取りビット =リストの名前を読み取ることができます。
書き込みビット =実行ビットも設定されている場合は、リストの名前を{追加、名前変更、削除}できます。
実行ビット =このディレクトリを作業ディレクトリにすることができます。

PS:Kusalanandaによって言及された記事は良い読み物です。

274
Baldrick

この表には、可能なすべての権限とその実際の影響を記載しています。

linux directory permissions

(*)ファイル名のみ:サイズや日付などの他の属性にはアクセスできません。例えば。タブキーを使用してオートコンプリートできますが、lsコマンドは使用できません。

いくつかの考え

  • X unsetでは、RとWはほとんど役に立ちません。
  • [〜#〜] x [〜#〜]単独RWの無効化ファイルの内容を盲目的に読み書きし、サブディレクトリにアクセスする可能性があるため、誤った安心感を与えます。ディレクトリの直接の子はすべて、明示的な権限を持っている必要があります。
  • まれに、次の値以外を使用します。
    • :アクセスなし。
    • 1:トラバースを許可する最小アクセス。
    • 5:読み取り/書き込みを許可しますが、ディレクトリツリー自体の構造は変更しません。
    • 7:フルアクセス。
49
David

これに関する良い記事があります。

概要:

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記事 にはさらに詳しい情報があります。

45
Kusalananda

Robert Love の本「LINUX System Programming」の第1章のセクションの許可から-

enter image description here

6
alhelal

ファイルまたはディレクトリにアクセスする操作では、最初にファイルまたはディレクトリへのパスを解決する必要があります。解決には、最終パスコンポーネントを除く、パスに沿ったすべてのディレクトリに対する実行権限がユーザーに必要です。したがって、ディレクトリの場合、実行ビットは「解決可能」を意味すると考えることができます。

例としてパス_/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_を読み取れません。実行権限を持っている。

パス名をファイルに解決する方法 も参照してください。

4
Dagang

便利な例えは、各ファイルを本と見なし、各ディレクトリを本が保管されている部屋と見なすことです。

部屋のすべての名前をリストできるようにするルールがあります。ディレクトリの読み取りビットです。部屋から本を削除するためのルール:ディレクトリの書き込みビット。そして、部屋に入って探索するためのルール:結果のディレクトリ実行ビット。

これらのルールは、それぞれの本のルールとは異なり、異なります。誰かが本を開いてその内容を読み取ることを許可するルールがあります。各ファイルの読み取りビットです。ブックの内容を変更するためのルールがあります。各ファイルの書き込みビットです。そして、ファイルを実行するには、各ファイルの実行ビット。

各アクションには3つのビットがあるため、ビットを書き込みます。所有者には1つの読み取りビット、グループには1つの読み取りビット、他のすべてのユーザー(その他)には1つの読み取りビットがあります。これらの3ビットのいずれかが特定のユーザーに設定されている場合、そのユーザーは読み取りビットをアクティブにします。 serまたはg roupまたはo therによって、そのビットがどのようにアクティブであることが判明したかは関係ありません。同じ効果があります。結果。

したがって、ユーザーは部屋に入ることができ、図書館から本を削除できますが、同じ本の内容を読むことはできません。

これが、ディレクトリのreadビットが必要な理由です。ルームのコンテンツ(本のタイトル)をリストできるユーザーを制御するためです。

executeビットは、誰が本の部屋に入ることができるかを制御するために使用されます。

2
Isaac

ディレクトリの実行の意味は非常に明確です。 Windowsとは異なり、トラバース権限がないため、何かをオーバーロードする必要があります。デザイナーは実行を選択しました、それは無限の混乱を引き起こします。コンピューターのセキュリティ担当者として、実際に実行するつもりのないものに実行権を割り当てると、実行は危険なように見えます。

0
NemoX