Izin ditolak hanya untuk satu file dalam direktori sebagai pengguna root pada sistem file ext3 di bawah RAIDiator OS

9

Saya memiliki kotak ReadyNAS bernama "penyimpanan" yang saya percaya didasarkan pada Debian. Saya bisa ssh sebagai root. Saya mencoba mengkonfigurasi ulang server web, tapi saya mengalami masalah izin file yang saya tidak mengerti. Saya tidak bisa melakukan apa pun dengan /etc/frontview/apache/apache.pembahkan sebagai root! Tampaknya tidak memiliki izin khusus dibandingkan dengan file lain di direktori yang sama dan saya dapat bekerja dengannya.

storage:~# whoami 
root
storage:~# cd /etc/frontview/apache/   
storage:/etc/frontview/apache# ls -lah apache.pem*         
-rw-------    1 admin    admin        4.0k Jul 10  2013 apache.pem
-rw-------    1 admin    admin        4.0k Jun  9 05:57 apache.pem.2017-02-04
-rw-------    1 admin    admin        1.5k Jun  9 05:57 apache.pem.orig
storage:/etc/frontview/apache# touch apache.pem            
touch: creating `apache.pem': Permission denied
storage:/etc/frontview/apache# touch apache.pem.2017-02-04 
storage:/etc/frontview/apache# rm -f apache.pem
rm: cannot unlink `apache.pem': Operation not permitted

Apa yang istimewa dari file ini sehingga tidak dapat disentuh? Saya tidak bisa menghapusnya. Saya tidak dapat mengubah izin di atasnya. Saya tidak dapat mengubah pemiliknya.

Direktori tampaknya baik-baik saja. Ruang tersisa, tidak dipasang hanya baca. Sebenarnya saya bisa mengedit file lain di direktori yang sama.

# ls -ld /etc/frontview/apache
drwxr-xr-x    8 admin    admin        4096 Jun  9 05:44 /etc/frontview/apache
# df /etc/frontview/apache
Filesystem           1k-blocks      Used     Available Use% Mounted on
/dev/hdc1            2015824        504944   1510880   26% /
Stephen Ostermiller
sumber
Tolong juga tunjukkan hasil dari ls -ld /etc/frontview/apachedan df /etc/frontview/apache. Mungkin folder tersebut berada pada ruang disk yang terpasang ro?
Ned64
Saya menambahkan info itu ke pertanyaan. Semuanya terlihat baik bagi saya. Bagaimanapun, jika itu masalahnya, saya tidak akan berpikir saya bisa mengedit setiap file lain di direktori itu.
Stephen Ostermiller
@RunCMD Saya menambahkan informasi yang lebih spesifik ke judul dan tag. Filesystem terdaftar sebagai ext3, sehingga ext3 akan muncul untuk mendukung yang tidak berubah # mount::/dev/hdc1 on / type ext3 (rw,noatime)
Stephen Ostermiller
1
Solaris tidak mendukung ext3 atau ARM cpu sehingga mungkin tidak didasarkan pada Solaris.
alanc
1
Saya menghapus Solaris dari pertanyaan. Bacaan lebih lanjut mungkin didasarkan pada Debian Etch.
Stephen Ostermiller

Jawaban:

9

Saya baru saja menemukan masalahnya. Atribut "immutable" diset pada file itu. lstidak menunjukkannya. Anda memerlukan perintah berbeda untuk melihatnya:

# lsattr apache.pem*
----i--------- apache.pem
-------------- apache.pem.2017-02-04
-------------- apache.pem.orig

Setelah saya menghapus bit yang tidak dapat diubah, saya dapat mengedit file itu:

# chattr -i apache.pem
# touch apache.pem
Stephen Ostermiller
sumber
1
Saya mengklik pertanyaan ini di "pertanyaan jaringan panas" untuk meminta Anda memeriksa atribut-diperluas, tapi saya kira Anda sudah melakukannya. (IDK mengapa GNU lstidak memiliki opsi untuk membuat daftar atribut. Saya lupa, tapi mungkin bahkan panggilan sistem untuk menanyakannya tidak portabel, jadi mungkin lebih mudah hanya menerapkannya dalam utilitas terpisah.)
Peter Cordes
@PeterCordes Saya setuju. Saya yakin saya menyetelnya sedikit setelah Googling sesuatu seperti "hentikan upgrade dari menimpa file", tapi itu bertahun-tahun lalu dan saya jelas lupa melakukannya. Akan lebih baik jika lsmenunjukkan bit itu, atau jika salah satu dari perintah lain yang saya gunakan memiliki pesan kesalahan yang lebih membantu (dan spesifik) tentang mengapa izin ditolak.
Stephen Ostermiller
Semua yang touchtahu adalah bahwa panggilan sistem yang dicoba ( open("apache.pem", O_WRONLY|O_CREAT|..., 0666)) gagal EACCESS. (Gunakan strace -efile touch apache.pemuntuk melihat panggilan sistem terkait file yang dibuatnya). Seperti halaman manual untuk panggilan sistem itu , ada banyak kemungkinan alasan untuk EACCESS, dan banyak dari mereka melibatkan direktori induk daripada file itu sendiri. Menulis kode untuk secara akurat menyimpulkan mengapa pemanggilan sistem mengembalikan kesalahan yang dilakukannya akan sangat sulit, karena sistem file dan OS yang berbeda berbeda ...
Peter Cordes
Bagaimanapun, konvensi universal adalah bahwa ketika sesuatu gagal, Anda mencari string kesalahan untuk kode kesalahan ( errno) dan mencetaknya. (Menggunakan perrorfungsi perpustakaan standar C , atau setara). Ini adalah salah satu kasus langka di mana itu tidak selalu cukup petunjuk bagi pengguna untuk dengan cepat menemukan masalah, tetapi sebagian besar waktu itu berfungsi dengan sangat baik. (Terutama ketika dikombinasikan dengan stracejika ada keraguan tentang operasi yang menghasilkan kesalahan.) Itu tidak sempurna, tetapi bisa jauh lebih buruk (lih. MS Windows di mana yang terbaik Anda mendapatkan kode kesalahan ke google.)
Peter Cordes
Hanya bermain-main dengan chattr +i, dan melihat bahwa rm foo(tanpa -f) petunjuknya: rm: remove write-protected regular file ‘foo’. Karena faccessat(AT_FDCWD, "/var/tmp/foo", W_OK) = -1 EACCES (Permission denied). POSIX mengharuskan rmuntuk meminta secara default sebelum menghapus file yang dilindungi tulis, dan, itulah sebabnya ia memeriksa di tempat pertama. Jadi Anda akan mendapatkan petunjuk besar lebih cepat jika Anda tidak menggunakannya rm -f. : / access(3)meminta kernel untuk memeriksa izin seolah-olah itu benar-benar terbuka untuk ditulis, jadi ia mengambil ACL dan atribut.
Peter Cordes