Execute vs Read-Bit. Wie funktionieren Verzeichnisberechtigungen unter Linux?

380

In meinem CMS habe ich festgestellt, dass für Verzeichnisse das ausführbare Bit ( +x) gesetzt sein muss, damit der Benutzer sie öffnen kann. Warum ist die Ausführungsberechtigung erforderlich, um ein Verzeichnis zu lesen, und wie funktionieren Verzeichnisberechtigungen unter Linux?

Nick.h
quelle
17
... ähm, weil das ist, was die "+ x" Flagge ist :)
badp
16
Stellen Sie sich Folgendes vor: Der Verzeichniseintrag enthält Dateinamen. Wenn Sie also ein Verzeichnis lesen, werden die Dateien aufgelistet, und wenn Sie das Verzeichnis verwenden, greifen Sie auf die Dateien zu.
TylerL
7
Wenn das Verzeichnis- Ausführungsbit gesetzt ist , können Sie seine Hierarchie durchlaufen . Wenn Sie zu "anderen" Personen gehören und nur das Ausführungsbit set ( chmod 771 dirOne) gesetzt haben, können Sie keinen dirOne-Inhalt auflisten. ABER wenn es ein Unterverzeichnis "dirTwo" mit den Rechten enthält, die wie ( chmod 774 dirTwo) eingestellt sind, können Sie seinen Inhalt wirklich verzeichnen!
Stphane
1
Zukünftige Besucher sollten auch Fragen zu AskUbuntu sehen: askubuntu.com/q/1106822/295286
Sergiy Kolodyazhnyy

Antworten:

351

Beim Anwenden von Berechtigungen auf Verzeichnisse unter Linux haben die Berechtigungsbits eine andere Bedeutung als bei normalen Dateien.

  • Das Lesebit ( r) ermöglicht es dem betroffenen Benutzer, die Dateien innerhalb des Verzeichnisses aufzulisten
  • Mit dem Schreibbit ( w) kann der betroffene Benutzer Dateien im Verzeichnis erstellen, umbenennen oder löschen und die Verzeichnisattribute ändern
  • Das Ausführungsbit ( x) ermöglicht es dem betroffenen Benutzer, in das Verzeichnis zu gelangen und auf darin enthaltene Dateien und Verzeichnisse zuzugreifen
  • Das Sticky-Bit ( Toder twenn das Execute-Bit für andere gesetzt ist) besagt, dass Dateien und Verzeichnisse in diesem Verzeichnis nur von ihrem Eigentümer (oder Root) gelöscht oder umbenannt werden dürfen.
Chris Down
quelle
25
Gute Antwort, aber ich denke, der letzte Satz ist irreführend. Keine dieser Berechtigungen kann tatsächlich pro Datei überschrieben werden. Hier ist „Zugriff“ ein bisschen mehrdeutig: +xIm Verzeichnis wird der Zugriff auf Dateien über Inodes in diesem bestimmten Verzeichnis gewährt (nicht weniger, nicht mehr, naja, vielleicht auch chdirnötig +x). Um den Inhalt einer Datei zu lesen oder zu schreiben, benötigt der Benutzer auch +r/ +wfür diese Datei, dies sind jedoch unterschiedliche Berechtigungen (sie setzen nichts außer Kraft).
Stéphane Gimenez
2
Das unveränderliche Flag ist dateisystemspezifisch und überschreibt diese Berechtigungen nicht genau. Aus diesem Grund denke ich, dass der letzte Satz irreführend ist :-)
Stéphane Gimenez,
1
Ich denke, es könnte nützlich sein, ACL in dieser und anderen Antworten zu erwähnen, da ihre Anwendung für einige Verzeichnisse irreführend sein kann, wenn man nur die von Chris Down bereitgestellten Informationen berücksichtigt
user907860
4
Scheint, dass diese Antwort den kombinierten Effekt von Write-Bit und Execute-Bit nicht erwähnt, wie Baldricks Antwort unten erwähnt? dh wenn Sie nur eine Schreib-, aber keine Ausführungsberechtigung haben, ist dies ziemlich nutzlos.
xji
1
@ StéphaneGimenez " +xim Verzeichnis gewährt Zugriff auf Dateien Inodes" - Dies scheint eine gute Nemonik, aber vielleicht nicht die ganze Geschichte zu erzählen? Ohne das in einem Verzeichnis gesetzte Ausführungsbit können Sie den Dateinamen einer Datei in diesem Verzeichnis nicht ändern. Ich frage mich, warum das so ist, weil der Dateiname in einem Verzeichniseintrag und nicht in einer Inode gespeichert ist.
Kevin Wheeler
259

