Sahibinin dosya oluşturmasına ve okumasına izin verin, ancak değiştirmeyin veya silmeyin


17

Bir kullanıcıya belirli bir dizinde dosya oluşturma ve okuma izni vermek istiyorum, ancak dosyaları değiştirmek veya silmek için izin vermiyorum. Kullanıcı tamam dosyalara ekleyebilirsiniz, ama ben tercih etmem. Bu Ubuntu Linux'ta.

Bu standart Unix dosya izinleri ile imkansız olduğunu düşünüyorum, ama belki bu ACL kullanarak mümkün? Kullanıcı her zaman SFTP kullanarak bağlanacaktır, bu yüzden bunu SFTP içinde kontrol etmenin bir yolu olsaydı (işletim sistemi izinlerinin aksine) iyi olurdu.

Kesin olarak, aşağıdakileri istiyorum:

  • echo hello> test # başarılı, çünkü test mevcut değil ve oluşturulmaya izin var
  • echo hello >> sınamaya izin verilip verilmediğine bağlı olarak test # başarılı veya başarısız olabilir
  • echo hello2> test # başarısız, çünkü test zaten var ve değişikliğe izin verilmiyor
  • kedi testi # başarılı, çünkü okumalara izin verildi
  • rm testi # başarısız, çünkü silme işlemine izin verilmiyor

Bunu neden yapmak istediğimi merak ediyorsanız, Duplicati yedekleme sistemini Ransomware'e dayanıklı hale getirmek.


1
Dosyalar her zaman boş oluşturulur. Bunu yaptığınızda echo > test, kabuk open("test", O_WRONLY|O_CREAT|O_TRUNC)dosyayı oluşturan bir dosya yapar ve daha sonra echoiçeriği yazan böylece değiştirir çağırır . Artık yalnızca ilk açmanın (WR) başarılı olmasına izin verebilirsiniz.
Stéphane Chazelas

@ StéphaneChazelas - eklemeye izin verildiğini açıklığa kavuşturmak için düzenlendi
paj28

Yanıtlar:


16

Gibi kullanabilirsiniz bindfs:

$ ls -ld dir
drwxr-xr-t 2 stephane stephane 4096 Aug 12 12:28 dir/

Bu dizinin adı stephane, grup stephane (stephane tek üyesidir). Ayrıca, tkullanıcıların sahip olmadıkları girdileri yeniden adlandırmasını veya kaldırmasını önlediğini unutmayın .

$ sudo bindfs -u root -p u=rwD,g=r,dg=rwx,o=rD dir dir

bindfs dirDosyalar ve dizinler için sabit sahiplik ve izinlerle bizzat kendimiz üstesinden geldik . Tüm dosyalar ait görünüyor root(yine de gerçek dizinin altında hala stephane'e aitler).

Dizinler drwxrwxr-x root stephaneizin alırken, diğer dosya türleri izin alır -rw-r--r-- root stephane.

$ ls -ld dir
drwxrwxr-t   2 root     stephane   4096 Aug 12 12:28 dir

Dizin yazılabilir olduğu için şimdi bir dosya oluşturmak işe yarıyor:

$ echo test > dir/file
$ ls -ld dir/file
-rw-r--r-- 1 root stephane 5 Aug 12 12:29 dir/file

Ancak dosya üzerinde ikinci bir yazı yazmak mümkün değil open(), çünkü dosya üzerinde iznimiz yok:

$ echo test > dir/file
zsh: permission denied: dir/file

(orada eklemeye izin verilmediğini unutmayın (ilk gereksinimlerinizin bir parçası olarak).

Bir sınırlama: Bit dirnedeniyle girişleri kaldıramaz veya yeniden adlandıramazken t, orada oluşturduğunuz yeni dizinlerin bu tbiti olmaz, bu nedenle girişleri yeniden adlandırabilir veya silebilirsiniz.


Bu harika! Böyle zarif bir çözümü çözmek için zaman ayırdığınız için teşekkür ederiz. Daha önce bağları duymuştum, ama ilk defa kullandım.
paj28

4

Bu chattr +aseçenek yalnızca eklenmeye izin verir. Dosyalar bu şekilde değiştirilebilir, ancak yalnızca dosya ekleyerek (yani satır ekleyerek). Mevcut dosyaları silemezsiniz, ancak yenilerini oluşturamazsınız. Bu ihtiyaçlarınızı karşılayabilir:

sudo chattr -R +a /dir/to/apply/to

itibaren man chattr

`A 'özniteliği ayarlanmış bir dosya yalnızca yazma için ekleme modunda açılabilir. Yalnızca süper kullanıcı veya CAP_LINUX_IMMUTABLE özelliğine sahip bir işlem bu özelliği ayarlayabilir veya temizleyebilir.

(dizinler için de geçerli olduğunu unutmayın)

Listeniz şöyle görünecektir:

echo hello > test # succeeds, because test doesn't exist, and creation is allowed
echo hello2 > test # fails, because test already exists, and overwriting is not allowed
echo hello3 >> test # succeeds, because appending is allowed
cat test # succeeds, because reads are allowed
rm test # fails, because delete is not allowed

Tamam, bu umut verici. Silme işlemlerini doğru şekilde önler ve dosyada öznitelik varsa, üzerine yazma işlemlerini önler. Ancak, yeni dosyalar oluşturulduğunda özniteliği otomatik olarak almazlar. Bunun otomatik olarak gerçekleşmesinin bir yolu var mı?
paj28

Dizin özniteliğe sahipse, öznitelik açıkça ayarlanmamasına rağmen dosyalar buna göre davranır. Sorun, yeni alt dizinlerdeki dosyalar. Örneğin dir1 chattr +asonra ben bir dosya oluşturabilir, kaldırmak için izin verilmiyor, ekleyebilirsiniz. Eğer dir1 / dir2 oluşturursam o zaman ben dir2 IN gibi yapabilirim
Fiximan

1
Ne yazık ki hayır: dpaste.com/042XQ7X
paj28

Aahh, üzgünüm - Daha önce yanlış bir test yaptım
Fiximan

@ paj28 bağlantınız koptu :-(
mjaggard
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.