Kapan chmod gagal?

8

Dalam keadaan apa akan chmodgagal?

Saya melihat halaman manual tetapi hanya menentukan penggunaan dan tidak masuk ke detail tentang keadaan apa itu tidak akan berhasil.

Saya akan berasumsi chmodakan bekerja jika:

  • kamu root
  • Anda memiliki file target (dan sedang mengatur bit mode biasa yaitu bit tidak lengket, yang lain)

Dapatkah pengguna menggunakan chmoduntuk mengubah izin pada file yang mereka punya akses grup? Apakah ini terkait dengan akses baca / tulis?

Wug
sumber
2
Ini akan gagal jika inode tidak dapat dimodifikasi, misalnya filesystem hanya baca.
jordanm

Jawaban:

3

Hanya pemilik file, atau pengguna root, yang dapat mengubah izin file. Izin saat ini pada file atau pada direktori induknya tidak relevan¹. Ini ditentukan dalam POSIX :

Aplikasi harus memastikan bahwa ID pengguna yang efektif dari proses cocok dengan pemilik file atau proses memiliki hak yang sesuai untuk melakukan ini.

Pada sebagian besar unices, "hak yang sesuai" berarti berjalan sebagai root. Jika kondisi ini tidak terpenuhi, chmodbiasanya gagal dengan EPERM, meskipun perilaku lain seperti membatalkan program karena pelanggaran keamanan diizinkan.

Selain itu, beberapa varian unix memiliki cara otorisasi atau melarang sistem khusus chmod. Misalnya, Linux memiliki kemampuan ( CAP_FOWNER) yang memungkinkan proses untuk mengubah izin file dan metadata lainnya terlepas dari pemiliknya.

Ada alasan lain yang chmodmungkin gagal meskipun file itu ada, dapat diakses dan memiliki pemilik yang sesuai. Yang umum termasuk sistem file read-only atau sistem file yang tidak mendukung izin seperti FAT. Yang kurang umum termasuk pembatasan spesifik sistem seperti atribut yang tidak dapat diubah pada sistem file Linux dan penerusnya.

¹ Kecuali sejauh proses yang sedang berjalan chmodharus dapat mengakses file, sehingga harus memiliki izin eksekusi pada direktori yang berisi file dan direktori lain yang dilaluinya untuk melakukannya.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
2

Rincian yang Anda inginkan ada di halaman manual untuk pemanggilan sistem chmod (). Alih-alih man chmoddigunakan man 2 chmod. man chattrdan man 2 setxattrakan menarik minat Anda juga; atribut file yang diatur oleh chattr / setxattr () menambah perilaku izin Unix tradisional yang ditetapkan oleh chmod.

Kyle Jones
sumber
Saya akan mencoba ini ketika saya keluar dari pekerjaan.
Wug
1

Menurut standar UNIX, "ID pengguna yang efektif dari proses harus cocok dengan pemilik file atau proses tersebut harus memiliki hak yang sesuai untuk melakukan ini."

Sedikit tentang hak yang sesuai perlu penjelasan. Pada sistem tradisional, chmod diperbolehkan pada semua file ketika UID efektif (di Linux sistem file UID, tetapi lihat di bawah) dari proses adalah 0 [yaitu root].

Linux memiliki kemampuan yang disebut sistem , dan CAP_FOWNERbit mengontrol kemampuan untuk digunakan chmodpada semua file. Secara default, semua kemampuan diberikan ketika execve()panggilan membuat proses root (baik dengan menjalankan setuid binary atau ketika UID sebenarnya adalah 0) atau ketika UID efektif diatur ke 0 (dan dihapus ketika diatur ke nilai bukan nol) , dan seperangkat kemampuan termasuk CAP_FOWNERdiaktifkan ketika UID sistem file diatur ke 0 (dan dinonaktifkan ketika diatur ke nilai bukan nol). Baca halaman manual untuk lebih jelasnya.

Anda menyebutkan bit sticky, tetapi mengabaikan fakta bahwa pengguna juga mungkin tidak mengatur bit setgid pada file ketika mereka tidak berada dalam grup yang ditugaskan untuk file tersebut. Setuid atau bit setgid juga dapat diabaikan dalam kondisi tambahan yang ditentukan implementasi.

Random832
sumber
0

Bisakah pengguna menggunakan chmod untuk mengubah izin pada file yang mereka punya akses grup?

Mengapa Anda tidak mencoba dan melihat saja?

$ touch foo
$ sudo install -o root -g $(id -gn) -m660 foo bar
$ ls -la bar
-rw-rw----  1 root  staff  0 Oct 21 21:33 bar
$ chmod g-w bar
chmod: bar: Operation not permitted
$ chmod g+x bar
chmod: bar: Operation not permitted
dubiousjim
sumber
Saya telah menyodoknya, tapi ini terkait keamanan dan saya tidak ingin secara tidak sengaja melewatkan kasus tepi.
Wug
Jika Anda khawatir tentang kasus tepi, Anda dapat (setidaknya untuk meminimalkan risiko) melakukan chmod, dan kemudian memeriksa izin di atasnya. Jika Anda merasa paranoid, lakukan fsyncsebelum memeriksanya.
nanofarad