Menetapkan izin default untuk file dan sub-direktori yang baru dibuat di bawah direktori di Linux?

99

Saya memiliki banyak skrip dan aplikasi yang berjalan lama yang menyimpan hasil keluaran dalam direktori yang dibagikan di antara beberapa pengguna. Saya ingin cara untuk memastikan bahwa setiap file dan direktori yang dibuat di bawah direktori bersama ini secara otomatis memiliki u=rwxg=rwxo=rizin.

Saya tahu bahwa saya dapat menggunakannya umask 006di awal berbagai skrip saya, tetapi saya tidak suka pendekatan itu karena banyak pengguna menulis skrip mereka sendiri dan mungkin lupa menyetel umask sendiri.

Saya benar-benar hanya ingin sistem file mengatur file dan direktori yang baru dibuat dengan izin tertentu jika ada di folder tertentu. Apakah ini mungkin?

Pembaruan : Saya pikir itu dapat dilakukan dengan POSIX ACL , menggunakan fungsi ACL Default, tetapi itu semua sedikit di atas kepala saya saat ini. Jika ada yang bisa menjelaskan bagaimana menggunakan ACL Default, mungkin akan menjawab pertanyaan ini dengan baik.

David Dean
sumber
1
ACL POSIX bagus, namun 60% mesin yang Anda temui tidak akan mengaktifkannya untuk sistem file tertentu, tergantung distribusinya. Berikut adalah pengantar dan contoh yang sangat bagus: suse.de/~agruen/acl/linux-acls/online
Pos Tim
1
Maksud Anda dokumen yang sama yang saya tautkan :) Saya belum memiliki perubahan untuk membacanya tetapi terima kasih atas perhatiannya pada masalah ketersediaan.
David Dean
1
Tautan di komentar Tim Post tampaknya sudah mati, tetapi berkat Arsip Internet, saya dapat melihatnya, dan memverifikasi bahwa vanemery.com/Linux/ACL/POSIX_ACL_on_Linux.html berisi dokumen yang sama persis. Saya akan mengedit pertanyaan untuk memperbarui link.
rmunn

Jawaban:

78

Untuk mendapatkan kepemilikan yang tepat, Anda dapat mengatur bit setuid grup pada direktori dengan

chmod g+rwxs dirname

Ini akan memastikan bahwa file yang dibuat di direktori dimiliki oleh grup. Anda kemudian harus memastikan bahwa setiap orang berjalan dengan umask 002 atau 007 atau semacamnya --- inilah mengapa Debian dan banyak sistem linux lainnya dikonfigurasi dengan grup per-pengguna secara default.

Saya tidak tahu cara memaksa izin yang Anda inginkan jika umask pengguna terlalu kuat.

Norman Ramsey
sumber
23
Ini tidak benar-benar memberikan solusi - dia bertanya tentang izin bukan kepemilikan, dan satu-satunya cara untuk melakukannya adalah dengan ACL
Yarin
3
"... pastikan semua orang menjalankan umask 002 atau 007 atau yang semacam itu" - itu agak berlebihan .... Bagaimana Anda membuat Postfix, Dovecot, Clam dan Spam Assassin melakukan semua ini?
jww
2
Apa +sbagian itu? Terima kasih.
tommy.carstensen
1
Dalam hal ini berarti mengatur ID grup. Artinya, kami menggunakan g + s untuk menyetel bit SGID. Saya mengatakan "dalam kasus ini" karena + s digabungkan dengan g untuk grup. + s juga dapat digunakan untuk mengatur bit SUID (setuid).
Bastion
57

Berikut cara melakukannya menggunakan ACL default, setidaknya di Linux.

Pertama, Anda mungkin perlu mengaktifkan dukungan ACL pada sistem file Anda. Jika Anda menggunakan ext4 maka itu sudah diaktifkan. Sistem file lain (mis., Ext3) perlu dipasang dengan aclopsi. Jika demikian, tambahkan opsi ke file /etc/fstab. Misalnya, jika direktori terletak di sistem file root Anda:

/dev/mapper/qz-root   /    ext3    errors=remount-ro,acl   0  1

Kemudian pasang kembali:

mount -oremount /

Sekarang, gunakan perintah berikut untuk mengatur ACL default:

setfacl -dm u::rwx,g::rwx,o::r /shared/directory