Denken Sie zuerst: Was ist ein Verzeichnis? Es ist nur eine Liste der Elemente (Dateien und andere Verzeichnisse), die sich innerhalb befinden. Also: Verzeichnis = Liste der Namen.

Lesebit = Wenn gesetzt, können Sie diese Liste lesen. Wenn Sie beispielsweise ein Verzeichnis mit dem Namen haben poems:

  • Sie können ls poemsund Sie erhalten eine Liste der darin lebenden Gegenstände ( -lgeben keine Details preis!).
  • Sie können die Befehlszeilenvervollständigung verwenden, z touch poems/so <TAB> poems/somefile.
  • Sie können poemsIhr Arbeitsverzeichnis nicht erstellen (d cd. H. Darin ablegen ).

Write bit = Wenn gesetzt, können Sie diese Liste ändern, dh Sie können Namen hinzufügen, umbenennen, löschen. Aber! Sie können dies tatsächlich nur tun, wenn auch das Ausführungsbit gesetzt ist.

Execute bit = Machen Sie dieses Verzeichnis zu Ihrem Arbeitsverzeichnis, dh cdhinein. Sie benötigen diese Berechtigung, wenn Sie:

  • Zugriff (Lesen, Schreiben, Ausführen) auf Elemente, die in ihnen leben.
  • Ändern Sie die Liste selbst, dh fügen Sie Namen hinzu, benennen Sie sie um und löschen Sie sie (natürlich muss das Schreibbit im Verzeichnis gesetzt sein).

Interessanter Fall 1 : Wenn Sie über Schreib- und Ausführungsberechtigungen für ein Verzeichnis verfügen, können Sie Elemente, die sich in diesem Verzeichnis befinden, auch dann {löschen, umbenennen}, wenn Sie keine Schreibberechtigung für diese Elemente haben. (Verwenden Sie ein klebriges Bit, um dies zu verhindern.)

Interessanter Fall 2 : Wenn Sie die Berechtigung zum Ausführen (aber nicht zum Schreiben) eines Verzeichnisses und die Berechtigung zum Schreiben für eine darin befindliche Datei haben, können Sie die Datei nicht löschen (da sie aus der Liste entfernt werden muss). Sie können den Inhalt jedoch löschen, z. B. wenn es sich um eine Textdatei handelt, können Sie vi verwenden, um sie zu öffnen und alles zu löschen. Die Datei bleibt dort, ist aber leer.

Zusammenfassung:

Read bit = Sie können die Namen in der Liste lesen.
Schreibbit = Sie können Namen in der Liste {hinzufügen, umbenennen, löschen}, wenn auch das Ausführungsbit gesetzt ist.
Execute bit = Sie können dieses Verzeichnis zu Ihrem Arbeitsverzeichnis machen.

PS: Der von Kusalananda erwähnte Artikel ist eine gute Lektüre.

Baldrick
quelle
17
Wenn Sie das Verzeichnis als Liste betrachten, werden die Dinge klarer und logischer.
Trismegistos
20
Tolle Antwort, aber auch fokussiert auf den Begriff "Arbeitsverzeichnis". Ich brauche das xBit für jeden Zugriff auf diese Datei: für cat a/b/c/d, ich brauche xetwas auf alle a, bund c, auch wenn ich sie nicht als cwd verwenden.
Glglgl
1
Hier habe ich herausgefunden, dass man nur schreiben kann, wenn es auch ausführbar ist! Fall 2 ist auch interessant, tolle Antwort!
Mirko
1
Ein weiterer Hinweis ist, dass Sie die Datei auch dann nicht wirklich "ausführen" können , wenn Sie die xBerechtigung für das Verzeichnis haben, wenn Sie keine xBerechtigung für die darin enthaltene Datei haben. Sie können es nur catzum Beispiel, aber Sie können die Datei selbst nicht ausführen.
xji
2
Wenn Sie ls -lfür einen Ordner arbeiten möchten , benötigen Sie beide rund die xBerechtigung.
Eric Wang
44

