Jadikan semua file baru dalam direktori dapat diakses oleh grup

131

Misalkan saya memiliki dua pengguna Alice dan Bob dan sebuah grup GROUPNAME dan sebuah folder foo, kedua pengguna tersebut adalah anggota GROUPNAME (menggunakan Linux dan ext3).

Jika saya simpan sebagai pengguna Alice file di bawah foo, hak akses adalah: -rw-r--r-- Alice Alice. Namun, apakah mungkin untuk mencapai bahwa setiap file yang disimpan di bawah subdirektori foomemiliki izin -rwxrwx--- Alice GROUPNAME(yaitu pemilik Alice, grup GROUPNAME)?

siswa
sumber

Jawaban:

91

Anda dapat mengontrol bit izin yang ditetapkan dengan umask, dan grup dengan membuat direktori setgid ke GROUPNAME.

$ umask 002            # allow group write; everyone must do this
$ chgrp GROUPNAME .    # set directory group to GROUPNAME
$ chmod g+s .          # files created in directory will be in group GROUPNAME

Perhatikan bahwa Anda harus melakukan chgrp/ chmoduntuk setiap subdirektori; itu tidak merambat secara otomatis (yaitu, tidak ada direktori yang ada atau yang kemudian dibuat di bawah direktori setgid akan menjadi setgid , meskipun yang terakhir akan berada dalam grup GROUPNAME).

Perhatikan juga bahwa itu umaskadalah atribut proses dan berlaku untuk semua file yang dibuat oleh proses itu dan anak-anaknya (yang mewarisi umaskefek pada orang tua mereka saat fork()itu). Pengguna mungkin perlu mengatur ini ~/.profile, dan mungkin perlu berhati-hati terhadap hal-hal yang tidak terkait dengan direktori Anda yang memerlukan izin berbeda. modul mungkin berguna jika Anda memerlukan pengaturan berbeda saat melakukan hal yang berbeda.

Anda dapat mengontrol sesuatu dengan sedikit lebih baik jika Anda dapat menggunakan POSIX ACL; harus dimungkinkan untuk menentukan mask perizinan dan grup, dan membuatnya disebarluaskan dengan bijaksana. Namun, dukungan untuk POSIX ACL agak bervariasi.

geekosaurus
sumber
6
Subdirektori yang dibuat setelah pengaturan setgid pada direktori induk akan membuat setgid diatur secara otomatis.
Arrowmaster
2
@Arrowmaster: Pada beberapa sistem, mungkin, tetapi tidak semua; Saya menguji pada OSX dan tidak menyebar, setidaknya untuk non-root.
geekosaur
2
Baik di Debian (dan saya berasumsi sebagian besar distro Linux lainnya) setgid dan nama grup keduanya menyebar.
Arrowmaster
3
Pada OS X, bit setgid pada direktori diabaikan; file dan direktori baru selalu diberi grup direktori yang berisi.
John Flatness
Apakah mungkin juga file yang disalin atau dipindahkan ke foo (menggunakan cp resp. Mv) mendapatkan izin yang diinginkan secara otomatis ( -rwxrwx--- A G)?
siswa
106

Jika memungkinkan, gunakan daftar kontrol akses (ACL) .

Di Linux, pastikan sistem file yang Anda gunakan mendukung ACL (kebanyakan sistem file unix melakukannya). Anda mungkin perlu mengubah opsi mount untuk mengaktifkan ACL: dengan ext2 / ext3 / ext4, Anda perlu menentukan aclopsi mount secara eksplisit, sehingga entri di dalamnya /etc/fstabakan terlihat seperti /dev/sda1 / ext4 errors=remount-ro,acl 0 1. Jalankan mount -o remount,acl /untuk mengaktifkan ACL tanpa me-reboot. Juga instal alat getfacl- alat baris perintah ACL dan setfacl, biasanya disediakan dalam paket yang disebut acl.

Sekarang setelah pengaturan satu kali selesai, ubah ACL direktori untuk memberikan izin menulis grup dan membuat izin ini diwarisi oleh file yang baru dibuat. Di bawah Linux:

setfacl -d -m group:GROUPNAME:rwx /path/to/directory
setfacl -m group:GROUPNAME:rwx /path/to/directory

Jika ACL bukan pilihan, membuat direktori yang dimiliki oleh kelompok GROUPNAME, dan mengatur hak akses untuk 2775 atau 2770: chmod g+rwxs /path/to/directory. Di ssini berarti bit setgid; untuk direktori, itu berarti file yang dibuat dalam direktori ini akan menjadi milik grup yang memiliki direktori.

