Warum wirkt sich chmod (1) in der Gruppe auf die ACL-Maske aus?

17

Ich versuche, dieses Unix-Verhalten zu verstehen (das ich gerade unter Ubuntu 11.10 teste):

$ touch foo
$ setfacl -m u:nobody:rwx foo
$ getfacl foo
# file: foo
# owner: michael
# group: michael
user::rw-
user:nobody:rwx
group::rw-
mask::rwx
other::r--

$ chmod g-rw foo
$ getfacl foo
# file: foo
# owner: michael
# group: michael
user::rw-
user:nobody:rwx         #effective:--x
group::rw-          #effective:---
mask::--x
other::r--

Beachten Sie, dass der Befehl chmod (1) die ACL-Maske aktualisiert hat. Warum passiert das?

Die SunOS-Manpage hat Folgendes zu sagen:

Wenn Sie den Befehl chmod (1) verwenden, um die Dateigruppenbesitzerberechtigungen für eine Datei mit ACL-Einträgen zu ändern, werden sowohl die Dateigruppenbesitzerberechtigungen als auch die ACL-Maske in die neuen Berechtigungen geändert. Beachten Sie, dass die neuen ACL-Maskenberechtigungen möglicherweise die effektiven Berechtigungen für zusätzliche Benutzer und Gruppen ändern, für die ACL-Einträge in der Datei vorhanden sind.

Ich frage, weil es für mich praktisch wäre, wenn chmod (1) dieses Verhalten nicht hätte. Ich hoffe, dass ich, wenn ich verstehe, warum es das tut, was es tut, besser gestalten kann, wie ich Dateisystemberechtigungen einrichte.

Michael Kropat
quelle
2
Jetzt frage ich mich, ob ich das auf unix.stackexchange.com hätte fragen sollen. Der Versuch, den richtigen Standort zu finden, ist immer eine Herausforderung.
Michael Kropat

Antworten:

24

Es wäre nicht bequem für Sie, wenn Sie chmod()dieses Verhalten nicht hätten.

Es wäre sehr unpraktisch, weil Dinge, die die Leute traditionell unter Unix erwarten, kaputt gehen würden. Dieses Verhalten tut dir gut, hast du es aber gewusst.

Es ist eine Schande, dass IEEE 1003.1e nie zum Standard wurde und 1998 zurückgezogen wurde. In der Praxis ist es nach 14 Jahren ein Standard, den eine Vielzahl von Betriebssystemen - von Linux über FreeBSD bis Solaris - tatsächlich implementieren.

