Ustawianie różnych list ACL dla katalogów i plików

15

Chcę skonfigurować domyślne uprawnienia do udziału plików, aby każdy mógł rwxwszystkie katalogi i aby wszystkie nowo utworzone pliki były rw.

Każdy, kto uzyskuje dostęp do tego udziału, należy do tej samej grupy, więc nie stanowi to problemu.

Patrzyłem na robienie tego za pośrednictwem list ACL bez zmiany wszystkich umasks użytkowników i tym podobne. Oto moje obecne inwokacje:

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

Moim problemem jest to, że gdy chcę wszystkich nowo utworzonych podkatalogów być rwx, tylko chcę nowo utworzone pliki być rw.

Czy ktoś ma lepszą metodę osiągnięcia pożądanego efektu końcowego? Czy istnieje jakiś sposób, aby ustawić listy kontroli dostępu w katalogach oddzielnie od plików, podobnie jak chmod +xvs. chmod +X?

Dzięki

durandal
źródło

Odpowiedzi:

12

Jak podkreśla Gilles, setfacldomyślne uprawnienia określają maksymalne uprawnienia, w zasadzie zastępując umask. Tak nowo utworzone pliki będą dostępne, rwchyba że aplikacja, która utworzyła plik, poprosiła specjalnie o wykonanie.

$ 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--

Zwróć uwagę na efektywne perms powyżej. (Istnieje tylko kilka programów, które proszą o ustawienie bitu wykonania na tworzonych plikach, np. gccDla plików wykonywalnych i cpczy kopiowany plik był wykonywalny.)

A może miałeś na myśli, że pierwsze polecenie setfacl działało tak, jak chciałeś, ale drugie nie? Innymi słowy, chcesz naprawić uprawnienia do starych plików, upewniając się, że katalogi są możliwe do przejścia, bez udzielania innym regularnym plikom uprawnień do wykonywania?

Moja wersja setfaclpozwala Xdokładnie tak, jak chcesz, np .:

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

Jeśli twoja wersja tego setfaclnie obsługuje, dlaczego nie użyć find?

zastępuj uprawnienia, ustawiając je na rw dla plików i rwx dla katalogów

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

ustaw uprawnienia ACL mojej grupy na podstawie istniejących uprawnień grupy

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

Prawdopodobnie będziesz chciał sprawdzić, czy maska ​​grupy zapewnia skuteczne uprawnienia. Jeśli nie, musisz to również uruchomić:

$ find . -type d -exec chmod g+rwX '{}' ';'
Mikel
źródło
4

Dla przyszłych czytelników, aby korzystać setfaclz istniejących plików / folderów bez dodawania bitu wykonywalnego do twoich plików, rozwiązaniem jest ta część odpowiedzi @ Mikel :

Moja wersja setfacl pozwala X dokładnie tak, jak chcesz, np .:

setfacl g:mygroup:rwX

Odpowiedni fragment setfacldokumentacji :

Pole perms jest kombinacją znaków wskazujących uprawnienia: odczyt (r), zapis (w), wykonanie (x), wykonanie tylko wtedy, gdy plik jest katalogiem lub ma już uprawnienia do wykonywania dla niektórych użytkowników (X) .

Erik Koopmans
źródło
2

O ile rozumiem listy ACL systemu Linux, setfacl -Rdm g:mygroup:rwx share_namerobi dokładnie to, co chcesz. Eksperyment:

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

Następnie jako inny użytkownik w grupie mygroup:

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

Co się dzieje?

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

Efektywna mygrouplista ACL dla jest wynikiem ACL_GROUPwpisania for mygroup( rwx) i wpisu ACL_MASK ( rw-).

Strona podręcznika acl (5) wyjaśnia to w części „Algorytmy kontroli dostępu”. Nie wyjaśnia, w jaki sposób ACL_MASKgenerowane są wpisy, ale w praktyce wydaje się, że tak się dzieje.

Gilles „SO- przestań być zły”
źródło