Anda juga harus mengatur umask Alice dan Bob untuk membuat semua file mereka dapat ditulis grup secara default. Umask default pada sebagian besar sistem adalah 022, artinya file dapat memiliki semua izin kecuali tulis oleh grup dan lainnya. Ubah itu menjadi 002, artinya hanya melarang izin menulis-oleh-lainnya. Anda biasanya akan meletakkan pengaturan itu di ~/.profile:

umask 002    # or 007 to have files not readable by others
Gilles
sumber
6
+1 - Jawaban yang sangat menyeluruh. Saya tidak pernah tahu orang bisa mengirim ulang / on-the-fly. Senang mendengarnya.
boehj
1
Perintah setfacl -d saya tidak berfungsi untuk saya karena file yang terdapat dalam direktori tersebut memiliki r-- mask yang meniadakan setiap hak akses tulis. Akan sangat membantu. Lihat unix.stackexchange.com/questions/71743/...
Ben McCann
2
@its_me Q1: Saya menunjukkan mountperintah dengan remountopsi, jadi tidak digunakan fstab. Memiliki acldua kali berarti filesystem sudah di-mount dengan aclopsi, dan tidak berbahaya. acl adalah default untuk ext4 di kernel baru-baru ini, by the way (tambalan itu masih baru kembali ketika saya menulis jawaban ini). T2: Anda dapat menjalankan perintah dalam urutan mana pun.
Gilles
1
@its_me Ya, pengertian Anda benar, hanya saja tidak masalah bagaimana Anda menambahkan entri
Gilles
8
Anda harus meningkatkan jawaban kemudian menggunakan GROUPNAMEalih-alih G, untuk membuatnya lebih jelas
knocte
24

Pertanyaan ini sangat cocok untuk linux acl. Karena Anda tidak menyatakan OS Anda, saya akan menganggap Linux sebagai berikut. Berikut adalah contoh sesi.

Saya tidak tahu acltutorial yang sangat bagus , tetapi Anda bisa melakukan lebih buruk daripada http://www.vanemery.com/Linux/ACL/linux-acl.html

Perhatikan bahwa default aclberperilaku seperti umask lokal. Karena setidaknya di Linux, umasks diterapkan secara global, ini adalah satu-satunya cara saya tahu untuk mendapatkan efek dari umask lokal. Untuk beberapa alasan fitur ini sedikit dikenal. Jaring penuh dengan orang-orang bertanya tentang menimpa umask lokal, tetapi hampir tidak ada yang berpikir untuk menggunakan acl.

Perhatikan juga bahwa Anda perlu memasang partisi tempat Anda bekerja dengan acldukungan, mis.

/dev/mapper/debian-acl /mnt/acl        ext3    defaults,acl        0       2

Sesi berikut:

/mnt/acl$ mkdir foo
/mnt/acl$ getfacl foo
# file: foo
# owner: faheem
# group: faheem
user::rwx
group::r-x
other::r-x

Tetapkan grup foomenjadi staff, dan setel acl grup dan pengguna foomenjadi rwx.

/mnt/acl$ chgrp staff foo
/mnt/acl$ setfacl -R -m u::rwx,g::rwx foo
/mnt/acl$ getfacl foo
# file: foo
# owner: faheem
# group: staff
user::rwx
group::rwx
other::r-x

Tetapkan akun default pengguna dan grup rwxjuga. Ini mendefinisikan izin yang diwarisi dari file dan direktori foo. Jadi semua file dan direktori yang dibuat di bawah foo akan memiliki izin grup rw.

/mnt/acl$ setfacl -d --set u::rwx,g::rwx,o::- foo
/mnt/acl$ getfacl foo
# file: foo
# owner: faheem
# group: staff
user::rwx
group::rwx
other::r-x
default:user::rwx
default:group::rwx
default:other::---

Sekarang buat beberapa file foosebagai pengguna faheemdan john.

/mnt/acl$ cd foo
/mnt/acl/foo$ touch bar

# switch to user john for this next command.

/mnt/acl/foo$ touch baz

Daftar file. Perhatikan bahwa kedua file yang dimiliki oleh faheemdan file yang dimiliki oleh johndibuat dengan izin grup rw.

/mnt/acl/foo$ ls -la
total 3
drwxrwxr-x+ 2 faheem staff  1024 May  9 01:22 .
drwxr-xr-x  4 faheem faheem 1024 May  9 01:20 ..
-rw-rw----  1 faheem faheem    0 May  9 01:20 bar
-rw-rw----  1 john   john      0 May  9 01:22 baz
Faheem Mitha
sumber