Varsayılan bir sahibin "otomatik" olarak ayarlanması, setuid
benzer 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 --x
yürütme biti sadece ihtiyacınız olan şey olabilir. Sana bir örnek vereyim. Varsayalım ki ...
group_dir
Dizine erişimi kontrol eden gruptur ourgroup
.
- Yalnızca
ourgroup
gruptaki kişiler erişebilir group_dir
.
user1
ve user2
aittir 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
ourgroup
engellenecek group_dir
ve 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_dir
neyse, 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, user1
silinmesini engeller user2_submission
( -w-
izin verdiği için group_dir
):
$ chmod +t group_dir/
Şimdi, dizini user1
kaldı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, user2
mü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 rws
gruptaki 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.