Kurze Antwort: Wenn Sie eine Maske mit aktiviertem Ausführungsbit möchten, müssen Sie diese explizit mit setfacl
after festlegen touch
. Sicherheit verbietet seine implizite Einstellung.
setfacl -n -m m::rwx foo
"-n", um eine Neuberechnung der Maske zu unterdrücken (möglicherweise nicht erforderlich).
"m :: rwx" setzt den Maskenwert auf 'rwx'. Beachten Sie, dass "m :: x" alle Lese- und Schreibvorgänge deaktivieren würde.
Ich kann nicht zeigen, warum die Maske "rw-" ist. Ich gehe davon aus, dass das Standardverzeichnis, in dem touch
die Datei erstellt wird, für das gesamte OP-Beispiel unverändert bleibt.
Der Verzeichniseintrag für 'foo' sollte den Eigentümer 'root' anzeigen (aufgrund des Befehls sudo und der Gruppe 'guard', da für das Verzeichnis das SUID-Bit gesetzt ist. Die Berechtigungen sind standardmäßig '-rw -... r--' mit Die Gruppenberechtigungen des Verzeichnisses '-... rx ...' (aufgrund des SUID-Bits wird als kleines s angezeigt).
Als nächstes kommen die ACLes, die das Standardverzeichnis sein sollten. Angesichts der Tatsache, dass ACLs erben, würde ich nicht erwarten, dass ACLes erstellt werden, und die ACLE-Maske wird als Standardverzeichnis 'rwx' verwendet.
Aber wenn sie erstellt werden, würde ich erwarten, dass die neuen ACLes von der Standardeinstellung vorbereitet werden und die Maske wieder bei 'rwx' bleibt. Wenn sie nicht auf die Standardeinstellungen abgestimmt sind, scheint dies die Idee einer Standard-ACL zu zerstören - die "Standard" -AlB würde nur benannte Benutzer- und benannte Gruppen-ACLs bereitstellen.
Dies wirft nun die Frage auf, wie die Masken-ACLe aussehen soll. Ich würde erwarten, dass es 'rwx' vom Standardmaskeneintrag ist. Aber es könnte mit einer leeren Maske erstellt werden, und dann gelten alle Arten von Legalese.
- Mit einer vorläufigen ACL von Benutzer :: rw-, Gruppe :: rx, anderen :: r--, Gruppe: Rad: rwx, Gruppe: Wachen: rwx und Maske ::: (nicht gesetzt) konsultieren wir die Dokumentation für
setfacl
, Unter der Annahme, dass für die Dateierstellung dieselben Regeln gelten.
Es gibt eine Klausel:
Wenn eine ACL benannte Benutzer- oder Gruppeneinträge enthält und kein Maskeneintrag vorhanden ist, wird ein Maskeneintrag erstellt, der dieselben Berechtigungen wie der Gruppeneintrag enthält.
Dies würde die ACL-Maske auf "rx" setzen, wenn der ACL-Gruppeneintrag aus dem Dateiverzeichniseintrag erstellt wurde, oder auf "rx", wenn der ACL-Gruppeneintrag aus der Standard-ACL stammt. (Ätherweise ist in diesem Fall das Ergebnis dasselbe.)
Es gibt auch eine Klausel:
Wenn eine Standard-ACL benannte Benutzereinträge oder benannte Gruppeneinträge enthält und kein Maskeneintrag vorhanden ist, wird ein Maskeneintrag hinzugefügt, der dieselben Berechtigungen wie der Gruppeneintrag der Standard-ACL enthält. ... werden die Berechtigungen des Maskeneintrags weiter angepasst, um die Vereinigung aller vom Maskeneintrag betroffenen Berechtigungen einzuschließen.
Wenn diese Regel gilt, beginnt die Maske als "rx" (gleiche Logik) wie in der vorherigen Klausel) und wird dann als "Vereinigung aller vom Maskeneintrag betroffenen Berechtigungen" angepasst.
"Vom Maskeneintrag betroffene Berechtigungen" ist in der setfacl
Befehlsdokumentation nicht definiert . In der POSIX ACL-Dokumentation heißt es:
Die Maske ist die Kombination aller Zugriffsberechtigungen der besitzenden Gruppe und aller Benutzer- und Gruppeneinträge.
Geben Sie das Wort "Vereinigung" an, das additiv ist. Ich würde "Kombination" als logisches Wort lesen. Mit anderen Worten, wenn eine Gruppen- oder Benutzer-ACLe die Berechtigung "x" hat, enthält die Maske "x".
- Nach all dieser Logik sollte der Maskenwert im OP-Beispiel 'rwx' sein, unabhängig davon, welchem logischen Pfad gefolgt wurde.
Die obige Argumentation muss fehlerhaft sein, da das x für die Ausführung nicht in der Maske erscheint.
Daher muss es eine Regel für die Berechnung der Maske geben, die vor gängigen Dokumentationsquellen "verborgen" wurde (oder wir haben einen Fehler gefunden).
Mein Fazit ist, dass das 'x' immer bedingungslos entfernt wird und die Dokumentation lax ist.
Diese Änderung wurde wahrscheinlich aus Gründen der "Sicherheit" vorgenommen. Keine Datei darf implizit ausführbar sein, aber das ausführbare Bit muss nach dem Erstellen aktiviert sein.