Perilaku izin tautan keras berbeda antara CentOS 6 dan CentOS 7

8

Saya mendapatkan kesalahan izin di CentOS 7 ketika saya mencoba membuat tautan keras. Dengan izin yang sama yang diatur dalam CentOS 6 saya tidak mendapatkan kesalahan. Masalahnya berpusat pada izin grup. Saya tidak yakin versi OS mana yang benar dan mana yang salah.

Biarkan saya menggambarkan apa yang terjadi. Dalam direktori kerja saya saat ini, saya memiliki dua direktori: sumber dan tujuan. Pada awalnya, tujuan kosong; sumber berisi file teks.

[root@tc-dlx-nba cwd]# ls -l
total 0
drwxrwxrwx. 2 root root  6 Jun 12 14:33 destination
drwxrwxrwx. 2 root root 21 Jun 12 14:33 source
[root@tc-dlx-nba cwd]# ls -l destination/
total 0
[root@tc-dlx-nba cwd]# ls -l source/
total 4
-rw-r--r--. 1 root root 8 Jun 12 14:20 test.txt
[root@tc-dlx-nba cwd]# 

Seperti yang Anda lihat, mengenai izin kedua direktori tersebut adalah 777, dengan pemilik dan grupnya disetel ke root. Pemilik dan grup file teks juga diatur ke root. Namun, izin file teks adalah baca-tulis untuk pemilik tetapi hanya-baca untuk grup.

Ketika saya login sebagai root, saya tidak punya masalah membuat hard-link di direktori tujuan yang menunjuk ke file teks (di direktori sumber).

[root@tc-dlx-nba cwd]# ln source/test.txt destination/
[root@tc-dlx-nba cwd]# ls destination/
test.txt

Namun, jika saya masuk sebagai pengguna lain, dalam hal ini admin, saya tidak dapat membuat tautan. Saya mendapatkan: "Operasi tidak diizinkan."

[root@tc-dlx-nba cwd]# rm -f destination/test.txt 
[root@tc-dlx-nba cwd]# su admin
bash-4.2$ pwd
/root/cwd
bash-4.2$ ln source/test.txt destination/
ln: failed to create hard link ‘destination/test.txt’ => ‘source/test.txt’: Operation not permitted

Apa yang terjadi sebenarnya masuk akal bagi saya, tetapi karena hal di atas diperbolehkan dalam CentOS 6, saya ingin memeriksa untuk melihat apakah saya salah memahami sesuatu. Bagi saya, sepertinya ada bug di CentOS 6 yang telah diperbaiki di CentOS 7.

Adakah yang tahu apa yang terjadi? Apakah saya benar percaya bahwa perilaku di atas adalah perilaku yang benar? Apakah CentOS 6 yang benar? Atau, apakah keduanya benar dan mungkin ada beberapa masalah izin grup halus yang saya lewatkan? Terima kasih.


Sunting: Saya mencoba tes yang sama sekarang pada Debian v7 VM yang saya miliki. Debian setuju dengan CentOS 7: "Operasi tidak diizinkan."


Sunting # 2: Saya baru saja mencoba hal yang sama pada Mac OS X (Yosemite). Itu bekerja seperti yang dilakukan CentOS 6. Dengan kata lain, itu memungkinkan tautan dibuat. (Catatan: Pada OS X, grup root disebut "roda." Itulah satu-satunya perbedaan, sejauh yang saya tahu.)

