Mengapa saya bisa menghapus file yang dimiliki oleh root di direktori home saya tanpa menjadi root?

40

Jadi saya melakukan beberapa pemeliharaan di server saya sebelumnya hari ini dan memperhatikan bahwa saya dapat menghapus file yang dimiliki oleh root di direktori home saya.

Saya dapat mereproduksi sampel:

[cbennett@nova ~/temp]$ ls -al
total 8
drwxrwxr-x.  2 cbennett cbennett 4096 Oct  5 20:59 .
drwxr-xr-x. 22 cbennett cbennett 4096 Oct  5 20:58 ..
-rw-rw-r--.  1 cbennett cbennett    0 Oct  5 20:58 my-own-file
[cbennett@nova ~/temp]$ sudo touch file-owned-by-root
[cbennett@nova ~/temp]$ ls -al
total 8
drwxrwxr-x.  2 cbennett cbennett 4096 Oct  5 21:00 .
drwxr-xr-x. 22 cbennett cbennett 4096 Oct  5 20:58 ..
-rw-r--r--.  1 root     root        0 Oct  5 21:00 file-owned-by-root
-rw-rw-r--.  1 cbennett cbennett    0 Oct  5 20:58 my-own-file
[cbennett@nova ~/temp]$ rm file-owned-by-root
rm: remove write-protected regular empty file ‘file-owned-by-root’? y
[cbennett@nova ~/temp]$ ls -al
total 8
drwxrwxr-x.  2 cbennett cbennett 4096 Oct  5 21:00 .
drwxr-xr-x. 22 cbennett cbennett 4096 Oct  5 20:58 ..
-rw-rw-r--.  1 cbennett cbennett    0 Oct  5 20:58 my-own-file
[cbennett@nova ~/temp]$

Pertanyaan saya adalah bagaimana saya bisa menghapus file yang dimiliki oleh root dan memiliki izin -rw-r--r--, sementara saya tidak root?

Carl Bennett
sumber
6
Anda dapat menghapus entri di direktori yang menunjuk ke file karena Anda memiliki akses tulis ke direktori. Anda tidak dapat serta merta menghapus file; file tersebut mungkin memiliki tautan keras lain di tempat lain.
user253751
2
Ekstensi lucu: Anda juga dapat mengganti nama file, atau membuat tautan keras.
peterh mengatakan mengembalikan Monica
11
Harap pertimbangkan kembali pilihan Anda untuk jawaban yang diterima, karena jawaban yang sekarang benar-benar menyesatkan: Anda tidak diizinkan melakukan apa pun untuk itu selain konten di dalamnya berdasarkan izin direktori .
Cthulhu
@Cthulhu Selesai! Terima kasih semuanya atas semua komentar pada Tanya Jawab ini, pasti banyak informasi berguna di sini!
Carl Bennett

Jawaban:

34

Izin, konten, dan semua atribut adalah bagian dari inode. Nama ada di entri direktori. Izin tidak diwarisi secara rekursif (kecuali ketika Anda menggunakan default di Posix ACL).

Ketika Anda menghapus file, secara internal Anda hanya menghapus tautan keras dari entri direktori ke inode. Ketika semua hardlink dihapus dan inode tidak digunakan, sistem file akan mengambil kembali ruang tersebut. Anda hanya perlu menulis izin pada folder apa pun izin yang ditetapkan pada file (dengan pengecualian izin ext yang tidak dapat diubah). Sama untuk folder kosong.

Ketika Anda menghapus folder yang tidak kosong, Anda perlu izin menulis pada folder yang Anda hapus dan orang tuanya.

Mircea Vutcovici
sumber
1
Jadi izin berada di inode atau izin berada di tautan ke inode, dan saya hanya menghapus tautan itu (dan dengan demikian satu-satunya tautan ke sana dihapus, sehingga inode tidak lagi ada)?
Carl Bennett
3
Izin ada di inode. Ini mudah diverifikasi dengan membuat tautan keras ke file, mengubah izin itu, dan kemudian memeriksa izin pada dokumen asli.
Wouter Verhelst
tetapi katakanlah ada direktori dan file di dalamnya keduanya milik root, direktori tersebut berada di direktori yang dimiliki oleh pengguna. Anda tidak akan bisa menghapusnya, kan?
njzk2
1
Ini adalah atribut khusus untuk ext2, ext3, dan ext4. Contoh: sudo touch test_file;sudo chattr +i test_file;rm -f test_fileLihat:man chattr
Mircea Vutcovici
1
Atribut yang tidak dapat diubah melindungi file dari perubahan apa pun bahkan dari root.
Mircea Vutcovici
19

Ketika Anda memiliki direktori, Anda diizinkan untuk melakukan apa saja untuk itu dan konten di dalamnya berdasarkan izin direktori. Oleh karena itu, meskipun tidak memiliki file, Anda masih dapat menghapusnya karena Anda telah membaca / menulis izin ke direktori tempat file tersebut berada.

inetknght
sumber
46
Tidak persis. Misalnya, OP tidak akan dapat memodifikasi file yang dimiliki oleh root. Masalahnya, menghapus file tidak dianggap sebagai operasi pada file melainkan pada direktori (menghapus pointer ke file) dan itu sebabnya izin pada direktori penting.
Cthulhu
1
@ Cthulhu jadi bisakah Anda menghapus file yang dimiliki root, dan membuat yang baru dimodifikasi dengan nama yang sama setelah?
KDEx
3
@ Mororgoth ya Anda bisa, tetapi itu bukan file yang sama lagi. Untuk contoh lain (mungkin lebih jelas), Anda tidak akan dapat membaca file di direktori Anda jika itu milik root dan hanya pemiliknya yang dapat membacanya.
Cthulhu
@inetknght Ini harus diklarifikasi. Saya mengerti bahwa Anda mencoba merujuk pada memanipulasi file itu sendiri, sebagai entitas, tetapi itu tidak jelas. Anda tidak dapat mengubah isinya, misalnya. Dan Anda tidak menyebutkan atribut yang dapat melampaui izin direktori.
Mike S
1
@captcha Itu karena vimenyimpan file terlebih dahulu dalam salinan sementara, kemudian menghapus file asli dan mengganti nama salinan menjadi aslinya (atau sesuatu seperti itu).
Cthulhu