Sahibini oluşturulan dosya ve klasörlere zorlamak


21

Birkaç kullanıcı arasında paylaşılan verileri içeren bir dizine sahibim. Bu dizine ve altındaki her şeye erişim, söz konusu kullanıcılara eklenecek olan yönetmen grubu tarafından kontrol edilecektir. Gibi "yapışkan grup" chmod g+sset klasörü oluşturdum . Dizin, dizinleri ve dosyaları olan bir ağaç yapısı içerecek ve toplam dosya miktarı birkaç milyon olacaktır. Dosyalar oldukça küçük olacak, 50 MB'tan daha büyük bir şey beklemiyorum.

Benim sorunum, dosyanın veya dizinin sahibinin hala onu oluşturan kullanıcı olmasıdır. Dolayısıyla, bu kullanıcıyı erişim grubundan kaldırmam gerekse bile erişimini tamamen kaldırmam

Yani:

Tüm dosya ve alt dizinlerin aynı sahibine sahip olmasını sağlamak için kaçırdığım başka seçenekler var mı?

Bir cron-job ile tüm dizini periyodik olarak gezebilmeyi umuyorum, fakat bu esasen bir kere pr-file komutunun ne olduğu konusunda beni yetersiz bırakıyor.

INotify kullanarak bir örnek buldum ama bu komut dosyası gerektirdiği için beni yüksek bakım olarak etkiliyor.

ACL'nin zorunlu mülkiyette bana yardımcı olup olamayacağını çözemedim.

Bunu yapmanın daha akıllıca bir yolu var mı?

İstediğim, kullanıcıya grup ekleyerek paylaşılabilecek bir dizine sahip olmak. Bu dizinde oluşturulan her şey izin şemasını üst öğesinden devralır. Çalıştığımdan daha iyi bir yol varsa, hep kulağım.


Bana ne anlatmaya çalıştığını anladığımı sanmıyorum. Ayrıntılı olabilir misiniz?
Martin Nielsen

Aynı grup ve sahipliğe sahip tüm dosya ve alt dizinleri ayarlamak için neden kullanmamalıyım chown -hR owner:group?
Pandya

Bu mümkün, ancak her zaman yeni dosyalar oluşturulduğundan ve milyonlarca dosyadan söz ettiğimizden, tüm dizini periyodik olarak tarayan bir cron işi gerektiriyor. Bir noktayı kaçırmadığım sürece mi?
Martin Nielsen


Aslında bunu yaratmadan önce bu soruyu gözden kaçırdım. Sahibin belirli bir kullanıcıya nasıl zorlanacağı ele alınmıyor gibi görünüyor.
Martin Nielsen

Yanıtlar:


12

Varsayılan bir sahibin "otomatik" olarak ayarlanması, setuidbenzer bir dizinin olmasını gerektirir setgid. Ancak, bu FreeBSD'de yapılandırılabilirken, diğer UNIX ve Linux sistemleri göz ardı ediyor u+s. Ancak sizin durumunuzda başka bir çözüm olabilir.

İstediğim, kullanıcıya grup ekleyerek paylaşılabilecek bir dizine sahip olmak. Bu dizinde oluşturulan her şey izin şemasını üst öğesinden devralır. Çalıştığımdan daha iyi bir yol varsa, hep kulağım.

Yani, temelde, gördüğümden itibaren, gruplar mekanizmasını kullanarak bir dizine erişimi kontrol etmek istiyorsunuz. Ancak, bu, tüm dizin yapısındaki izinleri kısıtlamanızı gerektirmez. Aslında, dizin --xyürütme biti sadece ihtiyacınız olan şey olabilir. Sana bir örnek vereyim. Varsayalım ki ...

  • group_dirDizine erişimi kontrol eden gruptur ourgroup.
  • Yalnızca ourgroupgruptaki kişiler erişebilir group_dir.
  • user1ve user2aittir ourgroup.
  • Varsayılan umask 0022'dir.

... aşağıdaki kurulumu göz önünde bulundurun:

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

Burada, her öğenin sahibi tarafından oluşturulduğunu varsayalım.

Şimdi, bu kurulumda:

  • Tüm dizinler içinde herkes tarafından serbestçe gezilebilir ourgroup. Gruptaki herkes, içinde herhangi bir yerde dosya oluşturabilir, taşıyabilir, silebilir group_dir(ancak daha derinde değil).
  • İçeride olmayan herkes ourgroupengellenecek group_dirve bu nedenle altındaki herhangi bir şeyi manipüle edemeyecek. Örneğin user3(üyesi olmayan ourgroup), okuyamaz group_dir/user2_submission/README( r--dosyanın kendisinde izin olsa bile ).

