Mengapa pengguna non-root dapat menghapus file yang dibuat oleh root?

24

Diberikan pengguna non-root "joshua", sebagai root saya membuat file bernama "foo" di direktori home joshua (/ home / johsua /); terlihat seperti ini:

-rw-r--r--  1 root   root       0 12-19 21:00 foo

dan kemudian menghapusnya sebagai joshua, saya bisa menghapusnya dengan sukses.

Saya berharap bahwa joshua tidak memiliki cukup izin untuk menghapusnya. Apakah ini semacam 'Izin warisan'? Platform saya adalah Debian 5.0.7.

Joshua
sumber
1) Ini di luar topik. 2) Saya sangat ragu bahwa Anda dapat menghapusnya sebagai pengguna non-root tanpa sudoatau peningkatan hak istimewa lainnya. Anda mungkin mengabaikan sesuatu.
DarkDust
16
@DarkDust File adalah entri dalam direktori induknya. Jika Anda memiliki hak tulis dalam direktori, Anda dapat menghapus file di dalamnya terlepas dari siapa yang memiliki file (kecuali bit sticky juga ditetapkan pada direktori)
no
@nos: Bodoh saya, Anda benar.
DarkDust
1
Entri dalam direktori induknya adalah referensi ke file. Ini bukan file itu sendiri. (Kalau tidak, bagaimana mungkin file dihubungkan dengan lebih dari satu direktori?)
David Schwartz
@ Davidvidchchartz itu benar, tetapi menghapus file dari direktori adalah tentang menghapus referensi dalam struktur direktori.
mc0e

Jawaban:

43

Pengguna tidak menghapus file, sistem melakukannya. Pengguna hanya menghapus file dari direktori sendiri. Sistem menghapus file karena jumlah referensi turun menjadi nol. Hanya kebetulan bahwa pengguna menghapus file dari direktori terjadi untuk menurunkan jumlah referensi menjadi nol. (Jika file itu sulit ditautkan ke direktori lain atau pegangan dibuka ke file, itu tidak akan dihapus.)

Sistem menghapus file secara otomatis ketika jumlah referensi turun menjadi nol. Pemilik file tidak masalah. Ada banyak cara seseorang selain pemilik file dapat menjatuhkan jumlah referensi file ke nol.

Menghapus file dari direktori (disebut 'unlinking') adalah operasi pada direktori. Membatalkan tautan file mengurangi jumlah referensi.

Demikian pula, pengguna selain pemilik dapat menutup pegangan terakhir ke file yang tidak tertaut ke direktori mana pun. Menutup pegangan itu akan menghapus file juga, karena lagi jumlah referensi akan turun menjadi nol.

David Schwartz
sumber
1
Dan tentu saja rmperintah agak membingungkan perairan, karena rmmerupakan singkatan dari "hapus", dan pengguna dilatih untuk menganggapnya rmsebagai operasi "hapus". Banyak pengguna menggunakan rmsetiap hari sementara tidak menyadari bahwa operasi yang sebenarnya dilakukannya adalah "batalkan tautan", bukan "hapus". Akibatnya, seharusnya tidak terlalu mengejutkan bahwa banyak pengguna menemukan perilaku ini mengejutkan ketika mereka pertama kali menemukannya.
Daniel Pryden
Ini jelas mengejutkan banyak orang. Setidaknya rmperintah itu sebenarnya menghapus file atau direktori dari direktori. Ini lebih buruk pada Windows di mana perintah dipanggil del, karena digunakan untuk menghapus file tetapi pada mesin Windows modern (sejak NT4), ini juga merupakan operasi pembatalan tautan.
David Schwartz
"Pengguna tidak menghapus file, sistem melakukannya" Ini tidak masuk akal. "Sistem" tidak dapat membuat perubahan yang memerlukan akses istimewa atas nama pengguna yang tidak memiliki hak. Dengan demikian, jawaban ini akan gagal menjelaskan mengapa pengguna yang sama tidak dapat melakukan hal yang sama jika direktori saat ini dimiliki + hanya dapat ditulis oleh root. Jawaban di bawah ini oleh @kerrek akurat dan singkat.
FractalSpace
@FractalSpace Hah? Sistem dapat membuat perubahan yang memerlukan akses istimewa atas nama pengguna yang tidak berhak dan melakukannya sepanjang waktu. Misalnya, mengubah byte pada disk memerlukan akses istimewa. Namun, jika pengguna dapat memodifikasi file, sistem akan memutuskan untuk memodifikasi beberapa byte pada disk meskipun pengguna tidak memiliki izin untuk memodifikasi byte itu sendiri. Seorang pengguna tidak dapat mengubah memori kernel, tetapi kernel bisa ketika mengeksekusi atas nama pengguna. Sistem beroperasi dengan memutuskan untuk melakukan operasi yang tidak dapat diotorisasi oleh pengguna mereka.
David Schwartz
Iya nih. Dan akhirnya semuanya dilakukan oleh "sistem". Tetapi tidak sebelum melalui aturan pemisahan hak istimewa yang ketat yang ditetapkan untuk "ruang pengguna" tertentu. Dalam skenario ini, misalnya, "sistem" tidak membuat tindakan sebagai aturan umum, tetapi mengikuti izin yang ditetapkan pada "direktori induk". Bagian penting dari masalah ini dalam pertanyaan OP.
FractalSpace
0

Tebakan pertama: Untuk menghapus file, Anda harus menulis izin pada folder yang berisi. Jadi Coba / home / johsua / foo / bar, berikan 755 ke foo dan 644 untuk bar.

Eugen Rieck
sumber