Der IEEE 1003.1e-Arbeitsentwurf Nr. 17 sorgt für eine interessante Lektüre, und ich empfehle ihn. In Anhang B § 23.3 bietet die Arbeitsgruppe eine ausführliche, achtseitige Begründung für die etwas komplexe Arbeitsweise von POSIX-ACLs in Bezug auf die alten S_IRWXGGruppenberechtigungsflags. (Es ist erwähnenswert, dass die TRUSIX-Leute vor zehn Jahren ungefähr die gleiche Analyse geliefert haben.) Ich werde hier nicht alles kopieren. Lesen Sie die Begründung im Standardentwurf für Details. Hier ist eine sehr kurze Zusammenfassung :

  • Das SunOS-Handbuch ist falsch. Es sollte lesen

    Wenn Sie den chmod(1)Befehl zum Ändern der Dateigruppenbesitzerberechtigungen für eine Datei mit ACL-Einträgen verwenden, werden entweder die Dateigruppenbesitzerberechtigungen oder die ACL-Maske in die neuen Berechtigungen geändert.

    Dies ist das Verhalten , dass man Happening sehen , trotz allem , was die aktuelle Handbuch Seite sagt, in Ihrer Frage. Dies ist auch das Verhalten, das im Entwurf des POSIX-Standards festgelegt ist. Wenn ein CLASS_OBJ(Suns und TRUSIXs Terminologie für ACL_MASK) Zugangskontrolleintrag existiert, setzen die Gruppenbits eines chmod()diesen, andernfalls setzen sie den GROUP_OBJZugangskontrolleintrag.

  • Wenn dies nicht der Fall wäre, würden Anwendungen, die verschiedene Standardfunktionen mit `chmod ()` ausführten und erwarteten, dass dies unter `chmod ()` funktioniert, auf alten Nicht-ACL-Unixen entweder Sicherheitslücken hinterlassen oder nachsehen, was passiert Sie glauben, Sicherheitslücken zu schließen:

    • Herkömmliche Unix-Anwendungen erwarten, dass sie den gesamten Zugriff auf eine Datei, eine Named Pipe, ein Gerät oder ein Verzeichnis mit verweigern können chmod(…,000). Bei Vorhandensein von ACLs werden hierdurch nur dann alle Benutzer- und Gruppenberechtigungen deaktiviert, wenn die alte S_IRWXGZuordnung zu erfolgt CLASS_OBJ. Ohne diese , um die alten Dateiberechtigungen einstellen 000würde keine Auswirkungen auf USERoder GROUPEinträge und andere Nutzer würden überraschenderweise noch Zugriff auf das Objekt.

      Das temporäre Ändern der Berechtigungsbits einer Datei in "Kein Zugriff" chmod 000und das anschließende erneute Ändern war ein alter Dateisperrmechanismus, der verwendet wurde, bevor Unixes empfohlene Sperrmechanismen erlangte, die - wie Sie sehen können - auch heute noch verwendet werden .

    • Herkömmliche Unix-Skripte können nur ausgeführt werden, wenn chmod go-rwxder Eigentümer des Objekts auf das Objekt zugreifen kann. Auch hier - wie man sieht - das ist nach wie vor die vorherrschende Lehrmeinung zwölf Jahre später. Auch dies funktioniert nur, wenn die alte S_IRWXGZuordnung zu CLASS_OBJvorhanden ist, da andernfalls mit diesem chmodBefehl keine USERoder GROUPZugriffssteuerungseinträge deaktiviert werden und andere Benutzer als der Eigentümer und nicht besitzende Gruppen den Zugriff auf etwas behalten, das vorhanden ist voraussichtlich nur für den Eigentümer zugänglich sein .

    • Ein System, bei dem die Berechtigungsbits ansonsten von andden ACLs getrennt und mit ihnen bearbeitet wurden, würde rwxrwxrwxin den meisten Fällen Dateiberechtigungsflags erfordern , was die vielen Unix-Anwendungen verwirren würde, die sich beschweren, wenn sie sehen, was sie für weltgeschrieben halten Zeug.

      Ein System, bei dem die Berechtigungsbits ansonsten von orden ACLs getrennt und mit ihnen bearbeitet wurden, hätte das chmod(…,000)zuvor erwähnte Problem.

Weitere Lektüre

JdeBP
quelle
Super, das macht alles sehr viel Sinn. Ihre Klarstellung auf der Manpage bestätigte meinen Verdacht bezüglich des Verhaltens, während Ihre drei Erklärungen genau das waren, was ich brauchte, um in dieser Angelegenheit aufgeklärt zu werden. Ich bin viel glücklicher, das Warum des Designs zu kennen, und ich bin so froh, dass Sie Ihre Preise veröffentlicht haben, was mich davon abgehalten hat, all das zu lesen, um die eine Frage zu beantworten.
Michael Kropat
@hopeseekr Sie können Linux, 100 GNU-Dienstprogramme und 1000 Software-Teile von Drittanbietern immer nachteilen, sodass sie keine S_IRWXGBerechtigungen mehr verwenden. Ruf mich an, wenn du fertig bist.
Tobia
0

Dieses Verhalten gilt nur für POSIX-ACL-Einträge. Der Grund dafür ist, dass Sie, wenn Sie einen Ordner haben und in diesem Ordner eine Datei existiert, den Ordner und die Datei als rwx (zum Beispiel) speichern können. Wenn die Gruppenberechtigungen der Datei rw- sind (was ein typisches Szenario sein könnte), gibt die Maske dem ACL die effektiven Berechtigungen von rw-, obwohl die ACL ausdrücklich rwx bezeichnet.

Andererseits hat das Verzeichnis, das fast immer + x ist, effektive ACL-Maskenberechtigungen, die auch + x erlauben.

Zusammenfassend wird diese Maske im Wesentlichen verwendet, um die Berechtigungen zwischen Dateien und Ordnern für das POSIX-ACL-Set zu unterscheiden, sodass eine Datei nicht ausführbar wird, wenn dies normalerweise nicht der Fall sein sollte.

Matthew Ife
quelle
Falls jemand dies liest, ist diese Antwort völlig falsch.
Pgoetz