Memaksa pemilik pada file dan folder yang dibuat

21

Saya memiliki direktori yang berisi data yang dibagikan di antara sejumlah pengguna. Akses ke direktori ini dan apa pun di bawahnya, akan dikontrol oleh grup direktori, yang akan ditambahkan ke pengguna yang bersangkutan. Karena itu saya membuat folder chmod g+sset "grup lengket" . Direktori akan berisi struktur pohon dengan direktori dan file, dengan jumlah total file kemungkinan beberapa juta. File akan cukup kecil, saya tidak mengantisipasi apa pun yang lebih besar dari 50MB.

Masalah saya adalah bahwa pemilik file atau direktori masih merupakan pengguna yang membuatnya. Karena itu, bahkan jika saya harus menghapus pengguna itu dari grup akses, saya tidak akan menghapus aksesnya sepenuhnya.

Begitu:

Apakah ada opsi lain yang saya lewatkan untuk memastikan bahwa semua file dan sub-direktori memiliki pemilik yang sama?

Saya berharap saya bisa menjelajahi seluruh direktori secara berkala dengan cron-job, tetapi menurut saya tidak efisien untuk apa yang pada dasarnya adalah perintah sekali-pr-file.

Saya menemukan contoh menggunakan INotify tetapi menurut saya pemeliharaan tinggi, karena itu membutuhkan skrip.

Saya belum bisa mengetahui apakah ACL dapat membantu saya dengan kepemilikan paksa.

Apakah ada cara yang lebih cerdas untuk melakukan ini?

Yang saya inginkan adalah memiliki direktori yang dapat dibagikan dengan menambahkan grup ke pengguna. Apa pun yang dibuat dalam direktori ini mewarisi skema izin dari induknya. Jika ada cara yang lebih baik daripada apa yang saya coba, saya semua telinga.

Martin Nielsen
sumber
Kurasa aku tidak mengerti apa yang ingin kau katakan padaku. Bisakah Anda menguraikan?
Martin Nielsen
Untuk mengatur semua file dan sub-direktori yang memiliki grup & kepemilikan yang sama, mengapa tidak digunakan chown -hR owner:group?
Pandya
Itu mungkin, tetapi karena file baru sedang dibuat sepanjang waktu, dan kita berbicara file dalam jutaan, itu akan memerlukan pekerjaan cron yang menjelajahi seluruh direktori secara berkala. Kecuali saya kehilangan beberapa poin?
Martin Nielsen
Saya benar-benar membaca pertanyaan itu sebelum membuat yang ini. Tampaknya tidak membahas cara memaksa pemilik ke pengguna tertentu.
Martin Nielsen

Jawaban:

12

Menetapkan pemilik default "secara otomatis" akan memerlukan direktori setuidberperilaku seperti setgid. Namun, sementara ini dapat dikonfigurasi pada FreeBSD, sistem UNIX & Linux lainnya mengabaikannya u+s. Namun dalam kasus Anda, mungkin ada solusi lain.

Yang saya inginkan adalah memiliki direktori yang dapat dibagikan dengan menambahkan grup ke pengguna. Apa pun yang dibuat dalam direktori ini mewarisi skema izin dari induknya. Jika ada cara yang lebih baik daripada apa yang saya coba, saya semua telinga.

Jadi, pada dasarnya, dari apa yang saya lihat, Anda ingin mengontrol akses ke direktori menggunakan mekanisme grup. Namun, ini tidak mengharuskan Anda untuk membatasi izin di seluruh struktur direktori. Sebenarnya, --xbit eksekusi direktori bisa menjadi apa yang Anda butuhkan. Biarkan saya memberi Anda sebuah contoh. Berasumsi bahwa...

  • Grup yang mengendalikan akses ke group_dirdirektori adalah ourgroup.
  • Hanya orang-orang dalam ourgroupgrup yang dapat mengakses group_dir.
  • user1dan user2milik ourgroup.
  • Umask default adalah 0022.

... pertimbangkan pengaturan berikut:

drwxrws---    root:ourgroup   |- group_dir/
drwxr-sr-x    user1:ourgroup  |---- group_dir/user1_submission/
drwxr-sr-x    user2:ourgroup  |---- group_dir/user2_submission/
-rw-r--r--    user2:ourgroup  |-------- group_dir/user2_submission/README

Di sini, mari kita asumsikan setiap item diciptakan oleh pemiliknya.

Sekarang, dalam pengaturan ini:

  • Semua direktori dapat diakses secara bebas oleh semua orang di ourgroup. Siapa pun dari grup dapat membuat, memindahkan, menghapus file di mana saja di dalam group_dir(tetapi tidak lebih dalam).
  • Siapa pun yang tidak masuk ourgroupakan diblokir group_dir, dan karenanya tidak dapat memanipulasi apa pun di bawahnya. Misalnya, user3(yang bukan anggota ourgroup), tidak dapat membaca group_dir/user2_submission/README(meskipun ia memiliki r--izin pada file itu sendiri).

