Mengapa FreeBSD kehilangan w mask tetapi Debian mempertahankannya?

10

Saya mencoba memahami perbedaan perilaku antara FreeBSD ACL dan Linux ACL. Secara khusus, mekanisme pewarisan untuk ACL default.

Saya menggunakan yang berikut ini pada Debian 9.6 dan 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

Saya mendapatkan output berikut dari Debian 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

Perhatikan bahwa file outsidedan insidememiliki izin yang berbeda. Secara khusus, outsidefile memiliki -rw-r--r--, yang merupakan default untuk pengguna ini dan insidefile -rw-rw----, menghormati ACL default yang saya tetapkan storagedirektori.

Output dari skrip yang sama pada 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

(Catatan Debian getfacljuga akan menunjukkan ACL default bahkan ketika tidak menggunakan di -dmana FreeBSD tidak, tapi saya tidak berpikir ACL sebenarnya storageberbeda.)

Di sini, file outsidedan insidejuga memiliki izin yang berbeda, tetapi insidefile tidak memiliki izin menulis grup yang versi Debian lakukan, mungkin karena topeng di Debian mempertahankan wsementara topeng di FreeBSD kehilangan w.

Mengapa FreeBSD kehilangan wtopeng tetapi Debian mempertahankannya?

Roxy
sumber
1
Apa yang getfacl storageditunjukkan pada kedua sistem?
Mikel
Apakah ini bekerja secara identik jika Anda tidak menggunakan bit grup sticky ( g+s)?
sebasth
@Mikel Saya telah memperbarui konten pertanyaan asli untuk menunjukkan getfaclinformasi.
Roxy
@sebasth Saya telah memperbarui pertanyaan awal untuk menghapus bit setgid. Itu tidak relevan.
Roxy
Setelah mengatur ACL ke storage, ls harus menunjukkan+ , sama saya harapkan getfacloutput akan serupa dengan apa yang Anda dapatkan di sistem Debian. Apakah setfaclmengembalikan kode keluar berhasil?
sebasth

Jawaban:

1

Singkatnya saya akan mengatakan (menganggap) mereka menggunakan umask secara berbeda.

0022 persis grup-lainnya tidak disetel W. Anda dapat mengubah umask untuk menghapus larangan menulis dan memeriksa hasilnya.

Mengutip Solaris alias manual SunOS (dan komentar juga) karena itu tampaknya cukup terkait: "... Umask (1) tidak akan diterapkan jika direktori berisi entri ACL default. ..."

poige
sumber
1
Apakah yang satu benar dan yang lain salah? Adakah standar yang harus dipatuhi ini?
Roxy
Saya bukan ahli dalam hal ini tetapi (ironisnya) orang WEB FreeBSD memiliki entri untuk implementasi "kanonik" (bisa dibilang) (SunOS) yang secara eksplisit mengatakan umask tidak boleh dihitung: freebsd.org/cgi/man.cgi?query= setfacl & manpath = SunOS + 5.10
poige
"... Umask (1) tidak akan diterapkan jika direktori berisi entri ACL default. ..."
poige
Halaman manual FreeBSD sendiri tidak disebutkan umask, jadi ini kelihatannya merupakan perilaku yang kurang jelas. Apakah implementasi ACL FreeBSD seharusnya bekerja sama dengan SunOS?
Roxy
Jelas itu tidak (menyebutkan) karena jika tidak maka akan terlihat kontradiksi yang jelas antara hal-hal yang dinyatakan dan dilakukan.
poige