Mengatur ACL yang berbeda pada direktori dan file

15

Saya ingin mengatur izin default untuk berbagi file sehingga semua orang dapat rwxsemua direktori dan semua file yang baru dibuat rw.

Setiap orang yang mengakses bagian ini berada di grup yang sama, jadi ini bukan masalah.

Saya telah melihat melakukan hal ini melalui ACL tanpa mengubah semua umasks pengguna dan semacamnya. Berikut ini adalah doa saya saat ini:

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

Masalah saya adalah bahwa sementara aku ingin semua baru dibuat sub-direktori untuk menjadi rwx, saya hanya ingin yang baru dibuat file menjadi rw.

Adakah yang punya metode yang lebih baik untuk mencapai hasil akhir yang saya inginkan? Apakah ada cara untuk mengatur ACL pada direktori secara terpisah dari file, dalam nada yang mirip dengan chmod +xvs chmod +X?

Terima kasih

durandal
sumber

Jawaban:

12

Seperti yang ditunjukkan Gilles, setfaclizin default menentukan izin maksimum, yang pada dasarnya menggantikan umask. Jadi file yang baru dibuat akan rwkecuali aplikasi yang membuat file meminta khusus untuk dapat dieksekusi.

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

Perhatikan perm efektif di atas. (Hanya ada beberapa program yang akan meminta untuk mengatur bit eksekusi pada file yang dibuatnya, misalnya gccuntuk file yang dapat dieksekusi dan cpjika file yang sedang disalin dapat dieksekusi.)

Atau maksud Anda bahwa perintah setfacl pertama berfungsi seperti yang Anda inginkan, tetapi yang kedua tidak? Dengan kata lain, Anda sedang mencari cara untuk memperbaiki izin pada file-file lama, memastikan bahwa direktori dapat dilewati, tanpa memberikan file biasa lainnya menjalankan izin?

Versi saya setfaclmemungkinkan Xpersis seperti yang Anda inginkan, misalnya:

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

Jika versi setfaclAnda tidak mendukung itu, mengapa tidak digunakan find?

menimpa izin, mengaturnya untuk rw untuk file dan rwx untuk dir

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

atur izin ACL mygroup berdasarkan izin grup yang ada

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

Anda mungkin ingin memeriksa bahwa mask grup memberikan izin yang efektif. Jika tidak, Anda harus menjalankan ini juga:

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

Untuk pembaca masa depan, untuk digunakan setfaclpada file / folder yang ada tanpa menambahkan bit yang dapat dieksekusi ke file Anda, solusinya adalah ini bagian dari jawaban @ Mikel :

Versi setfacl saya memungkinkan X persis seperti yang Anda inginkan, misalnya:

setfacl g:mygroup:rwX

Kutipan yang relevan dari setfacldokumentasi :

Bidang perms adalah kombinasi karakter yang menunjukkan izin: baca (r), tulis (w), jalankan (x), jalankan hanya jika file tersebut adalah direktori atau sudah memiliki izin eksekusi untuk beberapa pengguna (X) .

Erik Koopmans
sumber
2

Sejauh yang saya mengerti ACL Linux, setfacl -Rdm g:mygroup:rwx share_namemelakukan apa yang Anda inginkan. Percobaan:

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

Kemudian sebagai pengguna yang berbeda dalam grup mygroup:

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

Apa yang sedang terjadi?

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

ACL yang efektif untuk mygroupadalah hasil dari dan ACL_GROUPentri untuk mygroup( rwx) dengan entri ACL_MASK ( rw-).

The halaman manual acl (5) menjelaskan perhitungan ini di bawah “Access algoritma cek”. Itu tidak menjelaskan bagaimana ACL_MASKentri dihasilkan, tetapi dalam praktiknya hal yang benar tampaknya terjadi.

Gilles 'SANGAT berhenti menjadi jahat'
sumber