Próbuję zrozumieć różnicę w zachowaniu między listami ACL systemu FreeBSD i listami ACL systemu Linux. W szczególności mechanizm dziedziczenia domyślnych list ACL.
Użyłem następujących rzeczy zarówno w Debianie 9.6, jak i FreeBSD 12:
$ cat test_acl.sh
#!/bin/sh
set -xe
mkdir storage
setfacl -d -m u::rwx,g::rwx,o::-,m::rwx storage
touch outside
cd storage
touch inside
cd ..
ls -ld outside storage storage/inside
getfacl -d storage
getfacl storage
getfacl outside
getfacl storage/inside
umask
Otrzymuję następujące dane wyjściowe z Debiana 9.6:
$ ./test_acl.sh
+ mkdir storage
+ setfacl -d -m u::rwx,g::rwx,o::-,m::rwx storage
+ touch outside
+ cd storage
+ touch inside
+ cd ..
+ ls -ld outside storage storage/inside
-rw-r--r-- 1 aaa aaa 0 Dec 28 11:16 outside
drwxr-xr-x+ 2 aaa aaa 4096 Dec 28 11:16 storage
-rw-rw----+ 1 aaa aaa 0 Dec 28 11:16 storage/inside
+ getfacl -d storage
# file: storage
# owner: aaa
# group: aaa
user::rwx
group::rwx
mask::rwx
other::---
+ getfacl storage
# file: storage
# owner: aaa
# group: aaa
user::rwx
group::r-x
other::r-x
default:user::rwx
default:group::rwx
default:mask::rwx
default:other::---
+ getfacl outside
# file: outside
# owner: aaa
# group: aaa
user::rw-
group::r--
other::r--
+ getfacl storage/inside
# file: storage/inside
# owner: aaa
# group: aaa
user::rw-
group::rwx #effective:rw-
mask::rw-
other::---
+ umask
0022
Zauważ, że pliki outside
i inside
mają różne uprawnienia. W szczególności outside
plik ma -rw-r--r--
, który jest domyślny dla tego użytkownika i inside
plik ma -rw-rw----
, uwzględniając domyślne listy ACL, które przypisałem do storage
katalogu.
Dane wyjściowe tego samego skryptu we FreeBSD 12:
$ ./test_acl.sh
+ mkdir storage
+ setfacl -d -m u::rwx,g::rwx,o::-,m::rwx storage
+ touch outside
+ cd storage
+ touch inside
+ cd ..
+ ls -ld outside storage storage/inside
-rw-r--r-- 1 aaa aaa 0 Dec 28 03:16 outside
drwxr-xr-x 2 aaa aaa 512 Dec 28 03:16 storage
-rw-r-----+ 1 aaa aaa 0 Dec 28 03:16 storage/inside
+ getfacl -d storage
# file: storage
# owner: aaa
# group: aaa
user::rwx
group::rwx
mask::rwx
other::---
+ getfacl storage
# file: storage
# owner: aaa
# group: aaa
user::rwx
group::r-x
other::r-x
+ getfacl outside
# file: outside
# owner: aaa
# group: aaa
user::rw-
group::r--
other::r--
+ getfacl storage/inside
# file: storage/inside
# owner: aaa
# group: aaa
user::rw-
group::rwx # effective: r--
mask::r--
other::---
+ umask
0022
(Uwaga: Debian getfacl
pokaże także domyślne listy ACL, nawet jeśli nie używa tego, -d
co nie ma w FreeBSD, ale nie sądzę, że rzeczywiste listy ACL storage
są inne.)
Tutaj, outside
a inside
pliki mają także różne uprawnienia, ale inside
plik nie ma prawa zapisu grupa, która wersja Debiana robi, prawdopodobnie dlatego, że maska w Debianie zachował w
natomiast maska w FreeBSD stracił w
.
Dlaczego FreeBSD stracił w
maskę, ale Debian ją zachował?
źródło
getfacl storage
wyświetla się w obu systemach?g+s
)?getfacl
informacje.storage
,ls
powinienem pokazać+
, podobnie oczekiwałbym, żegetfacl
wyjście będzie podobne do tego, co masz w systemie Debian. Czysetfacl
kod zakończenia powodzenia powrócił?Odpowiedzi:
W skrócie powiedziałbym (zakładam), że używają umask inaczej.
0022 jest dokładnie rozbrojony na inne grupy W. Możesz zmienić umask, aby usunąć zakaz zapisu i sprawdzić wynik.
Powołując się na instrukcję Solaris aka SunOS (a także komentarze), ponieważ wydaje się to dość powiązane: „… Umask (1) nie zostanie zastosowany, jeśli katalog zawiera domyślne wpisy ACL.…”
źródło
umask
, więc wydaje się, że jest to niedefiniowane zachowanie. Czy implementacja ACL FreeBSD ma działać tak samo jak SunOS?