Namun, ada sedikit masalah dalam kasus ini: karena umask yang khas, item yang dibuat oleh pengguna tidak dapat dimanipulasi oleh anggota grup lainnya. Di sinilah ACL masuk. Dengan mengatur izin default, Anda akan memastikan semuanya baik-baik saja meskipun nilai umask:

$ setfacl -dRm u::rwX,g::rwX,o::0 group_dir/

Panggilan ini menetapkan:

  • rw(x)Izin default untuk pemilik.
  • rw(x)Izin default untuk grup.
  • Tidak ada izin secara default untuk yang lain. Perhatikan bahwa karena yang lain tidak dapat mengakses group_dir, tidak masalah apa pun izin mereka di bawahnya.

Sekarang, jika saya membuat item sebagai user2:

$ touch group_dir/user2_submission/AUTHORS
$ ls -l group_dir/user2_submission/AUTHORS
rw-rw----    user2:ourgroup    group_dir/user2_submission/AUTHORS

Dengan ACL ini, kami dapat mencoba membangun kembali struktur kami sebelumnya:

drwxrws---+    root:ourgroup   |- group_dir/
drwxrws---+    user1:ourgroup  |---- group_dir/user1_submission/
drwxrws---+    user2:ourgroup  |---- group_dir/user2_submission/
-rw-rw----+    user2:ourgroup  |-------- group_dir/user2_submission/README

Di sini lagi, setiap item dibuat oleh pemiliknya.

Selain itu, jika Anda ingin memberikan sedikit lebih banyak kekuatan / keamanan kepada mereka yang menggunakan direktori, Anda mungkin ingin mempertimbangkan sedikit lengket. Misalnya, ini akan mencegah user1penghapusan user2_submission(karena ia memiliki -w-izin group_dir):

$ chmod +t group_dir/

Sekarang, jika user1mencoba untuk menghapus user2direktori, dia akan mendapatkan yang indah Operation not permitted. Perhatikan bahwa sementara ini mencegah modifikasi struktur direktori group_dir, file dan direktori di bawahnya masih dapat diakses:

user1@host $ rm -r user2_submission
Operation not permitted

user1@host $ cat /dev/null > user2_submission/README

user1@host $ file user2_submission/README
user2_submission/README: empty (uh-oh)

Satu hal yang perlu dipertimbangkan adalah bahwa ACL yang kami gunakan mengatur izin default . Oleh karena itu, pemilik barang dapat mengubah izin yang terkait dengannya. Misalnya, user2dapat berjalan dengan sempurna ...

$ chown g= user2_submission/ -R
or
$ chgrp nobody user2_submission -R

... karenanya menjadikan direktori pengiriman lengkapnya tidak tersedia bagi siapa pun dalam grup.

Namun, karena Anda semula bersedia memberikan rwsakses penuh kepada siapa pun di grup, saya berasumsi Anda mempercayai pengguna ini, dan bahwa Anda tidak akan mengharapkan terlalu banyak operasi jahat dari mereka.

John WH Smith
sumber
Apakah ACL akan mengesampingkan izin default? Sebagai contoh, jika saya menetapkan $ setfacl -dRm u :: r, g :: rwX, o :: 0 group_dir / sebagai gantinya, hanya mengizinkan anggota grup untuk membuat file, apakah pemilik dapat mengedit file sementara tidak dalam grup? Sangat penting bahwa pengguna hanya dapat mengedit file jika mereka adalah anggota grup, terlepas dari siapa pemiliknya.
Martin Nielsen
Anda tidak perlu menghapus semua izin dari pemilik untuk itu. Jika grup memiliki izin menulis pada file, anggota grup akan dapat mengedit file. Pemilik hanya akan "sedikit lebih istimewa". ACL tidak selalu mengesampingkan izin default (lihat tentang izin efektif ACL).
John WH Smith
Intinya adalah bahwa pengguna tidak boleh memiliki hak istimewa, hanya kelompok yang seharusnya. Pemilik harus untuk semua maksud dan tujuan sepenuhnya tidak terjangkau kecuali dia berada di grup.
Martin Nielsen
Pada dasarnya, siapa pun yang tidak ada dalam grup tidak memiliki kekurangan, karena ia tidak akan bisa masuk group_dirsejak awal, tidak peduli apakah ia memiliki file atau tidak. Satu-satunya "hak istimewa" pemilik adalah bahwa ia dapat mengubah izin ciptaannya (yang saya jelaskan sedikit lebih dalam jawaban saya).
John WH Smith
1
Benar-benar tidak. The group_dirdirektori dimiliki oleh root:ourgroupdengan -rwxr-x---, yang berarti bahwa hanya akar dan anggota ourgroupMei mengaksesnya, yaitu melakukan apa saja dengan file di bawahnya. Jika Anda tidak memiliki --xizin pada direktori, Anda tidak dapat mengakses file di dalamnya, bahkan jika Anda memiliki izin file itu sendiri.
John WH Smith
6