Ich habe diese Tabelle mit allen möglichen Berechtigungen und deren praktischen Auswirkungen erstellt.

Linux-Verzeichnis Berechtigungen

(*) Nur Dateinamen : Andere Attribute wie Größe oder Datum sind nicht zugänglich. Sie können beispielsweise die Tabulatortaste verwenden, um den Befehl automatisch zu vervollständigen, nicht jedoch den Befehl ls.

Einige Gedanken :

  • Mit X ungesetzt , R und W meist nutzlos.
  • Das Deaktivieren von RW durch X allein gibt Ihnen ein falsches Sicherheitsgefühl, da Sie Dateiinhalte blind lesen und schreiben und auf Unterverzeichnisse zugreifen können. Sie sollten sicherstellen, dass alle direkten untergeordneten Elemente des Verzeichnisses explizite Berechtigungen haben.
  • In seltenen Fällen verwenden Sie andere Werte als:
    • 0 : Kein Zugriff.
    • 1 : Mindestzugriff für das Überqueren.
    • 5 : Lesen / Schreiben zulassen, aber die Struktur des Verzeichnisbaums selbst nicht ändern.
    • 7 : Voller Zugriff.
David
quelle
1
Ich würde 5 als hilfreichen Wert betrachten, wenn Sie das Lesen / Schreiben zulassen möchten, aber die Struktur des Verzeichnisbaums selbst nicht ändern möchten.
Hgiesel
Du hast recht. Aktualisiert!
David
4
Tolle Übersichtstabelle. Ich frage mich, was jemand gedacht hat, -W-um funktionell ---für Verzeichnisse gleichwertig zu sein . Nicht sehr intuitiv. Natürlich sind diese Arten von Low-Level-Bits oft nicht.
CivFan
2
Ich habe dies auf meinem Mac getestet, aber mit -W-konnte ich das Verzeichnis umbenennen (in einem Verzeichnis mit einem Sticky-Bit), aber nicht mit ---. Das scheint ein Unterschied zu sein
cosyconemotel 15.07.17
3
@ David, Sie vermissen das klebrige Stück.
Pacerier
42

Hier ist ein guter Artikel dazu.

Zusammenfassung:

Ein Verzeichnis mit xgesetztem Bit ermöglicht es dem Benutzer, cdin dieses Verzeichnis zu wechseln und auf die darin enthaltenen Dateien zuzugreifen.

Einzelheiten:

  • Lesen ( r)

    Die Fähigkeit, die Namen der in diesem Verzeichnis gespeicherten Dateien zu lesen.

  • Schreiben ( w)

    Die Möglichkeit, Dateien im Verzeichnis umzubenennen, neue Dateien zu erstellen oder vorhandene Dateien zu löschen, wenn Sie auch über Ausführungsberechtigungen verfügen. Wenn Sie keine Ausführungsberechtigungen haben, sind Schreibberechtigungen bedeutungslos.

  • Execute ( x)

    Die Möglichkeit, cdin dieses Verzeichnis zu gelangen und auf die Dateien in diesem Verzeichnis zuzugreifen.

Hier einige Beispiele, die das Verständnis erleichtern sollen:

# "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

Weitere Informationen finden Sie im Artikel Hacking Linux Exposed .

Kusalananda
quelle
2

Für jede Operation, die auf eine Datei oder ein Verzeichnis zugreift, muss zunächst der Pfad zu der Datei oder dem Verzeichnis aufgelöst werden. Die Auflösung erfordert, dass der Benutzer die Berechtigung zum Ausführen für alle Verzeichnisse entlang des Pfads mit Ausnahme der endgültigen Pfadkomponente hat. Für Verzeichnisse bedeutet das Ausführungsbit also "auflösbar".

