実行ビットと読み取りビット。Linuxのディレクトリパーミッションはどのように機能しますか?


380

CMSでは、ディレクトリ+xを開くには、ユーザーが実行可能ビット()を設定する必要があることに気付きました。ディレクトリを読み取るために実行許可が必要な理由と、Linuxのディレクトリ許可はどのように機能しますか?


17
...ええと、それが「+ x」フラグの目的だからです:)
badp


16
次のように考えてください。ディレクトリエントリにはファイルが含まれているため、ディレクトリを「読み取る」と、ファイルを一覧表示し、「使用する」とはファイルにアクセスします。
タイラー

7
ディレクトリ実行ビットが設定されていると階層トラバースできます。あなたが「他の」人々に属し、実行ビットのみが設定されている場合(chmod 771 dirOne)、dirOneコンテンツをリストすることはできません。しかし、(chmod 774 dirTwo)のような権限が設定されたサブディレクトリ「dirTwo」が含まれている場合、実際にそのコンテンツをリストできます!
Stphane

1
将来の訪問者は、AskUbuntuに関連する質問も参照してください。askubuntu.com/ q
Sergiy Kolodyazhnyy

回答:


352

Linuxのディレクトリにアクセス許可を適用する場合、アクセス許可ビットの意味は通常のファイルとは異なります。

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

25
すばらしい答えですが、最後の文章は誤解を招くと思います。これらの許可は、ファイルごとに実際にオーバーライドすることはできません。ここで、「アクセスが」少しあいまいです:+x助成金は、この介してファイルiノードへのアクセスをディレクトリ上の特定のディレクトリ(以下何も、何よりも、よく...多分chdir必要が+xあまりにも)。1つのファイルの内容を読み書きするには、ユーザーもこのファイルに対して+r/ +wを必要としますが、これらは個別のアクセス許可です(何もオーバーライドしません)。
ステファンギメネス

2
不変フラグは、ファイルシステム固有のものであり、それは正確にこれらのアクセス許可を上書きしません、私は最後の文が:-)誤解だと思う理由です
ステファン・ヒメネス

1
私は1クリスダウンによって提供される唯一の情報を検討する場合、いくつかのディレクトリへの応用が誤解を招く恐れが引き起こし、この中にACLおよび他の答えに言及すると便利かもしれないと思う
user907860

4
Baldrickの答えが以下に言及しているように、この答えは書き込みビットと実行ビットの複合効果について言及していないようです?つまり、書き込み権限のみを持ち、実行権限は持っていない場合、まったく役に立ちません。
xji

1
@StéphaneGimenez「+xディレクトリ上でファイルiノードへのアクセスを許可する」-これは良いネモニックのように思えますが、おそらく全体を語っていないのでしょうか?ディレクトリに実行ビットを設定しないと、そのディレクトリ内のファイルのファイル名を変更できません。ファイル名はiノードではなくディレクトリエントリに保存されるため、これがなぜなのか疑問に思っています。
ケビンウィーラー

259

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

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

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

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

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

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

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

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

概要:

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

PS:Kusalanandaが言及した記事は良い読み物です。


17
ディレクトリをリストとして考えると、物事がより明確で論理的になります。
トリメジストス14年

20
すばらしい答えですが、「作業ディレクトリ」という用語に焦点を合わせすぎています。私が必要とするxためのビットを任意のこのファイルへのアクセス:のためにcat a/b/c/d、私は必要なxすべてのビットをabそしてc私はCWDとしてそれらを使用しない場合でも、。
glglgl 14年

1
これは、実行可能ファイルでなければ書けないことがわかった場所です!ケース2も興味深い回答です。
ミルコ14年

1
もう1つの注意点はx、ディレクトリに対する権限を持っている場合でも、その中のファイルxに対する権限を持っていない場合、ファイルを実際に「実行」することはできないということです。catたとえば、できるのはそれだけですが、ファイル自体を実行することはできません。
-xji

2
ls -lフォルダーで作業する場合は、両方rx権限が必要です。
エリックワン

44

この表には、すべての可能な許可とその実用的な効果が用意されています。

Linuxディレクトリのアクセス許可

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

いくつかの考え

  • Xの設定を解除、RおよびWはほとんど役に立ちません。
  • XだけでRW無効にすると、ファイルの内容を盲目的に読み書きしたり、サブディレクトリにアクセスしたりする可能性があるため、誤ったセキュリティを感じます。ディレクトリのすべての直接の子に明示的なアクセス許可があることを確認する必要があります。
  • 以下以外の値を使用することはほとんどありません。
    • 0:アクセスなし。
    • 1:通過を許可する最小アクセス。
    • 5:読み取り/書き込みを許可しますが、ディレクトリツリー自体の構造は変更しません。
    • 7:フルアクセス。

1
読み取り/書き込みを許可したいが、ディレクトリツリー自体の構造を変更したくない場合は、5を有用な値と見なします。
-hgiesel

あなたが正しいです。更新しました!
デビッド

4
優れた概要チャート。誰かが-W-機能的に---ディレクトリと同等であると考えていたのだろうかと思います。あまり直感的ではありません。もちろん、これらのタイプの低レベルビットはそうではありません。
CivFan

2
私は自分のMacでこれをテストしましたが、-W-では、ディレクトリの名前を変更できました(スティッキービットのあるディレクトリ内)が、ではできませんでした---。それは違いのようです
-cozyconemotel

3
@David、スティッキービットがありません。
17

42

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

概要:

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の記事にはさらに多くの情報があります



2

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

/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、ユーザが実行権限を持っていないので。

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


0

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

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

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

各アクションに3つのビットがあるため、ビットを書き込みます。所有者用の読み取りビットが1つ、グループ用の読み取りビットが1つ、他の全員(その他)の読み取りビットが1つあります。これらの3ビットのいずれかが特定のユーザーに設定されている場合、そのユーザーは読み取りビットをアクティブにします。そのビットがどちらかによって活性であることが判明したかは重要ではありませんUの Serまたはグラムの競売またはOそれは同じ効果的な結果を持って、THER。

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

これが、ディレクトリの読み取りビットが必要な理由です。ルームの内容(本のタイトル)を一覧表示できるユーザーを制御するためです。

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


-1

ディレクトリに対するExecuteの意味は非常に明確です。Windowsとは異なり、トラバース許可がないため、何かをオーバーロードする必要があります。設計者は実行を選択しました。あなたが実際に実行するつもりのないものに実行権を割り当てるコンピュータセキュリティの男としては危険に見えます。


1
実行許可ビットの発明は、明確なトラバース許可の概念の発明よりも約20年前のものです。この答えの論理は、現実の世界のようなものではない歴史的なタイムラインに依存しており、その存在とその存在に気付かないこともありますGENERIC_EXECUTE
JdeBP
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.