W jaki sposób uprawnienia do plików mają zastosowanie do dowiązań symbolicznych?

93

Powiedzmy, że masz taką strukturę:

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

file3to link do innej file3strony w systemie.

Teraz powiedzmy, że mam chmod 777katalog i całą zawartą w nim zawartość. Czy my file3się /tmpotrzymać te uprawnienia? Powiedzmy też, że mamy tę samą sytuację, ale odwróconą.

/tmp/file3 -> /directory/file3

Jeśli zastosuję uprawnienia do pliku, do którego prowadzi link, jak to wpłynie na link?

n0pe
źródło
Uprawnienia dotyczą tylko pliku, a nie dowiązania symbolicznego.
baraboom

Odpowiedzi:

90

To zależy od tego, jak dzwonisz chmodi platformy, na której działasz.

Na przykład w systemie Linux man chmodmówi:

chmod nigdy nie zmienia uprawnień do dowiązań symbolicznych; chmod wywołanie systemowe nie mogą zmieniać swoje uprawnienia. Nie stanowi to problemu, ponieważ uprawnienia dowiązań symbolicznych nigdy nie są używane. Jednak dla każdego dowiązania symbolicznego wymienionego w wierszu polecenia chmodzmienia uprawnienia do wskazanego pliku. Natomiast chmodignoruje dowiązania symboliczne napotkane podczas rekurencyjnych przeglądów katalogów.

Jednak na komputerze Mac chmod może być używany do modyfikowania uprawnień dowiązania symbolicznego za pomocą opcji takich jak to (z man chmod):

-h Jeśli plik jest dowiązaniem symbolicznym, zmień tryb samego łącza, a nie pliku, do którego prowadzi łącze.

Dla przykładu załóżmy, że jesteś na komputerze z systemem Linux do końca tej odpowiedzi.

Jeśli w pierwszym przypadku uruchomisz chmod -R 777 directoryrekurencyjną zmianę uprawnień, nie będzie to miało wpływu na cel łącza, ale jeśli to zrobisz chmod 777 directory/*, to zmieni się.

Jeśli bezpośrednio zmienisz uprawnienia do celu linku, uprawnienia te zostaną przeniesione (ponieważ, jak mówią strona man i baraboom , rzeczywiste uprawnienia do łącza nie są używane do niczego).


Dziennik testu dla ilustracji:

$ 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
źródło
2
To też mnie zaskoczyło. Następne pytanie: kto ma uprawnienia do jego miejsce linku znaczy ?
Edward Falk
Uprawnienia @EdwardFalk dowiązania symbolicznego nie są nieograniczające, ponieważ wszystko musi być w stanie przejść przez nie, aby uzyskać uprawnienia z połączonego pliku.
Walf
5

Odpowiedzi zarówno baraboom, jak i peth są poprawne: bity zezwolenia na same dowiązania symboliczne są nieistotne (z wyjątkiem macOS; patrz poniżej), a zmiana uprawnień na dowiązanie symboliczne - za pomocą chmodnarzędzia wiersza polecenia lub chmod()wywołania systemowego - będzie po prostu działać jako jeśli został on wykonany przeciwko celowi dowiązania symbolicznego.

Cytując opis SUSv4 / POSIX.1-2008 wywołania systemowego symlink () :

Wartości bitów trybu pliku dla utworzonego dowiązania symbolicznego są nieokreślone. Wszystkie interfejsy określone przez POSIX.1-2008 powinien zachowywać się tak, jakby zawartość dowiązania symboliczne zawsze można odczytać z tym, że wartość bitów trybu pliku zwróconych w st_mode dziedzinie statystyk struktury jest nieokreślona.

Tutaj „nieokreślony” pozostawia miejsce na interpretację dla każdego wdrożenia. Specyfika:

  • W systemie Linux (testowane przy użyciu ext4fs) stat()zwraca st_mode=0777, bez względu na to, jakie umask było podczas tworzenia dowiązania symbolicznego; ls -ldlatego zawsze wyświetla się lrwxrwxrwxdla dowiązań symbolicznych.
  • W systemach macOS (HFS) i FreeBSD (zarówno UFS, jak i ZFS) dowiązanie symboliczne ma swoje własne uprawnienie: chmod -hKomenda wymieniona powyżej może zmienić to uprawnienie (które wewnętrznie używa lchown()do tego celu wywołania systemowego innego niż POSIX ), a stat()system call zwraca tę wartość dla st_mode.

Zawsze można podążać za dowiązaniami symbolicznymi w Linuksie i FreeBSD, zgodnie z POSIX. W szczególności w FreeBSD oznacza to, że tryb pliku dowiązania symbolicznego nie ma żadnego wpływu na kontrolę dostępu.

Z drugiej strony macOS nieznacznie psuje POSIX. Chociaż można podążać za dowiązaniem symbolicznym bez względu na jego uprawnienia do odczytu, readlink()nie powiedzie się z EACCES(Odmowa zezwolenia), jeśli użytkownik nie ma uprawnień do odczytu:

$ 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

(Zwróć uwagę, że -> targetbrakuje części w danych wyjściowych drugiego ls -lpolecenia, i że cat symlinknadal się powiodło i wydrukowało zawartość targetpliku, nawet jeśli użytkownik nie miał uprawnień do odczytu symlink.)

NetBSD najwyraźniej oferuje specjalną opcję montowania o nazwie, sympermktóra, jeśli jest ustawiona, powoduje symboliczne uprawnienia do odczytu / wykonania readlink()łącza do kontroli i przejścia łącza.

astralblue
źródło
-1
  1. upuść plik linku (po upewnieniu się, że nie jest używany przez żaden proces)
  2. ustaw umask w taki sposób, aby 777-umask = wymagane uprawnienia do plików
  3. Utwórz plik linku na nowo
AVA
źródło
3
Jak to odpowiada na pytanie?
jww