Mengapa rm diizinkan untuk menghapus file di bawah kepemilikan pengguna yang berbeda?

52

Dari pos. Mengapa rm dapat menghapus file read-only? Saya mengerti bahwa rmhanya perlu menulis izin pada direktori untuk menghapus file. Tetapi saya merasa sulit untuk mencerna perilaku di mana kita dapat dengan mudah menghapus file yang berbeda pemilik dan grup.

Saya mencoba yang berikut ini

mtk: nama pengguna saya
abc: membuat pengguna baru

$ ls -l file
-rw-rw-r-- 1 mtk mtk       0 Aug 31 15:40 file
$ sudo chown abc file
$ sudo chgrp abc file
$ ls -l file
-rw-rw-r-- 1 abc abc       0 Aug 31 15:40 file
$ rm file
$ ls -l file
<deleted>

Saya berpikir ini seharusnya tidak diizinkan. Seorang pengguna harus dapat menghapus hanya file di bawah kepemilikannya? Adakah yang bisa menjelaskan mengapa ini diizinkan? dan apa cara untuk menghindari ini? Saya dapat berpikir hanya membatasi izin tulis dari direktori induk untuk menonaktifkan pembatalan file yang mengejutkan.

mtk
sumber

Jawaban:

100

Alasan mengapa ini diizinkan terkait dengan apa yang menghapus file sebenarnya. Secara konseptual, rmtugasnya adalah menghapus entri nama dari direktori. Fakta bahwa file tersebut kemudian menjadi tidak terjangkau jika hanya itu nama file dan inode serta ruang yang ditempati oleh file dapat dipulihkan pada saat itu hampir bersifat insidentil. Nama panggilan sistem yang dipanggil rmperintah, yang unlinkbahkan menunjukkan fakta ini.

Dan, menghapus entri nama dari direktori pada dasarnya adalah operasi pada direktori itu , sehingga direktori itu adalah hal yang Anda harus memiliki izin untuk menulis.


Skenario berikut mungkin membuatnya merasa lebih nyaman? Misalkan ada direktori:

/home/me    # owned and writable only by me
/home/you   # owned and writable only by you

Dan ada file yang saya miliki dan yang memiliki dua tautan keras:

/home/me/myfile
/home/you/myfile

Tidak peduli bagaimana tautan keras itu /home/you/myfilesampai di sana. Mungkin rootmenaruhnya di sana.

Gagasan dari contoh ini adalah Anda harus diizinkan untuk menghapus tautan keras /home/you/myfile. Bagaimanapun, ini mengacaukan direktori Anda . Anda harus bisa mengendalikan apa yang ada dan tidak ada di dalam /home/you. Dan ketika Anda menghapus /home/you/myfile, perhatikan bahwa Anda belum benar-benar menghapus file. Anda hanya menghapus satu tautan ke tautan itu.


Perhatikan bahwa jika bit sticky diset pada direktori yang berisi file (menunjukkan sebagai tdi ls), maka Anda lakukan perlu menjadi pemilik dari file agar diizinkan untuk menghapusnya (kecuali jika Anda memiliki direktori). Bit lengket biasanya menyala /tmp.

Celada
sumber
6
Dengan bit yang lengket pada direktori, Anda harus dapat memodifikasi file yang diizinkan untuk menghapusnya. Yaitu, jika file tersebut milik orang lain dalam grup yang sama dengan Anda, dan grup tersebut dapat menulis ke file tersebut, Anda dapat menghapus file tersebut. Konsekuensi: siapa pun dapat menghapus file dengan izin menulis publik. (Semua yang dapat memodifikasi direktori, tentu saja.)
Jonathan Leffler
1
Saya mungkin salah menafsirkan Anda tetapi tidakkah Anda mengatakan bahwa saya dapat menghapus -rw-rw-rw- 1 root root 0 Sep 1 11:11 /tmp/foosebagai pengguna biasa ( /tmplengket) karena saya diizinkan untuk menulisnya? Namun saya tidak bisa.
Celada
4
Saya percaya bahwa me/ youskenario masuk ke fokus yang lebih jelas jika Anda berhipotesis bahwa pengguna (orang yang tidak memiliki file) membuat tautan. Kata ganti sulit digunakan; katakanlah Al membuat /home/al/file1, dan Bob, yang telah menjalankan (dan mungkin membaca) akses ke /home/al, tautan langsung file /home/bob/als_file. Haruskah Bob dicegah menghapus tautan yang ia buat?   Dan haruskah Al diizinkan untuk menghapus (membatalkan tautan) /home/bob/als_fileketika dia tidak memiliki akses tulis /home/bob? Jalan ini menuju kekacauan.
Scott
2
@ JonathanLeffler: Seperti contoh Scott menunjukkan, tidak, memutuskan tautan dan memotong tidak memiliki hasil bersih yang sama ketika ada tautan keras yang sedang bermain.
Kevin
6
@ Kevin Saya pikir intinya adalah bahwa jika seseorang memiliki izin menulis ke file, sehingga ia dapat menghancurkan konten, maka ia mungkin juga diizinkan untuk memutuskan tautannya juga (dengan asumsi ia juga memiliki izin menulis ke direktori). Kebalikannya tidak berlaku - bisa menghapus file dari satu direktori tidak berarti ia harus dapat menghancurkan konten, karena mereka dapat diakses dari direktori lain. Ini adalah logika di balik cara kerja bit yang lengket.
Barmar
9

Untuk menghapus file, Anda hanya perlu bisa menulis ke direktori tempat file itu berada.

Jika Anda tidak suka ini, Anda dapat mengatur bit "sticky" melalui chmod +t dirjika Anda berada di OS setengah jalan baru (fitur ini diperkenalkan sekitar tahun 1986 di SunOS).

Jika Anda ingin lebih berbutir halus, Anda memerlukan sistem file dengan implementasi ACL modern seperti ZFS. ACL NFSv4 standar berdasarkan NTFS mencakup dukungan untuk izin penghapusan khusus file per pengguna dan izin "delete_child" untuk direktori.

schily
sumber
9
Perhatikan bahwa untuk menambahkan tbit, Anda harus memiliki direktori. Dan jika Anda memiliki direktori, Anda selalu dapat menghapus file terlepas dari apakah tbitnya diatur atau tidak. Jika Anda menautkan file ke direktori orang lain, Anda harus siap agar orang lain dapat menghapusnya. Alternatifnya adalah membuat sub-dir Anda terlebih dahulu dan menambahkan file Anda di sana, karena pemilik tidak akan dapat menghapus subdir itu jika tidak kosong.
Stéphane Chazelas
6
Anda menggambarkan situasi dengan cara yang menyesatkan. Secara teknis, file tidak ada dalam direktori; alih-alih, nama file ada di direktori, dan rmmerupakan operasi di direktori, bukan di file. Sebuah file dihapus ketika referensi terakhir untuk itu dihapus, tetapi secara teknis, itu adalah efek samping.
reinierpost
0

Logikanya mirip dengan rumah: Pemilik atau penyewa memutuskan tamu mana yang akan dibuang, tidak peduli siapa yang memiliki tamu. Juga, tamu yang diusir yang diterima di rumah lain (memiliki hardlink lain di direktori orang lain) tidak akan mati kedinginan di luar.

pemeras
sumber