Bagaimana cara membuat izin file baru mewarisi dari direktori induk?

85

Saya memiliki direktori bernama data. Lalu saya menjalankan skrip di bawah id pengguna 'robot'. robot menulis ke datadirektori dan memperbarui file di dalamnya. Idenya dataterbuka bagi saya dan robot untuk memperbarui.

Jadi saya mengatur grup izin dan pemilik seperti ini

drwxrwxr-x  2 me robot-grp 4096 Jun 11 20:50 data

tempat saya dan robot milik 'robot-grp'. Saya mengubah izin dan grup pemilik secara rekursif seperti direktori induk.

Saya secara teratur mengunggah file baru ke dalam datadirektori menggunakan rsync. Sayangnya, file baru yang diunggah tidak mewarisi izin direktori induk seperti yang saya harapkan. Sebaliknya terlihat seperti ini

-rw-r--r-- 1 me users       6 Jun 11 20:50 new-file.txt

Ketika robot mencoba memperbarui new-file.txt, gagal karena kurangnya izin file.

Saya tidak yakin apakah pengaturan umask membantu. Di anycase file baru tidak benar-benar mengikutinya.

$ umask -S
u=rwx,g=rx,o=rx

Saya sering dikacaukan oleh izin file Unix. Apakah saya memiliki rencana yang tepat? Saya menggunakan lenny Debian.

Wai Yip Tung
sumber

Jawaban:

53

Anda tidak ingin mengubah umask default sistem Anda, itu adalah risiko keamanan. Opsi bit lengket akan bekerja sampai batas tertentu, tetapi menggunakan ACL adalah cara terbaik untuk melakukannya. Ini lebih mudah dari yang Anda pikirkan. Masalah dengan ACL dasar adalah bahwa mereka tidak rekursif secara default. Jika Anda menetapkan ACL pada direktori, hanya file di dalam direktori yang mewarisi ACL. Jika Anda membuat subdirektori, itu tidak mendapatkan induk ACL kecuali ACL diatur untuk berulang.

Pertama, pastikan ACL diaktifkan untuk volume direktori aktif. Jika sudah tune2fs, Anda dapat melakukan hal berikut:

# tune2fs -l /dev/sda1 | grep acl
Default mount options:    user_xattr acl

Jika Anda tidak memilikinya tune2fs, maka periksa fstabs:

# cat /etc/fstab 
/dev/system/root        /                       ext3    defaults        1 1
/dev/system/home        /home                   ext3    defaults        1 2
/dev/storage/data       /data                   ext3    defaults        1 2
LABEL=/boot             /boot                   ext3    defaults        1 2

Kolom ke-4 yang mengatakan "default" berarti pada sistem saya (CentOS 5.5), ACL aktif. Jika ragu, biarkan sebagai default. Jika Anda mencoba untuk mengatur ACL dan kesalahan itu, kembali dan menambahkan opsi acl ke / etc / fstab tepat setelah default: defaults,acl.

Dari apa yang saya mengerti, Anda ingin semua orang di grup pengguna memiliki akses tulis ke direktori data. Itu dicapai dengan yang berikut:

setfacl -Rm g:users:rwX,d:g:users:rwX data/
churnd
sumber
Saya menggunakan perintah ini tetapi tidak memperbaiki masalah saya, bagaimana saya bisa membatalkan perintah ini?
Itai Ganot
Melakukan trik di ubuntu dengan sudo setfacl -Rm g:users:rwX,d:g:users:rwX /var/www/logs_or_something. Punya masalah dengan tes PHPUnit. Setelah membuat file log dari menjalankan tes apache, pengguna www-datatidak dapat menulis / membacanya.
s3m3n
2
@Itai Ganot - menurut setfaclhalaman manual , -batau --remove-allmenghapus ACL yang diperluas.
jww
Jadi, Anda hanya akan menambahkannya setfacl -Rm g:users:rwX,d:g:users:rwX data/di akhir /etc/fstab?
425nesp
@ piña no. satu-satunya perubahan yang Anda buat ke / etc / fstab adalah untuk mengubah defaultske defaults,acl. setfacladalah perintah yang harus Anda jalankan dari terminal. data/harus diganti oleh jalur ke direktori yang ingin Anda ubah.
Segfault
32

Menandai direktori setgid ( g+s) akan membuat file baru mewarisi kepemilikan grup dari direktori, tetapi -gopsi rsync akan berusaha menimpa ini.

Ignacio Vazquez-Abrams
sumber
11
Bit setgid hanya membuat file yang dibuat mewarisi grup / jika / orang yang membuat file baru adalah anggota grup itu; jika pengguna yang membuat adalah pemilik tetapi bukan anggota grup, atau direktori tersebut dapat ditulis oleh dunia, bit setgid tidak akan melakukan apa pun. Dan umask untuk semua pengguna pembuat file masih perlu diatur untuk memungkinkan akses grup yang sesuai.
dannysauer
1
@dannysauer "jika pengguna yang membuat adalah pemilik tetapi bukan anggota grup ... bit setgid tidak akan melakukan apa pun" - terima kasih. Masuk akal sekarang - tetapi tanpa umpan balik dari rsync, bertanya-tanya mengapa itu tidak berhasil.
user12345
4

Jawaban lain berlaku dalam kasus umum, tetapi ketika Anda menyebutkan bahwa rsync adalah sumber masalah, Anda mungkin hanya perlu menyesuaikan permintaannya.

Sebagai permulaan, -abendera populer membuat izin menyalin rsync; gunakan -ristead of -aatau add -no-p(tanpa sinkronisasi izin) dan -no-g(tanpa sinkronisasi grup). Rsync juga mendukung --chmodflag untuk mengubah izin pada file yang baru dibuat.

mbq
sumber
3

Umask Anda salah untuk izin yang Anda inginkan. Anda menginginkan umask 002. Saat ini Anda memiliki umask 022. Juga, komentar tentang membuat direktori setgid sudah benar, tetapi saya tidak yakin apakah kepemilikan grup file adalah sesuatu yang ingin Anda ubah atau tidak.

Izin file Unix sebenarnya model yang sangat sederhana. Saya menemukan ACL benar-benar membingungkan diri saya sendiri. :-)

Beraneka ragam
sumber
4
"Izin file Unix sebenarnya model yang sangat sederhana. Saya menemukan ACL benar-benar membingungkan diri saya sendiri." - Saya agak merasakan yang sebaliknya (tapi +1 anyways). ACL (dan Izinkan / Tolak ACE) sederhana, dan izin Unix tidak masuk akal. Tapi itu datang dari seorang pria yang menderita instalasi Postfix / Dovecot / Clam / SpamAssassin.
jww