Izinkan pemilik untuk membuat & membaca file, tetapi tidak mengubah atau menghapus

17

Saya ingin memberikan izin kepada pengguna untuk membuat dan membaca file di direktori tertentu, tetapi tidak untuk memodifikasi atau menghapus file. Jika pengguna dapat menambahkan ke file yang ok, tapi saya lebih suka tidak. Ini ada di Ubuntu Linux.

Saya pikir ini tidak mungkin dengan izin file Unix standar, tapi mungkin ini mungkin menggunakan ACL? Pengguna akan selalu terhubung menggunakan SFTP, jadi jika ada beberapa cara untuk mengontrol ini dalam SFTP (sebagai lawan dari izin OS) itu akan baik-baik saja.

Agar benar-benar jelas, saya ingin yang berikut ini:

  • echo hello> test # berhasil, karena tes tidak ada, dan pembuatan diperbolehkan
  • echo hello >> test # dapat berhasil atau gagal, tergantung pada apakah penambahan diizinkan
  • echo hello2> test # gagal, karena tes sudah ada, dan modifikasi tidak diperbolehkan
  • tes kucing # berhasil, karena bacaan diperbolehkan
  • uji rm # gagal, karena penghapusan tidak diizinkan

Jika Anda bertanya-tanya mengapa saya ingin melakukan ini, itu membuat sistem cadangan Duplicati tahan terhadap Ransomware.

paj28
sumber
1
File selalu dibuat kosong. Ketika Anda melakukannya echo > test, shell melakukan open("test", O_WRONLY|O_CREAT|O_TRUNC)yang membuat file dan kemudian memanggil echoyang menulis konten sehingga memodifikasinya. Sekarang Anda hanya bisa membiarkan pembukaan pertama (WR) berhasil.
Stéphane Chazelas
@ StéphaneChazelas - diedit untuk mengklarifikasi bahwa penambahan diperbolehkan
paj28

Jawaban:

16

Anda bisa menggunakan bindfsseperti:

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

Direktori itu dimiliki oleh stephane, dengan grup stephane (stephane menjadi satu-satunya anggotanya). Perhatikan juga tyang mencegah pengguna mengubah nama atau menghapus entri yang tidak mereka miliki.

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

Kami bindfs dirsendiri dengan kepemilikan tetap dan izin untuk file dan direktori. Semua file tampaknya dimiliki oleh root(meskipun di bawahnya di direktori sebenarnya mereka masih dimiliki oleh stephane).

Direktori mendapatkan drwxrwxr-x root stephaneizin sementara jenis file lainnya mendapatkannya -rw-r--r-- root stephane.

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

Sekarang membuat file berfungsi karena direktori dapat ditulisi:

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

Namun tidak mungkin melakukan penulisan kedua open()pada file tersebut karena kami tidak memiliki izin untuk itu:

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

(perhatikan bahwa menambahkan tidak diperbolehkan di sana (karena bukan bagian dari persyaratan awal Anda)).

Batasan: ketika Anda tidak dapat menghapus atau mengganti nama entri dirkarena tbit, direktori baru yang Anda buat di sana tidak akan memiliki tbit itu, sehingga Anda dapat mengubah nama atau menghapus entri di sana.

Stéphane Chazelas
sumber
Ini brilian! Terima kasih telah meluangkan waktu untuk mencari solusi yang elegan. Saya pernah mendengar bindf sebelumnya, tetapi ini adalah pertama kalinya saya menggunakannya.
paj28 28
4

The chattr +apilihan akan memungkinkan menambahkan saja. File dapat diubah dengan cara itu, tetapi hanya dengan menambahkan (yaitu menambahkan baris) ke mereka. Anda tidak dapat menghapus file yang ada, tetapi membuat yang baru. Ini mungkin sesuai dengan kebutuhan Anda:

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

dari man chattr

File dengan set atribut `a 'hanya bisa dibuka dalam mode append untuk ditulis. Hanya superuser atau proses yang memiliki kemampuan CAP_LINUX_IMMUTABLE yang dapat mengatur atau menghapus atribut ini.

(perhatikan bahwa ini juga berlaku untuk direktori)

Jadi daftar Anda akan terlihat seperti:

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
Fiximan
sumber
Ok, ini kedengarannya menjanjikan. Itu benar mencegah penghapusan, dan jika file memiliki atribut, itu mencegah menimpa. Namun, ketika file baru dibuat, mereka tidak secara otomatis mendapatkan atribut. Apakah ada cara agar hal ini terjadi secara otomatis?
paj28
Jika direktori memiliki atribut, file akan berperilaku sesuai meskipun tidak memiliki atribut yang ditetapkan secara eksplisit. Masalahnya adalah file di subdirektori baru. Misalnya dir1 chattr +amaka saya dapat membuat file, saya tidak diizinkan untuk menghapusnya, dapat menambahkan. Jika saya membuat dir1 / dir2 maka saya bisa melakukannya sesuka saya DI dir2
Fiximan
1
Sayangnya tidak: dpaste.com/042XQ7X
paj28
Aahh, maaf - saya melakukan tes yang salah sebelumnya
Fiximan
@ paj28 tautan Anda rusak :-(
mjaggard