Ada cara yang lebih cerdas untuk melakukan ini. Ini menggunakan kombinasi set-gid dan ACL default . Jelas, Anda akan membutuhkan sistem file yang diaktifkan acl. Mari kita asumsikan direktori tempat Anda ingin berbagi berada /var/grpdirdan bahwa anggota grup sharingharus dapat mengaksesnya.

chown root:sharing /var/grpdir
chmod 2770 /var/grpdir #other can't read or traverse into the directory, set-gid is set
setfacl -d -m u::rwX,g::rwX,o::0 /var/grpdir

ACL default diwarisi oleh subdirektori yang dibuat dalam direktori dengan ACL default. Jadi ini berarti, file apa pun yang dibuat di /var/grpdirakan memiliki grup itu diatur sharingoleh bit setgid direktori. Selain itu, ia akan mewarisi ACL default, yang akan menggantikan premis gaya default linux, karena kami tidak menentukan ACL dengan pengguna atau grup tertentu. Ini berarti semua file akan dibuat dengan kepemilikan <user>:sharingdan izin rw-rw----. Direktori akan sama, kecuali mereka juga akan memiliki ACL default sendiri yang disetel sama dengan induknya ( /var/grpdir), dan tentu saja bit-bit yang dapat dieksekusi ditetapkan untuk pengguna dan grup. Jika Anda menghapus pengguna dari sharinggrup, mereka tidak akan dapat mengakses direktori (atau file apa pun di dalamnya, bahkan jika mereka memilikinya).

Tidak seperti mengoreksi izin secara berkala dengan cronjob, izin selalu disinkronkan, karena diperbarui secara atomis dengan file dan direktori yang baru dibuat. Solusi ini ringan; tidak ada daemon yang diperlukan, dan tidak ada lonjakan untuk IO sementara mengoreksi izin dalam satu gerakan.

pusaran air
sumber
Jadi, apakah saya mengerti ini dengan benar: ACL akan menimpa izin sistem file normal jika Anda tidak menentukan pengguna atau grup?
Martin Nielsen
1
Tidak, mereka tidak mengubah izin yang telah ditetapkan pada file. Ketika sebuah direktori memiliki hak akses default yang ditetapkan, dan sebuah file atau direktori dibuat di direktori itu, file / dir BARU akan diberikan izin default seperti yang ditentukan. File yang disalin / dipindahkan ke direktori tetap memiliki izinnya, seperti halnya file yang ada di direktori sebelum ACL diatur. Juga, chmod dan chown masih dapat digunakan seperti biasa untuk memodifikasi kepemilikan dan izin setelah file dibuat
sirlark
2

Saya tidak mengetahui cara yang baik untuk melakukan ini. Cara yang secara teknis paling bersih adalah sistem file FUSE yang melakukan itu. Tentu saja, banyak pekerjaan jika belum ada yang melakukan itu.

Alternatif:

  1. Gunakan samba. samba memiliki force userparameter. Anda dapat mengekspor direktori secara lokal dan memasangnya secara lokal. Tidak membuat akses lebih cepat tetapi dapat diterima karena hanya jaringan loop kembali yang terlibat.

  2. Gunakan sistem file non-Linux seperti FAT32. Ini harus dikonfigurasi untuk pengguna tertentu untuk memasangnya. Izin akses harus ditangani oleh direktori induk.

Hauke ​​Laging
sumber
0

Saya belum pernah mendengar cara untuk mengubah kepemilikan file secara otomatis sehingga pemilik file berubah ketika file dipindahkan ke direktori tertentu. Yang paling dekat adalah bagian yang lengket, tetapi tampaknya Anda telah mengindikasikan bahwa kepemilikan grup tidak cukup, kepemilikan pengguna yang sebenarnya harus diubah.

Dalam hal ini, saya pikir taruhan terbaik Anda adalah pekerjaan cron dengan chown -R flag, seperti yang disebutkan Pandya. Letakkan di cron untuk menjalankan setiap menit atau setiap lima menit.

Jika Anda dapat menjelaskan bagaimana pengguna Anda menggunakan ini, mungkin ada beberapa solusi yang lebih baik.

ACL dapat membantu Anda mendapatkan kontrol butir yang lebih baik tentang siapa yang diizinkan melakukan apa, itu tidak akan secara otomatis mengubah kepemilikan file aktual untuk Anda. Saya pikir Anda perlu mendapatkan pandangan yang lebih tinggi dan mengevaluasi / mendesain ulang solusi Anda atas dasar itu.

Baazigar
sumber
0

Anda dapat menggunakan inotify-tools dan menulis script bash sederhana seperti di bawah ini. Inotify akan mengawasi web direktori dan melakukan sesuatu kapan saja seperti pembuatan direktori akan terjadi di dalam direktori web. Ada banyak acara yang ada. Anda dapat google atau mungkin telah melihat di situs ini

while inotifywait -m -e CREATE web; do echo "A new directory has been created"; done
SkyRar
sumber