Wie berechnet ACL die effektiven Berechtigungen für eine Datei?

11

Ich habe den folgenden Befehl ausgeführt, um der wheelGruppe rwxBerechtigungen für neu erstellte Dateien und Unterverzeichnisse zu erteilen :

[belmin@server1]$ ls -la
total 24
drwxr-sr-x+   2 guards guards  4096 Aug 27 15:30 .
drwxr-xr-x  104 root   root   12288 Aug 27 15:19 ..

[belmin@server1]$ sudo setfacl -m d:g:wheel:rwX .

[belmin@server1]$ getfacl .
# file: .
# owner: guards
# group: guards
# flags: -s-
user::rwx
group::r-x
group:wheel:rwx
other::r-x
default:user::rwx
default:group::r-x
default:group:wheel:rwx
default:mask::rwx
default:other::r-x

Wenn ich jedoch eine Datei als Root erstelle, ist mir nicht ganz klar, wie die effectiveBerechtigungen berechnet werden:

[belmin@server1]$ sudo touch foo

[belmin@server1]$ getfacl foo
# file: foo
# owner: root
# group: guards
user::rw-
group::r-x                      #effective:r--
group:wheel:rwx                 #effective:rw-
group:guards:rwx                #effective:rw-
mask::rw-
other::r--

Kann jemand näher erläutern, was dies bedeutet?

Belmin Fernandez
quelle

Antworten:

8

effectiveBerechtigungen werden gebildet, indem die tatsächlichen (realen?) Berechtigungen mit der verknüpft werden mask. Da die maskIhrer Datei ist rw-, haben alle effectiveBerechtigungen das xBit deaktiviert.

G-Man sagt "Reinstate Monica"
quelle
5
Und woher kommt die Maske?
Tonin
Es sieht also so aus, als würde man sich verdoppeln: Man kann einfach echte Berechtigungen genau einstellen, anstatt sie mit der Maske zu ändern
Josef Klimuk
7

Kurze Antwort: Wenn Sie eine Maske mit aktiviertem Ausführungsbit möchten, müssen Sie diese explizit mit setfaclafter 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 touchdie Datei erstellt wird, für das gesamte OP-Beispiel unverändert bleibt.

  1. 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).

  2. 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.

  1. 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 setfaclBefehlsdokumentation 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".

  1. 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.

HiTechHiTouch
quelle
Überprüfen Sie diese Antwort unix.stackexchange.com/a/165304/146978 . Ich denke, es hat klar erklärt, warum das 'x'-Bit fast immer fehlt.
Yifeng Mu