Nehmen wir /a/b/c.txtals Beispiel den Pfad : Der Benutzer hat 1) die Berechtigung zum Ausführen von /und /a; 2) hat Leserechte auf /a/b; 3) Lese- und Schreibberechtigung auf /a/b/c.txt.

  • Der Benutzer kann nicht lesen (Liste) /a, da er keine Leseberechtigung hat. Die Pfadauflösung schlägt jedoch nicht fehl.

  • Der Benutzer wird in der Lage sein zu lesen (Liste) /a/b, da der Benutzer die Berechtigung hat ausführen auf /, /aund die Leseberechtigung auf /a/b. Beachten Sie, dass beim Lesen /a/bder Dateiname c.txtsichtbar ist, die Metadaten (z. B. Dateigröße) und der Inhalt jedoch nicht, da der Dateiname im Verzeichnis und nicht in der Datei gespeichert ist, die Metadaten jedoch im Inode der Datei gespeichert sind.

  • Der Benutzer wird zu lesen , fehlschlagen /a/b/c.txt, weil , wenn der Pfad der Lösung von /bis /azu /a/b, es scheitert , /a/bda der Benutzer nicht über die Berechtigung ausführen.

Siehe auch, wie ein Pfadname in eine Datei aufgelöst wird .

Dagang
quelle
0

Eine nützliche Analogie besteht darin, sich jede Datei als ein Buch und jedes Verzeichnis als einen Raum vorzustellen, in dem die Bücher aufbewahrt werden.

Es gibt Regeln, um alle Namen in einem Raum auflisten zu können: das Lesebit für Verzeichnisse. Regeln, um ein Buch aus dem Raum zu entfernen: das Schreibbit für Verzeichnisse. Und Regeln, um einen Raum zu betreten und zu erkunden: Das resultierende Verzeichnis Bit ausführen.

Diese Regeln sind getrennt und unterscheiden sich von den Regeln für jedes Buch. Es gibt Regeln, die es jemandem ermöglichen, ein Buch zu öffnen und dessen Inhalt zu lesen: die gelesenen Bits für jede Datei. Es gibt Regeln, um den Inhalt eines Buches zu ändern: die Schreibbits für jede Datei. Und um eine Datei auszuführen: das oder die Ausführungsbits für jede Datei.

Ich schreibe Bit (s), weil es für jede Aktion drei Bits gibt. Es gibt ein Lesebit für den Eigentümer, ein Lesebit für die Gruppe (n) und ein Lesebit für alle anderen. Wenn eines dieser drei Bits für einen bestimmten Benutzer gesetzt ist, ist für diesen Benutzer das Lesebit aktiv. Es spielt keine Rolle , wie das Bit gefunden wurde , aktiv zu sein , entweder durch u ser oder g ruppe oder o ther, hat es die gleichen effektiven Ergebnisse.

Auf diese Weise kann ein Benutzer einen Raum betreten und Bücher aus der Bibliothek entfernen, jedoch nicht den Inhalt desselben Buches lesen.

Deshalb ist ein Lese Bit für Verzeichnisse benötigt wird: zu steuern, die den Rauminhalt (Buchtitel) zur Liste erlaubt ist.

Und das Ausführungsbit wird verwendet, um zu steuern, wer den Raum der Bücher betreten kann.

Isaac
quelle
-1

Die Bedeutung von Execute für Verzeichnisse ist ziemlich klar. Da es im Gegensatz zu Windows keine Traverse-Berechtigung gibt, müssen Sie etwas überladen. Die Designer entschieden sich für Execute. Das sorgt für endlose Verwirrung. Als ein Computer-Sicherheitsbeauftragter, der Execute-Rechte für etwas zuweist, das Sie eigentlich nicht ausführen möchten, sieht es düster aus.

NemoX
quelle
1
Die Erfindung des Ausführungserlaubnisbits geht der Erfindung des Konzepts einer eindeutigen Durchquerungserlaubnis um etwa zwei Jahrzehnte voraus. Die Logik dieser Antwort hängt von einer historischen Zeitachse ab, die nicht der der realen Welt entspricht und auch die Existenz GENERIC_EXECUTEund das, was sie ist, nicht bemerkt .
JdeBP