Bagaimana izin file berlaku untuk symlink?

93

Katakanlah Anda memiliki struktur ini:

+ directory
-- file1
-- file2
-- file3 -> /tmp/file3

file3adalah tautan ke file3tempat lain di sistem.

Sekarang katakanlah saya chmod 777direktori dan semua konten di dalamnya. Apakah saya file3di /tmpterima mereka izin? Juga, katakanlah kita memiliki situasi yang sama tetapi terbalik.

/tmp/file3 -> /directory/file3

Jika saya menerapkan izin pada file yang ditautkan, bagaimana hal itu memengaruhi tautan?

n0pe
sumber
Izin hanya memengaruhi file, bukan symlink.
baraboom

Jawaban:

90

Itu tergantung pada bagaimana Anda menelepon chmoddan platform yang Anda jalankan.

Misalnya, pada sistem Linux, man chmodkatakan ini:

chmod tidak pernah mengubah izin tautan simbolik; yang chmod system call tidak dapat mengubah hak akses mereka. Ini bukan masalah karena izin tautan simbolis tidak pernah digunakan. Namun, untuk setiap tautan simbolis yang tercantum pada baris perintah, chmodubah izin file yang diarahkan ke. Sebaliknya, chmodabaikan tautan simbolik yang ditemui selama traversal direktori rekursif.

Namun, pada Mac, chmod dapat digunakan untuk mengubah izin tautan simbolik menggunakan opsi seperti ini (dari man chmod):

-h Jika file tersebut adalah tautan simbolis, ubah mode tautan itu sendiri daripada file yang ditunjuk oleh tautan itu.

Sebagai contoh, mari kita asumsikan Anda menggunakan mesin Linux untuk sisa jawaban ini.

Jika dalam kasus pertama Anda menjalankan chmod -R 777 directorysecara berulang mengubah izin, target tautan tidak akan terpengaruh, tetapi jika Anda melakukannya chmod 777 directory/*, itu akan terjadi.

Jika Anda mengubah izin pada target tautan secara langsung, izin tersebut akan dijalankan (karena seperti yang dikatakan halaman manual dan baraboom , izin tautan yang sebenarnya tidak digunakan untuk apa pun).


Log uji untuk ilustrasi:

$ mkdir dir && touch dir/file{1,2} /tmp/file3 && ln -s {/tmp,dir}/file3
$ ls -l dir/* /tmp/file3
-rw-r--r-- 1 user group  0 2011-06-27 22:02 /tmp/file3
-rw-r--r-- 1 user group  0 2011-06-27 22:02 dir/file1
-rw-r--r-- 1 user group  0 2011-06-27 22:02 dir/file2
lrwxrwxrwx 1 user group 10 2011-06-27 22:02 dir/file3 -> /tmp/file3

$ chmod -R 777 dir && ls -l dir/* /tmp/file3
-rw-r--r-- 1 user group  0 2011-06-27 22:02 /tmp/file3
-rwxrwxrwx 1 user group  0 2011-06-27 22:02 dir/file1
-rwxrwxrwx 1 user group  0 2011-06-27 22:02 dir/file2
lrwxrwxrwx 1 user group 10 2011-06-27 22:02 dir/file3 -> /tmp/file3

$ chmod 700 dir/* && ls -l dir/* /tmp/file3
-rwx------ 1 user group  0 2011-06-27 22:02 /tmp/file3
-rwx------ 1 user group  0 2011-06-27 22:02 dir/file1
-rwx------ 1 user group  0 2011-06-27 22:02 dir/file2
lrwxrwxrwx 1 user group 10 2011-06-27 22:02 dir/file3 -> /tmp/file3
peth
sumber
2
Itu juga mengejutkan bagi saya. Pertanyaan berikutnya: yang hak akses pada sebuah symlink berarti ?
Edward Falk
@EdwardFalk izin tautan tidak bebas-pembatasan karena semuanya harus dapat melewatinya untuk mendapatkan izin dari file yang ditautkan.
Walf
5

jawaban baraboom dan peth keduanya benar: Bit izin pada tautan simbolik itu sendiri tidak relevan (kecuali pada MacOS; lihat di bawah), dan mengubah izin pada tautan simbolik - dengan chmodalat baris perintah atau melalui chmod()panggilan sistem - hanya akan bertindak sebagai jika itu dilakukan terhadap target tautan simbolik.

Mengutip deskripsi SUSv4 / POSIX.1-2008 tentang panggilan sistem symlink () :

Nilai bit mode file untuk tautan simbolik yang dibuat tidak ditentukan. Semua antarmuka yang ditentukan oleh POSIX.1-2008 akan berperilaku seolah-olah isi dari tautan simbolik selalu dapat dibaca, kecuali bahwa nilai bit mode file yang dikembalikan dalam bidang st_mode dari struktur stat tidak ditentukan.

Di sini, "tidak ditentukan" menyisakan ruang interpretasi untuk setiap implementasi. Spesifik:

  • Di Linux (diuji menggunakan ext4fs), stat()kembali st_mode=0777, tidak peduli apa umask itu ketika symlink dibuat; ls -lkarena itu selalu ditampilkan lrwxrwxrwxuntuk tautan simbolik.
  • Pada macOS (HFS) dan FreeBSD (baik UFS dan ZFS), tautan simbolik memang memiliki izinnya sendiri: chmod -hPerintah yang disebutkan di atas dapat mengubah izin tautan ini (yang secara internal menggunakan lchown()pemanggilan sistem non-POSIX untuk mencapai hal ini), dan stat()sistem panggilan mengembalikan nilai ini untuk st_mode.

Tautan simbolik di Linux dan FreeBSD selalu dapat diikuti, seperti yang ditentukan oleh POSIX. Khususnya, pada FreeBSD, ini berarti bahwa mode file dari tautan simbolik sama sekali tidak berpengaruh pada kontrol akses.

Di sisi lain, macOS sedikit merusak POSIX. Meskipun tautan simbolis dapat diikuti tanpa izin baca, readlink()gagal dengan EACCES(Izin ditolak) jika pengguna tidak memiliki izin baca:

$ sudo ln -shf target symlink
$ sudo chmod -h 444 symlink
$ ls -l symlink
lr--r--r--  1 root  staff  1 Mar 14 13:05 symlink -> target
$ sudo chmod -h 000 symlink
$ ls -l symlink

ls: symlink: Permission denied
l---------  1 root  staff  1 Mar 14 13:05 symlink
$ echo kthxbye > target
$ cat symlink
kthxbye

(Perhatikan bahwa -> targetbagian tersebut tidak ada dalam output dari ls -lperintah kedua , dan itu cat symlinkmasih berhasil dan mencetak isi targetfile meskipun pengguna tidak memiliki izin baca symlink.)

NetBSD rupanya menawarkan opsi pemasangan khusus sympermyang dinamai , yang jika disetel, menyebabkan tautan simbolik membaca / mengeksekusi izin untuk mengontrol readlink()dan menautkan traversal.

astralblue
sumber
-1
  1. jatuhkan file tautan (setelah memastikan tidak digunakan oleh proses apa pun)
  2. atur umask sedemikian rupa sehingga 777-umask = izin file yang diperlukan
  3. buat file tautan lagi
AVA
sumber
3
Bagaimana ini menjawab pertanyaan?
jww