„Niedozwolone łącze symboliczne lub niedostępny cel łącza” / Apache w CentOS 6

30

Mam zupełnie nową instalację CentOS 6, która ma dowiązanie symboliczne w katalogu głównym dokumentu do moich plików programistycznych:

[root@localhost html]# ls -l
total 4
-rwxrwxrwx. 1 root root  0 Sep 18 20:16 index.html
-rwxrwxrwx. 1 root root 17 Sep 18 20:16 index.php
lrwxrwxrwx. 1 root root 24 Sep 18 20:19 refresh-app -> /home/billy/refresh-app/

Mój httpd.conf ma to:

<Directory "/">
    Options All
    AllowOverride None
    Order allow,deny
    Allow from all
</directory>

Cel dowiązania symbolicznego ma uprawnienia, które powinny pozwolić apache na odczytanie wszystkiego, co chce:

 [root@localhost billy]# ls -l
total 40 (Some entries were omitted because the list was too long
drwxr-xr-x. 7 billy billy 4096 Sep 18 20:03 refresh-app

Próbowałem także wyłączyć SELinux, zmieniając /etc/selinux/conf:

SELINUX=disabled

Jednak bez względu na to, co robię, gdy ktoś próbuje przejść do tego linku, http://localhost/refresh-app/pojawia się strona błędu 403 ZABRONIONA i jest to napisane w /var/log/httpd/error_log:

Symbolic link not allowed or link target not accessible

Dlaczego Apache nie może uzyskać dostępu do celu dowiązania symbolicznego?

Billy ONeal
źródło
Jakiego użytkownika używa apache? Czy potrafisz odczytać ten zasób jako ten użytkownik?
draeath
Ponadto lepiej jest uruchomić selinux w trybie permissive, a następnie użyć sealert do parsowania dziennika audytu - to pozwala zobaczyć, dlaczego / jak SELinux temu zaprzecza, a często nawet daje rozwiązanie.
draeath
@draeath: Nie mam pojęcia, jak to sprawdzić.
Billy ONeal,
@draeath: 1. To nie jest pudełko produkcyjne; Nie obchodzi mnie, czy SELinux jest wyłączony. 2. W każdym razie właśnie rozwiązuję problem w tym momencie - prawdopodobnie przywrócę go, gdy odkryję podstawową przyczynę.
Billy ONeal,
Nie martw się, jest to powszechny niedopatrzenie, kiedy pierwszy raz to zrobiłem, utknąłem na kilka dni, serverfault.com/questions/313485/… :: To jeden z tych błędów. : D
whoami,

Odpowiedzi:

44

Znaleziono problem. Okazuje się, Apache chce uzyskać dostęp do katalogu nie tylko ja podaniem /home/billy/refresh-app/, ale także każdy katalog ponad to, mianowicie /home/billy/, /homeoraz /. (Nie mam pojęcia, dlaczego ... udzielenie komuś dostępu do podkatalogu nie powinno wymagać przyznania uprawnień do wszystkiego powyżej tego podkatalogu ....)

Domyślam się, że tego szuka .htaccess, a może * nix jest dziwny w tym, jak traktuje uprawnienia do przenoszenia katalogów.

Billy ONeal
źródło
15
To nie jest dziwne. Tak to działa. Musisz mieć + x dla całej ścieżki, do której próbujesz uzyskać dostęp.
bahamat
4
@bahamat: To nie ma sensu. Dlaczego ktoś miałby mieć uprawnienia do wykonywania plików, które nie zostaną wykonane? (To całkowicie pomija fakt, że nie powinno się dawać praw do /... prawie zawsze) Systemy z listami ACL mają zwykle osobną opcję przenoszenia katalogów. Po 30 latach od zaprojektowania Uniksa i szerokiej dostępności systemów ACL można pomyśleć, że listy ACL będą standardem. : westchnienie:
Billy ONeal,
11
Myślę, że miał na myśli + x w katalogach. Spróbuj przełączyć się na użytkownika i cd-do katalogu w / o + x. Z pamięci + x pozwala na dostęp do katalogu, ale go nie widzi, podczas gdy + r pozwala na wyświetlanie listy plików, a + w pozwala na zmianę plików we wspomnianym katalogu
1
@BillyONeal: wyrażenie „cała ścieżka” oznacza katalogi.
bahamat
5
To jest poprawne zachowanie w Uniksie. Potrzebujesz uprawnień do wykonywania (+ x dla g lub o) w katalogach nadrzędnych, które próbujesz zmienić na podkatalogi poniżej.
slm
11

Miałem podobny problem, gdy miałem następującą konfigurację, która działała z Ubuntu 10, ale przestałem działać z Ubuntu 14 (Apache 2.4):

<Directory /var/www/vhosts/example.com/httpdocs>
    Options +FollowSymLinks
</Directory>

Przejście do tego rozwiązało problem (nawet jeśli użytkownik serwera WWW nie był w stanie uzyskać bezpośredniego dostępu do dowiązania symbolicznego)

<Directory /var/www/vhosts/example.com/httpdocs>
    Options +ExecCGI +FollowSymlinks -SymLinksIfOwnerMatch
</Directory>

Z tego, co mogę powiedzieć, to tylko -SymLinksIfOwnerMatchustawienie i ma to coś wspólnego ze zmianami w Apache 2.4, ale nie próbowałem badać dokładnej przyczyny.

Pomyślałem również, że może to wynikać z openbase_dirograniczeń w PHP, ale tak nie było.

icc97
źródło
6

Ten błąd może być również spowodowany, jeśli łączysz się z zaszyfrowanym folderem.

cherrysoft
źródło
4

Wygląda na to, że „FollowSymLinks” jest opcją potrzebną w httpd.conf. Jest to wyszczególnione tutaj . Wygląda na to, że możesz potrzebować reguły w htdocs ... ale jest to opcja, której potrzebujesz.

RobotHumans
źródło
3
Zobacz Options All- FollowSymLinksjest już określony.
Billy ONeal,
2

Możesz także sprawdzić, czy selinux jest wymuszony czy nie. Na RedHat / Fedora wykonaj to:

getenforce

Jeśli odpowiedź brzmi „Egzekwowanie”, możesz chcieć wykonać

setenforce 0

i spróbuj ponownie URL w przeglądarce.

Zauważ, że nie mówię, że wyłączenie selinux jest najlepszym sposobem na rozwiązanie tego problemu, ale może pomóc zidentyfikować przyczynę.

botkop
źródło
rozwiązało to problem z łączem sym, ale czy są jakieś negatywne skutki?
digz6666,
2
Options +FollowSymLinks

Utwórz plik .htaccess z tym zrobił dla mnie lewę (umieść go w katalogu przed dowiązaniem symbolicznym).

Codebeat
źródło
W moim przypadku /var/wwwtworzyłem dowiązanie symboliczne do innego pośredniego dowiązania symbolicznego. Jeśli musisz użyć dowiązań symbolicznych, uczyń z niego dowiązanie symboliczne BEZPOŚREDNIO do miejsca docelowego.
Sridhar Sarnobat
0

to, co rozwiązuje mój problem po zezwoleniu na wszystkie uprawnienia i zezwolenie na followymlink „W szczególności w przypadku FollowSymLinks MUSI znajdować się w strukturze katalogów w pliku .conf. Z aktualnego podręcznika Apache

Opcje FollowSymLinks i SymLinksIfOwnerMatch działają tylko w sekcjach lub plikach .htaccess.

odpowiedz stąd

yoni333
źródło
0

Moim rozwiązaniem było utworzenie folderu współdzielonego dla wszystkich nazwanych repozytoriów /home/repo.

Następnie dowiązanie symboliczne z mojego własnego domu, takie jak: ln -s /home/repo ~/Code so ~/Code/www.xxxx.com/public wskazuje na /home/repo/www.xxxx.com/public

a także link do katalogu głównego apache /var/www/html wskazuje na /home/repo/www.xxxx.com/public

Znaleziono tutaj: https://github.com/alghanmi/ubuntu-desktop_setup/wiki/Git-Local-Repository-Setup-Guide

Dzięki akrobacji grup symlink + grup użytkowników możesz wdrożyć wielu użytkowników / wersje.

alo Malbarez
źródło
0

@Billey ONeil @Flion Nie mogłem odpowiedzieć w linii (mała liczba powtórzeń)
Oto co musiałem zrobić:
( uwaga: alias ll = 'ls $ LS_OPTIONS -lh')

root@Bellach:/var/www/html# ll lego
lrwxrwxrwx 1 root root 43 Sep 10 21:21 lego -> /home/DATA/Documents/Chris/Synced/web/lego/

Teraz spójrz na każdy katalog w linku źródłowym

root@Bellach:/var/www/html# ll -d /home/DATA/Documents/Chris/Synced/web/
drwxr-xr-x 9 chris chris 4.0K Sep 12  2017 /home/DATA/Documents/Chris/Synced/web/
root@Bellach:/var/www/html# ll -d /home/DATA/Documents/Chris/Synced/
drwxr-xr-x 20 chris chris 4.0K Mar 27 18:52 /home/DATA/Documents/Chris/Synced/
root@Bellach:/var/www/html# ll -d /home/DATA/Documents/Chris/
drwxr-xr-x 36 chris chris 4.0K Jun 17 23:31 /home/DATA/Documents/Chris/
root@Bellach:/var/www/html# ll -d /home/DATA/Documents/
drwxr-xr-x 21 chris chris 4.0K Aug  7 18:22 /home/DATA/Documents/
root@Bellach:/var/www/html# ll -d /home/DATA/
drwxrwxr-- 10 root users 4.0K Sep 10 11:17 /home/DATA/
root@Bellach:/var/www/html# ll -d /home/
drwxr-xr-x 5 root root 4.0K Sep 10 10:37 /home/

Winowajcą jest katalog / home / DATA .
Napraw to za pomocą:

root@Bellach:/var/www/html# chmod +x /home/DATA/
root@Bellach:/var/www/html# ll -d /home/DATA/
drwxrwxr-x 10 root users 4.0K Sep 10 11:17 /home/DATA/

Poprawka jest natychmiastowa - nie trzeba ponownie uruchamiać apache.

ausinch
źródło
-1

Możesz także dostosować ustawienia SELinux, a setenforce może nie być na twojej drodze. Spróbuj tego:

sudo /usr/sbin/setenforce 0

i aby utrzymywało się to między restartami

sudo vi /etc/sysconfig/selinux
Rami Jaamour
źródło