Festlegen unterschiedlicher ACLs für Verzeichnisse und Dateien

15

Ich möchte Standardberechtigungen für eine Dateifreigabe einrichten, damit jeder rwxalle Verzeichnisse und alle neu erstellten Dateien anzeigen kann rw.

Jeder, der auf diese Freigabe zugreift, gehört derselben Gruppe an, sodass dies kein Problem darstellt.

Ich habe versucht, dies über ACLs zu tun, ohne alle Benutzeraufgaben und dergleichen zu ändern. Hier sind meine aktuellen Aufrufe:

setfacl -Rdm g:mygroup:rwx share_name
setfacl -Rm g:mygroup:rwx share_name

Mein Problem ist , dass , während ich alle neu erstellt werden soll Unterverzeichnisse sein rwx, ich möchte nur neu erstellte Dateien sein rw.

Hat jemand eine bessere Methode, um mein gewünschtes Endergebnis zu erzielen? Gibt es eine Möglichkeit, ACLs für Verzeichnisse getrennt von Dateien festzulegen, ähnlich wie bei " chmod +xvs." chmod +X?

Vielen Dank

Durandal
quelle

Antworten:

12

Wie Gilles betont, setfaclgeben die Standardberechtigungen die maximalen Berechtigungen an und ersetzen im Wesentlichen die umask. Neu erstellte Dateien sind also nur dann rwverfügbar , wenn die Anwendung, die die Datei erstellt hat, speziell darum gebeten hat, dass sie ausführbar ist.

$ mkdir test
$ touch test/oldfile
$ getfacl test/oldfile
# file: test/oldfile
# owner: myuser
# group: myuser
user::rw-
group::r--
other::r--

$ setfacl -m d:g:mygroup:rwx test
$ touch test/newfile
$ getfacl test/newfile
# file: test/newfile
# owner: myuser
# group: myuser
user::rw-
group::r-x                         #effective:r--
group:mygroup:rwx                  #effective:rw-
mask::rw-
other::r--

Beachten Sie die oben angegebenen effektiven Dauerwellen. (Es gibt nur wenige Programme, die nach dem Setzen des Ausführungsbits für die von ihnen erstellten Dateien fragen, z. B. gccfür ausführbare Dateien und cpwenn die zu kopierende Datei ausführbar war.)

Oder haben Sie gemeint, dass der erste Befehl setfacl so funktioniert hat, wie Sie es wollten, der zweite jedoch nicht? Mit anderen Worten, Sie möchten Berechtigungen für die alten Dateien korrigieren und sicherstellen, dass Verzeichnisse durchsuchbar sind, ohne anderen regulären Dateien Ausführungsberechtigungen zu erteilen.

Meine Version von setfaclerlaubt Xgenau das, was Sie wollen, zB:

setfacl g:mygroup:rwX

$ setfacl --version
setfacl 2.2.49
$ rm -r test
$ mkdir test
$ mkdir test/olddir
$ touch test/oldfile
$ find test -ls
107513    4 drwxr-xr-x   3 myuser    myuser        4096 Dec 22 01:56 test
107539    0 -rw-r--r--   1 myuser    myuser           0 Dec 22 01:56 test/oldfile
107529    4 drwxr-xr-x   2 myuser    myuser        4096 Dec 22 01:56 test/olddir
$ setfacl -Rm g:somegroup:rwx test
$ find test -ls
107513    4 drwxrwxr-x   3 myuser    myuser        4096 Dec 22 01:56 test
107539    0 -rw-rwxr--   1 myuser    myuser           0 Dec 22 01:56 test/oldfile
107529    4 drwxrwxr-x   2 myuser    myuser        4096 Dec 22 01:56 test/olddir
$ rm -r test
$ mkdir test
$ mkdir test/olddir
$ touch test/oldfile
$ setfacl -Rm g:somegroup:rwX test
$ find test -ls
107513    4 drwxrwxr-x   3 myuser    myuser        4096 Dec 22 01:56 test
107539    0 -rw-rw-r--   1 myuser    myuser           0 Dec 22 01:56 test/oldfile
107529    4 drwxrwxr-x   2 myuser    myuser        4096 Dec 22 01:56 test/olddir

Wenn Ihre Version von setfacldas nicht unterstützt, warum nicht find?

Überschreibe Berechtigungen und setze sie auf rw für Dateien und rwx für Verzeichnisse

$ find . \( -type f -exec setfacl -m g:mygroup:rw '{}' ';' \) \
      -o \( -type d -exec setfacl -m g:mygroup:rwx '{}' ';' \)

Festlegen von mygroup-ACL-Berechtigungen basierend auf vorhandenen Gruppenberechtigungen

$ find . \( -perm -g+x -exec setfacl -m g:mygroup:rw '{}' ';' \) \
      -o \( -exec setfacl -m g:mygroup:rwx '{}' ';' \)

Sie sollten wahrscheinlich überprüfen, ob die Gruppenmaske wirksame Berechtigungen bietet. Wenn nicht, müssen Sie dies auch ausführen:

$ find . -type d -exec chmod g+rwX '{}' ';'
Mikel
quelle
4

Für zukünftige Leser, die setfaclvorhandene Dateien / Ordner bearbeiten möchten, ohne das ausführbare Bit zu Ihren Dateien hinzuzufügen, ist die Lösung dieser Teil der Antwort von @ Mikel :

Meine Version von setfacl erlaubt X genau so, wie Sie es möchten, zB:

setfacl g:mygroup:rwX

Relevanter Auszug aus der setfaclDokumentation :

Das Feld perms ist eine Zeichenkombination, die die Berechtigungen angibt: read (r), write (w), execute (x), execute nur, wenn die Datei ein Verzeichnis ist oder bereits Ausführungsberechtigungen für einen Benutzer (X) besitzt .

Erik Koopmans
quelle
2

Soweit ich Linux-ACLs verstehe, setfacl -Rdm g:mygroup:rwx share_namemacht genau das, was Sie wollen. Experiment:

umask 007
mkdir foo
chgrp mygroup foo
chmod 2700 foo
setfacl -d -m group:mygroup:rwx foo
setfacl -m group:mygroup:rwx foo
touch foo/data
echo '#!/bin/ls' >foo/exec
chmod +x foo/exec

Dann als anderer Benutzer in der Gruppe mygroup:

$ cat foo/*
#!/bin/ls
#!/bin/ls
$ ./foo/data
ash: ./foo/data: Permission denied
$ ./foo/exec
./foo/exec

Was ist los?

$ getfacl foo/data
# file: foo/data
# owner: myuser
# group: mygroup
user::rw-
group::---
group:mygroup:rwx                 #effective:rw-
mask::rw-
other::---

Die effektive mygroupZugriffssteuerungsliste für ist das Ergebnis der Verknüpfung des ACL_GROUPEintrags für mygroup( rwx) mit dem Eintrag ACL_MASK ( rw-).

In der Manpage acl (5) wird die Berechnung unter „Zugriffskontrollalgorithmen“ erläutert. Es erklärt nicht, wie ACL_MASKEinträge generiert werden, aber in der Praxis scheint das Richtige zu passieren.

Gilles 'SO - hör auf böse zu sein'
quelle