Semua file baru /shared/directorysekarang harus mendapatkan izin yang diinginkan. Tentu saja, ini juga tergantung pada aplikasi yang membuat file tersebut. Misalnya, sebagian besar file tidak akan dapat dieksekusi oleh siapa pun sejak awal (bergantung pada argumen mode untuk panggilan open (2) atau creat (2)), seperti saat menggunakan umask. Beberapa utilitas seperti cp,, tardan rsyncakan mencoba mempertahankan izin file sumber yang akan menutupi ACL default Anda jika file sumber tidak dapat ditulis oleh grup.

Semoga ini membantu!

pelle
sumber
Tampaknya ini masih membutuhkan layak umaskuntuk semua pengguna. = / unix.stackexchange.com/questions/71743/…
anatoly techtonik
1
@techtonik Seperti yang saya tulis, itu tergantung pada aplikasi yang membuat file. Misalnya, jika Anda menggunakan cpmaka itu akan mencoba menyalin izin dari file sumber. Bahkan tidak umaskmembantu saat menggunakan cp. Saya telah melihat masalah yang sama dengan tar. Lihat pertanyaan ini .
pelle
@techtonik Saya telah menambahkan kalimat tentang ini dalam jawaban saya sekarang.
pelle
1
ya sepertinya masalahnya ada di aplikasi yang secara paksa mengatur hak ke 644 ketika pengaturan kanan ACL dan POSIX saya semuanya untuk 664. Alangkah baiknya untuk mengklarifikasi mekanisme fallback ini untuk orang yang memecahkan masalah. Banyak yang bahkan tidak tahu tentang umask.
anatoly techtonik
Maksud saya, saya menyia-nyiakan waktu untuk mencoba melihat apakah saya tidak menyetel flag mount dengan benar (dan pada ext4 mereka tidak dapat diatur, karena tampaknya berfungsi secara otomatis). Tidak ada informasi bagaimana cara memeriksa apakah setfacl works correctly- saya berasumsi bahwa itu harus gagal, tetapi saya tidak yakin, karena jawabannya meleset dari poin itu.
anatoly techtonik
4

Ini jelek, tetapi Anda dapat menggunakan perintah setfacl untuk mencapai apa yang Anda inginkan.

Di mesin Solaris, saya memiliki file yang berisi acls untuk pengguna dan grup. Sayangnya, Anda harus mencantumkan semua pengguna (setidaknya saya tidak dapat menemukan cara untuk membuat ini berfungsi sebaliknya):

user::rwx
user:user_a:rwx
user:user_b:rwx
...
group::rwx
mask:rwx
other:r-x
default:user:user_a:rwx
default:user:user_b:rwx
....
default:group::rwx
default:user::rwx
default:mask:rwx
default:other:r-x

Beri nama file acl.lst dan isi nama pengguna asli Anda, bukan user_X.

Anda sekarang dapat mengatur acls tersebut di direktori Anda dengan mengeluarkan perintah berikut:

setfacl -f acl.lst /your/dir/here
innaM
sumber
dapatkah Anda meninggalkan daftar pengguna jika mereka semua adalah anggota grup yang sama, dan hanya menggunakan izin grup?
David Dean
Saya bertanya pada diri saya pertanyaan yang sama. Sudah lama sejak saya mengatur ini. Tetapi setiap kali saya mendapatkan pengguna baru (dalam grup yang sama dengan yang lain), saya lupa memperbarui daftar dan saya akan mendapat keluhan tentang pengguna baru yang tidak dapat menulis / menghapus file. Jadi jawabannya adalah: Tidak, Anda tidak bisa.
innaM
4

dalam skrip shell Anda (atau .bashrc) Anda dapat menggunakan sesuatu seperti:

umask 022

umask adalah perintah yang menentukan pengaturan topeng yang mengontrol bagaimana izin file diatur untuk file yang baru dibuat.

pengguna3270784
sumber
1
Ini tidak benar karena umask membatasi izin yang tidak dapat ditambahkan izin
ACV
@ACV dapatkah Anda menjelaskan? Ini berfungsi untuk saya, file yang baru dibuat sekarang memungkinkan anggota grup memiliki izin rw ketika saya melakukannya umask 002di .bashrc saya.
Arthur Dent
3
@ArthurDent umask 002membatasi akses ke orang lain, membiarkan grup tidak berubah. Ingat, itu ugo- itu adalah kelompok pengguna orang lain. Juga ingat bahwa umask pada dasarnya berarti mengurangi dari default. Untuk file: 666 - 002berarti 664 yang berarti grup tidak terpengaruh.
ACV