Mario
sumber
1
Sepertinya admin pengguna tidak memiliki izin untuk memengaruhi tautan. Kepemilikan tautan adalah milik siapa yang memiliki file / folder yang ditautkan. Admin tidak sama dengan root. Itu adalah 2 sen saya. Sebagai admin coba gunakan 'sudo ln source / test.txt destination /' Anda mungkin juga ingin mulai menggunakan flag -s. Saat Anda membuat tautan tanpa tanda -s, Anda membuat tautan keras. Ini adalah resep untuk bencana karena jika file / folder yang ditautkan dihancurkan, demikian juga yang asli. Dengan 'soft link', penghancuran file yang ditautkan tidak memengaruhi yang asli.
Baazigar
@ Baazigar - Terima kasih. Saya sudah melihatnya. Inilah masalah saya. Saya mewarisi aplikasi Perl yang mengandalkan perilaku CentOS 6 (bisa membuat tautan). Saya memigrasi aplikasi ke CentOS 7. Ini benar-benar hanya masalah kecil dalam skema keseluruhan hal, tapi saya tidak tahu mengapa fungsi tautan Perl digunakan, alih-alih fungsi Perl File :: Copy. Saya pikir itu akan cukup dengan hanya menyalin file. Namun, saya harus melakukan uji tuntas sebelum mengubah hal-hal - dan (tentu saja) tidak ada dokumentasi atau komentar untuk menjelaskan keputusan awal yang saya warisi.
Mario
Tanpa dokumentasi atau justifikasi bagaimana sekarang, solusi Anda sama-sama valid dengan asumsi itu berfungsi, dan lebih valid jika berfungsi dan memiliki dokumentasi. Saya tidak berpikir ada perubahan dalam penanganan centos tautan. Saya pikir ini lebih mungkin sesuatu yang belum Anda temui di kotak yang lama, mungkin sesuatu di / etc / group atau tempat lain yang menjelaskan anomali yang tampak.
Baazigar
@ Baazigar - Saya baru saja mencoba hal yang sama di Mac OS X, meskipun saya harus menggunakan grup "wheel" (grup root) sebagai pengganti grup "root." Seperti yang Anda ketahui, OS X adalah varian BSD. Itu bekerja dengan cara yang sama dengan CentOS 6 bekerja — dengan kata lain, itu memungkinkan tautan dibuat. Saya tidak tahu apa yang benar, pada titik ini. Tidakkah seharusnya ada satu praktik terpadu di seluruh sistem apa yang (sebagian besar) kompatibel dengan POSIX?
Mario

Jawaban:

5

Saya memutar beberapa CentOS 6 dan 7 vm baru dan mampu menciptakan kembali perilaku yang Anda tunjukkan. Setelah melakukan beberapa penggalian, ternyata ini sebenarnya adalah perubahan dalam kernel tentang perilaku default sehubungan dengan tautan keras dan lunak demi keamanan. Halaman-halaman berikut mengarahkan saya ke arah yang benar:

http://kernel.opensuse.org/cgit/kernel/commit/?id=561ec64ae67ef25cac8d72bb9c4bfc955edfd415

http://kernel.opensuse.org/cgit/kernel/commit/?id=800179c9b8a1

Jika Anda membuat dunia file dapat ditulis, pengguna admin Anda akan dapat membuat tautan keras.

Untuk kembali ke perilaku lebar sistem CentOS 6, parameter kernel baru ditambahkan. Tetapkan yang berikut ini di /etc/sysctl.conf:

fs.protected_hardlinks = 0
fs.protected_symlinks = 0

lalu lari

sysctl -p

Adapun mengapa program Anda memilih untuk menggunakan tautan daripada menyalin file, mengapa membuat salinan persis file yang perlu Anda gunakan ketika Anda bisa membuat entri yang mengarah ke blok asli? Ini menghemat ruang disk dan operasi lebih murah dalam hal CPU dan I / O. Hard link baru adalah file yang sama, hanya dengan metadata / inode yang berbeda. Jika Anda menghapus file asli setelah membuat tautan keras, itu tidak akan memengaruhi tautan. File hanya 'dihapus' setelah semua tautan dihapus.

Sean
sumber
Terima kasih. Saya akan melihat tautan-tautan ini sedikit lebih lambat hari ini. (Sementara itu upvote!) Saya mengerti perbedaan antara tautan keras dan salinan. Namun, program yang saya warisi adalah membuat tautan dari file sumber ke area "unduh" (melalui front-end aplikasi web). Saya tidak berpikir ruang disk adalah masalah, karena itu hanya file teks. Selain itu, hanya dengan arti "unduhan" yang umum, saya tidak mengerti bagaimana suatu tautan cocok: secara semantik, salinan tampaknya lebih masuk akal. (Saya khawatir ada beberapa perilaku lain dalam program yang mengandalkan tautan. Saya harus memeriksanya.)
Mario
1
"Saya mengerti perbedaan antara tautan keras dan salinan." Righton, saya baru saja menulis jawaban saya dengan khalayak umum untuk pengguna masa depan yang mungkin tidak tahu.
Sean
Saya semua ingin menulis dengan audiens umum dalam pikiran :-) Saya akan menyelidiki perbaikan terbaik untuk aplikasi, pada hari Senin. Untungnya, saya punya banyak waktu luang. (Satu-satunya pengekangan saya adalah "Anda hancurkan; Anda membelinya"!) Saya menandai jawaban Anda sebagai jawaban yang diterima. Terima kasih lagi!
Mario
PS Saya menduga bahwa orang-orang CentOS telah memilih tautan yang dilindungi secara default. (Apa yang saya dapatkan dari tautan yang Anda berikan adalah bahwa ini adalah masalah yang diperdebatkan.)
Mario