Ancak, bu durumda küçük bir sorun var: tipik umask nedeniyle, kullanıcılar tarafından oluşturulan öğeler grubun diğer üyeleri tarafından manipüle edilemez. ACL'lerin girdiği yer burasıdır. Varsayılan izinleri ayarlayarak, umask değerine rağmen her şeyin yolunda olduğundan emin olursunuz:

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

Bu çağrı ayarlar:

  • Sahip için varsayılan rw(x)izinler.
  • rw(x)Grup için varsayılan izinler.
  • Diğerleri için varsayılan olarak izin yok. Beri Not olduğunu diğerleri erişemez group_dirneyse, gerçekten onların izinleri altında ne olduğunu fark etmez.

Şimdi, eğer bir öğeyi şu şekilde oluşturursam user2:

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

Bu ACL uygulandığında, önceki yapımızı yeniden oluşturmayı deneyebiliriz:

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

Burada yine her öğe sahibi tarafından yaratılır.

Ayrıca, dizini kullananlara biraz daha fazla güç / güvenlik vermek istiyorsanız, yapışkan bir bit düşünebilirsiniz. Bu, örneğin, user1silinmesini engeller user2_submission( -w-izin verdiği için group_dir):

$ chmod +t group_dir/

Şimdi, dizini user1kaldırmaya çalışırsa user2, çok hoşuna gidecek Operation not permitted. Ancak, bunun dizin yapısı değişikliklerini engellemesine karşın group_dir, altındaki dosya ve dizinlere hala erişilebilir olduğunu unutmayın:

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)

Dikkate alınması gereken başka bir şey de, kullandığımız ACL'lerin varsayılan izinleri oluşturmasıdır. Bu nedenle, bir öğenin sahibinin kendisiyle ilişkili izinleri değiştirmesi mümkündür. Mesela, user2mükemmel koşabilirsin ...

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

... bu nedenle, tam gönderme dizinini gruptaki hiç kimse için kullanılamıyor.

Ancak, başlangıçta rwsgruptaki kişilere tam erişim izni vermeye istekli olduğunuzdan , bu kullanıcılara güvendiğinizi ve onlardan çok fazla kötü amaçlı işlem beklemeyeceğinizi farz ediyorum.


ACL varsayılan izinleri geçersiz kılar mı? Örneğin, $ setfacl -dRm u :: r, g :: rwX, o :: 0 group_dir / değerini ayarlarsam, yalnızca grubun üyelerinin dosya oluşturmasına izin vermek için, sahip değil, dosyaları düzenleyebilir. grupta? Kullanıcıların, dosyaları sahibinin kim olduğuna bakılmaksızın yalnızca grubun üyeleri olması durumunda düzenleyebilmeleri çok önemlidir.
Martin Nielsen

Bunun için sahibinden tüm izinleri kaldırmanız gerekmez. Grup dosyada yazma izni varsa, grup üyeleri olacak dosyasını düzenlemek mümkün. Sahibi sadece "biraz daha ayrıcalıklı" olacak. ACL'ler her zaman varsayılan izinleri geçersiz kılmazlar (bkz. ACL etkin izinleri hakkında).
John WH Smith

Önemli olan, kullanıcının ayrıcalıklarının olmaması gerektiği, sadece grubun sahip olması gerektiğidir. Grup sahibi olmadıkça mal sahibi tüm niyet ve amaçlar için tamamen imtiyazlı olmalıdır.
Martin Nielsen

Temel olarak, grupta olmayan hiç kimse, ayrıcalıklı değildir, çünkü group_dirdosyaya sahip olsun ya da olmasın, ilk sırada giremezdi. Sahibinin sahip olduğu tek gerçek "imtiyaz" yarattıklarının izinlerini değiştirebileceğidir (cevabımı biraz daha ayrıntılı olarak açıkladım).
John WH Smith

1
Kesinlikle hayır. group_dirDizin aittir root:ourgroupile -rwxr-x---hangi araç sadece kök ve üyeleri, ourgroupmayıs erişimi bu yani bunun altında dosyalarla şey yapmak. Eğer yoksa --xbir dizin izni, sen onun içinde bir dosyaya erişemiyor hatta dosyanın kendisi izinlerini varsa.
John WH Smith

6

Bunu yapmanın daha akıllıca bir yolu var. Set-gid ve default acls birleşimini kullanır . Açıkçası, acl etkin bir dosya sistemine ihtiyacınız olacak. Paylaşmak istediğiniz dizinin bulunduğu /var/grpdirve grubun üyelerinin sharingerişebilmesi gerektiğini varsayalım .

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

