Bagaimana cara membuat file TIDAK dapat dimodifikasi?


35

Saat masuk, saya dapat melakukan hal berikut:

mkdir foo
touch foo/bar
chmod 400 foo/bar 
chmod 500 foo

Kemudian saya dapat membuka vim (bukan sebagai root), mengedit bar, memaksa menulis w!, dan file tersebut dimodifikasi.

Bagaimana saya bisa membuat sistem operasi melarang modifikasi file?

UPDATE 02 Mar 2017

  1. chmod 500 fooadalah herring merah: izin menulis pada direktori tidak ada hubungannya dengan kemampuan untuk mengubah konten file - hanya kemampuan untuk membuat dan menghapus file.

  2. chmod 400 foo/barsebenarnya mencegah isi file dari diubah. Tapi , itu tidak mencegah perizinan file dari berubah - pemilik file selalu dapat mengubah izin file-nya (dengan asumsi mereka dapat mengakses file yaitu mengeksekusi izin pada semua direktori leluhur). Faktanya, strace (1) mengungkapkan bahwa inilah yang sedang dilakukan vim (7.4.576 Debian Jessie) - vim memanggil chmod (2) untuk sementara menambahkan izin menulis untuk pemilik file, memodifikasi file, dan kemudian memanggil chmod ( 2) lagi untuk menghapus izin menulis. Itulah sebabnya menggunakan chattr +ikarya - hanya root yang bisa memanggil chattr -i. Secara teoritis, vim (atau program apa pun) dapat melakukan hal yang sama dengan chattr seperti halnya dengan chmod pada file yang tidak dapat diubah jika dijalankan sebagai root.


3
Saya percaya di bawah tenda, vimsebenarnya mengubah izin dan kemudian mengembalikannya.
jordanm

Apakah Anda tidak berlari root?
Alvin Wong

Alvin, saya melakukan ini sebagai pengguna non-root. Saya telah mengedit pos untuk mengklarifikasi.
user2141130

Jawaban:


49

Anda dapat mengatur atribut "tidak berubah" dengan sebagian besar sistem file di Linux.

chattr +i foo/bar

Untuk menghapus atribut yang tidak dapat diubah, Anda menggunakan -alih-alih +:

chattr -i foo/bar

Untuk melihat atribut file saat ini, Anda dapat menggunakan lsattr:

lsattr foo/bar

Halaman chattr (1) menyediakan deskripsi semua atribut yang tersedia. Berikut ini deskripsi untuk i:

   A  file with the `i' attribute cannot be modified: it cannot be deleted
   or renamed, no link can be created to this file  and  no  data  can  be
   written  to  the  file.  Only the superuser or a process possessing the
   CAP_LINUX_IMMUTABLE capability can set or clear this attribute.

3
Di Linux, flag yang tidak dapat diubah ini tersedia di banyak sistem file, tidak hanya ext2 / 3/4 (setidaknya btrfs, hfsplus, jfs, nilfs2, xfs, ocfs2, ubifs, gfs2, reiserfs AFAICT dari tampilan cepat melalui kode)
Stéphane Chazelas

@StephaneChazelas saya melihat chattrperintah itu adalah bagian dari e2fsprogspaket di sistem saya. Itu sebabnya saya membuat pernyataan itu. Saya telah memperbarui jawabannya berdasarkan komentar Anda.
jordanm

Itu tidak bekerja untuk symlink :-( Solusi ini akan menjadi besar, karena saya ingin menghindari bahwa symlink dapat. Sengaja dimodifikasi oleh setiap pengguna termasuk akar.
natenho

Immutable adalah inode flag yang benar, bukan xattr? flag ioctl tepatnya?
ytpillai

1

Kamu bisa:

  1. Ubah pemilik file menjadi rootatau pengguna tiruan yang baru dibuat
  2. Jaga grup yang benar.
  3. Gunakan chmod 440untuk memungkinkan membaca berdasarkan grup (yaitu Anda).

Jika pengguna yang benar bukan satu-satunya di grup ini, Anda harus membuat grup baru dan menambahkannya saja di dalamnya, dan gunakan grup ini untuk itu. Namun, Anda bukan pemilik file, karena itu Anda vitidak dapat mengubah pemilik file.


3
Jika Anda dapat menulis ke direktori induk, maka vim dapat menghapus file dan membuat yang baru (dan apa yang dilakukannya ketika Anda melakukannya :w!). vim tidak pergi sejauh mengubah izin direktori sementara. Jadi menjaga direktori tidak bisa ditulisi harus aman.
Stéphane Chazelas

0

Untuk membuat seluruh pohon direktori hanya baca:

cd <directory>
find ./ -print0 | sudo xargs -I {} -0 chattr +i {}

Untuk membuatnya dapat dibaca lagi, ubah +ike -i.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.