setfacl: Sind diese beiden Befehle gleich?

10

Ich habe ein Bereitstellungsskript (basierend auf Capifony), das die Berechtigungen auf bestimmten Servern für eine Symfony2-Installation festlegt. Es enthält die folgenden zwei Befehle, um dies für mehrere Verzeichnisse zu tun:

setfacl -R -m u:www-data:rwx -m u:`whoami`:rwX app/cache
setfacl -dR -m u:www-data:rwx -m u:`whoami`:rwX app/cache

Diese beiden Befehle befinden sich auf der Symfony2-Site, um die Berechtigungen zu korrigieren. Sie sahen mir jedoch auffallend ähnlich. Also habe ich mir die Manpages angesehen setfaclund nach meinem Verständnis macht der zweite Befehl genau das, was der erste mit einer zusätzlichen Option macht (was ich nicht ganz verstehe). Meine Frage ist, ist meine Annahme richtig? Wenn ja, hätte es den gleichen Effekt, wenn ich den ersten Befehl entfernen würde?

Hosh Sadiq
quelle

Antworten:

15

Der erste Befehl ändert die Berechtigungen bereits vorhandener Dateien / Verzeichnisse. Der -dBefehl im zweiten Befehl ist wichtig, um die zukünftigen Standardberechtigungen für alle Verzeichnisse festzulegen, die wiederum einen Standardsatz von ACLs für alle Dateien in diesen Verzeichnissen bereitstellen.

HINWEIS: In beiden Fällen werden die Befehle rekursiv über den -RSwitch ausgeführt.

In Bezug auf den -dSchalter von der setfaclManpage:

   -d, --default
       All operations apply to the Default ACL. Regular ACL entries in the 
       input set are promoted to Default ACL entries. Default ACL  entries
       in the input set are discarded. (A warning is issued if that happens).

Dieser Auszug erklärt es auch ziemlich gut:

Es gibt zwei Arten von ACLs: Zugriffs-ACLs und Standard-ACLs. Eine Zugriffs-ACL ist die Zugriffssteuerungsliste für eine bestimmte Datei oder ein bestimmtes Verzeichnis. Eine Standard-ACL kann nur einem Verzeichnis zugeordnet werden. Wenn eine Datei im Verzeichnis keine Zugriffs-ACL hat, werden die Regeln der Standard-ACL für das Verzeichnis verwendet. Standard-ACLs sind optional.

Quelle: 8.2. Festlegen von Zugriffs-ACLs .

Beispiel

Angenommen, ich habe diese Verzeichnisstruktur.

$ tree
.
|-- dir1
|   |-- dirA
|   |   `-- file1
|   `-- fileA
`-- file1

2 directories, 3 files

Legen Sie nun die Berechtigungen mit dem ersten setfaclBefehl in Ihrer Frage fest:

$ setfacl -R -m u:saml:rwx -m u:samtest:rwX .

Was zu folgenden Ergebnissen führt:

$ getfacl dir1/ file1
# file: dir1
# owner: saml
# group: saml
user::rwx
user:saml:rwx
user:samtest:rwx
group::rwx
mask::rwx
other::r-x

# file: file1
# owner: saml
# group: saml
user::rw-
user:saml:rwx
user:samtest:rwx
group::rw-
mask::rwx
other::r--

Ohne den hier ausgeführten -dRBefehl würden neue Verzeichnisse nicht von Ihren ACLs abgedeckt:

$ mkdir dir2

$ getfacl dir2
# file: dir2
# owner: saml
# group: saml
user::rwx
group::rwx
other::r-x

Aber wenn wir dieses Verzeichnis entfernen und den setfacl -dR ...Befehl ausführen und diesen Vorgang oben wiederholen:

$ rmdir dir2
$ setfacl -dR -m u:saml:rwx -m u:samtest:rwX .

Jetzt sehen die Berechtigungen ganz anders aus:

$ getfacl dir1/ file1 
# file: dir1/
# owner: saml
# group: saml
user::rwx
user:saml:rwx
user:samtest:rwx
group::rwx
mask::rwx
other::r-x
default:user::rwx
default:user:saml:rwx
default:user:samtest:rwx
default:group::rwx
default:mask::rwx
default:other::r-x

# file: file1
# owner: saml
# group: saml
user::rw-
user:saml:rwx
user:samtest:rwx
group::rw-
mask::rwx
other::r--

Und jetzt übernimmt unser neu erstelltes Verzeichnis diese "Standard" -Berechtigungen:

$ mkdir dir2

$ getfacl dir2
# file: dir2
# owner: saml
# group: saml
user::rwx
user:saml:rwx
user:samtest:rwx
group::rwx
mask::rwx
other::r-x
default:user::rwx
default:user:saml:rwx
default:user:samtest:rwx
default:group::rwx
default:mask::rwx
default:other::r-x

Wenn diese Berechtigungen dir2aktiviert sind, werden diese Berechtigungen nun auch für Dateien in folgenden dir2Bereichen erzwungen:

$ touch dir2/fileA
$ getfacl dir2/fileA 
# file: dir2/fileA
# owner: saml
# group: saml
user::rw-
user:saml:rwx           #effective:rw-
user:samtest:rwx        #effective:rw-
group::rwx          #effective:rw-
mask::rw-
other::r--
slm
quelle
Ah, nur um zu bestätigen, Sie meinen, wenn wir das Verzeichnis haben, app/cachedas ein Verzeichnis mit dem Namen enthält dev, wird der erste Befehl darauf angewendet, aber nicht der zweite? Und wenn später ein anderes Verzeichnis hinzugefügt wird (z. B. prod), legt der zweite Befehl die Berechtigungen fest? Ist dies nicht der Fall, sollte ich den zweiten Befehl überspringen können?
Hosh Sadiq
1
@HoshSadiq - nein, das -Rist ein rekursiver Befehl, daher gelten die Berechtigungen. Die -dWachen, wenn jemand später ein Verzeichnis erstellen oder ein Verzeichnis in den Baum verschieben würde, damit auch diese ACL angewendet würde.
slm
Das ist großartig! Macht die Dinge viel klarer :) Danke!
Hosh Sadiq