Varsayılan ACL'ler, varsayılan ACL'lerin bulunduğu bir dizinde oluşturulan alt dizinler tarafından miras alınır. Yani bu, yaratılan herhangi bir dosyanın, /var/grpdirgrubun sharingyönetmenin setgid bitine göre ayarlanmış olacağı anlamına gelir . Ek olarak, belirli kullanıcılarla veya gruplarla ACL belirtmediğimiz için varsayılan linux stil önceliklerini geçersiz kılacak olan varsayılan acls'leri devralacak. Bu, tüm dosyaların mülkiyet <user>:sharingve izinlerle oluşturulacağı anlamına gelir rw-rw----. Dizinler aynı olacaktır, ancak aynı zamanda kendi varsayılan ACL'leri üst ( /var/grpdir) ile aynı olacak şekilde ayarlanmış olacak ve tabii ki kullanıcı ve grup için ayarlanmış yürütülebilir bitlere sahip olacaklardır. Bir kullanıcıyı sharinggruptan kaldırırsanız , dizine erişemezler (hatta içindeki dosyalar da olsa).

Düzenli olarak bir cronjob ile izinleri düzeltme aksine, yeni oluşturulan dosyalar ve dizinlerle atomik olarak güncellenen izinler her zaman senkronize edilir. Bu çözüm hafiftir; hiçbir ibadet gerekli değildir ve tek bir dokunuşta izinleri düzeltirken IO'ya herhangi bir artış olmaz.


Öyleyse bunu doğru anlıyorum: Bir kullanıcı veya grup belirtmezseniz, ACL'ler normal dosya sistemi izinlerinin üzerine yazacak mı?
Martin Nielsen

1
Hayır, zaten bir dosyada ayarlanmış olan izinleri değiştirmezler. Bir dizinin varsayılan izin ayarları atandığında ve bu dizinde bir dosya veya dizin oluşturulduğunda, YENİ dosya / dizine belirtildiği şekilde varsayılan izinler verilir. Dizine taşınan / taşınan dosyalar, asls ayarlanmadan önce dizinde bulunan dosyalar gibi izinlerini saklar. Ayrıca, chmod ve chown, dosya oluşturulduktan sonra mülkiyeti ve izinleri değiştirmek için hala normal olarak kullanılabilir
sirlark

2

Bunu yapmanın iyi bir yolunun farkında değilim. Teknik olarak en temiz yol, bunu yapan bir SİGORTA dosya sistemi olacaktır. Tabii ki, henüz kimse yapmadıysa çok iş var.

Alternatifler:

  1. Samba'yı kullan. samba force userparametresine sahiptir. Bir dizini yerel olarak dışa aktarabilir ve yerel olarak bağlayabilirsiniz. Erişimleri daha hızlı yapmaz ancak yalnızca geri döngü ağ bağlantısı söz konusu olduğu için kabul edilebilir.

  2. FAT32 gibi Linux olmayan bir dosya sistemi kullanın. Bu, belirli bir kullanıcının takması için yapılandırılmalıdır. Erişim izinleri ana dizin tarafından kullanılmalıdır.


0

Dosya sahipliğini, dosya belirli bir dizine taşındığında değiştirilecek şekilde otomatik olarak değiştirmenin hiçbir yolunu duymadım. En yakın şey yapışkan kısımdır, ancak grup sahipliğinin yeterli olmadığını, gerçek kullanıcı sahipliğinin değişmesi gerektiğini belirtmişsiniz.

Bu durumda, bence en iyi bahis, Pandya'nın bahsettiği gibi, chown -R bayrağıyla yapılan cron işidir. Her dakika veya her beş dakikada bir çalıştırmak için bir cronun üzerine koyun.

Kullanıcılarınızın bunu nasıl kullandığını açıklayabilirseniz, daha iyi bir çözüm olabilir.

ACL, kimin ne yapmasına izin verildiği konusunda daha iyi tahıl kontrolü elde etmenize yardımcı olabilir, sizin için gerçek dosya sahipliğini otomatik olarak değiştirmez. Daha yüksek bir görüş elde etmeniz ve çözümünüzü bu temelde değerlendirmeniz / yeniden tasarlamanız gerektiğini düşünüyorum.


0

İnotify araçlarını kullanabilir ve aşağıdaki gibi basit bir bash betiği yazabilirsiniz. Inotify gözünü web dizininde tutacak ve web dizini içinde dir oluşturma gibi bir olay meydana geldiğinde bir şeyler yapacaktır. Mevcut birçok etkinlik var. Google'a gidebilir veya bu siteye bakabilirsiniz

while inotifywait -m -e CREATE web; do echo "A new directory has been created"; done
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.