Bisakah pengguna super menulis ke file read-only?

11

Saya telah menemukan perilaku izin mengejutkan (untuk saya) di FreeBSD. Katakanlah saya beroperasi sebagai pengguna non-root . Saya membuat file, menetapkan izin hanya-baca dan kemudian mencoba menulis ke dalamnya:

$ touch f
$ chmod 400 f
$ ls -l f
-r--------  1 user  wheel  f
$ echo a >> t
t: Permission denied.

Sejauh ini baik. Sekarang saya melakukan hal yang sama dengan root dan menulis ke dalam file:

# ls -l f2
-r--------  1 root  wheel  f2
# echo a >> f2
# echo $?
0

Apakah itu bug atau perilaku yang dimaksudkan? Dapatkah saya dengan aman berasumsi bahwa ini akan berhasil pada Unix & Linux?

panah
sumber
Setiap pengguna dengan CAP_DAC_OVERRIDEdapat melakukan ini. Pada hampir semua sistem Linux ini berarti root dapat melakukan ini sehingga disengaja. Tidak dapat berbicara untuk bagian FreeBSD tapi saya membayangkan mereka memiliki pengaturan yang sama.
Bratchley
1
Alasan root perlu SELALU dapat menulis ke file adalah karena pada sistem file unix tradisional (ext4, zfs dll.) Izin file adalah bagian dari file. Jadi jika root tidak dapat menulis ke file, maka NOBODY dapat membuat file read-only dapat ditulis kembali karena chmodtidak dapat menulis ke file.
slebetman
1
@slebetman Anda tidak perlu memiliki akses tulis ke file untuk memperbarui izin. Coba saja touch somefile; chmod 0000 somefile; chmod 0644 somefilesebagai pengguna biasa.
user253751
@immibis: Itu milik Anda. Root harus dapat mengubah izin pada file yang tidak dimilikinya
slebetman
@slebetman Ya ... tetapi Anda berbicara tentang mengubah izin pada file yang tidak dapat Anda tulis, bukan tentang mengubah izin pada file yang bukan milik Anda.
user253751

Jawaban:

13

Itu normal untuk rootdapat mengesampingkan izin dengan cara ini.

Contoh lain adalah rootbisa membaca file tanpa akses baca:

$ echo hello > tst
$ chmod 0 tst
$ ls -l tst
---------- 1 sweh sweh 6 Aug 16 15:46 tst
$ cat tst
cat: tst: Permission denied
$ sudo cat tst
hello

Beberapa sistem memiliki konsep file yang tidak dapat diubah . misalnya di FreeBSD:

# ls -l tst
-rw-r--r--  1 sweh  sweh  6 Aug 16 15:50 tst
# chflags simmutable tst
# echo there >> tst
tst: Operation not permitted.

Sekarang bahkan roottidak dapat menulis ke file. Tapi, tentu saja, rootbisa menghapus bendera:

# chflags nosimmutable tst
# echo there >> tst
# cat tst
hello
there

Dengan FreeBSD Anda dapat melangkah lebih jauh dan mengatur flag kernel untuk mencegah rootpenghapusan flag:

# chflags simmutable tst
# sysctl kern.securelevel=1
kern.securelevel: -1 -> 1
# chflags nosimmutable tst
chflags: tst: Operation not permitted

Sekarang tidak ada, bahkan tidak rootdapat mengubah file ini.

(Sistem perlu mem-boot ulang untuk mengurangi keamanan).

Stephen Harris
sumber
Bagaimana cara me-reboot langkah keamanan yang efektif? Juga, jika root adalah root dan dapat melakukan apa saja, mengapa repot-repot mencoba mencegah root melakukan apa yang diinginkan root?
kucing
1
Pada sistem yang aman, root tidak seperti Tuhan. Securelevel FreeBSD adalah upaya kecil untuk membuat root lebih tidak seperti Tuhan. Securelevel dapat diatur ke default ke 1 dalam konfigurasi sistem sehingga tetap aktif bahkan setelah reboot. Jadi itu akan membutuhkan akses konsol dan mode pengguna tunggal dan itu sangat merusak bukti. Ada seluruh esai tentang keamanan Unix yang terlalu banyak untuk bidang komentar SE, tetapi kami mencoba untuk beralih dari model 'root memiliki semua akses' menjadi sesuatu yang lebih bernuansa. Kami mencoba menegakkan jika mungkin (mis. Securelevel) dan mendeteksi di mana tidak (bukti reboot, jejak audit).
Stephen Harris
4
FWIW, di Linux chattr +i tstmenetapkan atribut yang tidak dapat diubah .
Ruslan
3

Ya, ini sangat normal. root tidak memiliki batasan baca / tulis (dengan sedikit pengecualian), karena ia adalah root.

Ipor Sircer
sumber