Apache i symlinki

1

Jak skłonić serwer Apache do podążania za dowiązaniami symbolicznymi?

Uczę się go właśnie, więc zainstalowałem go sobie na Fedorze i nawet udało mi się skłonić go do wyświetlenia pliku HTML, a następnie także do pobrania pliku CSS znajdującego się w innym katalogu niż ten plik HTML. I nie potrzebowałbym więcej, by być zadowolonym, jednak na końcu doszedłem do wniosku, że nie chcę pracować bezpośrednio na plikach w katalogu /var/www/html ani ich tam kopiować.

Utworzyłem więc dowiązanie symboliczne – na razie testowo do katalogu js (dla uproszczenia przyjmijmy, że ścieżka katalogu to /home/user/web/js, a dowiązanie utworzyłem w katalogu /var/www/html). Ale podczas pobierania pliku ./js/index.js (tak mam to zapisane w pliku index-en.html) Apache mówi: 403 Forbidden.

Moja konfiguracja w pliku /etc/httpd/conf/httpd.conf (w tym pliku nic nie zmieniałem):

DocumentRoot "/var/www/html"

<Directory "/var/www/html">
Options Indexes FollowSymLinks
</Directory>

Struktura katalogów:

/var/www/html/css
/var/www/html/index-en.html
/var/www/html/js -> /home/user/web/js

Wersja Apache: 2.4.29.

Myślałem także nad rozwiązaniem z aliasami, ale z tego, co zauważyłem, one są używane raczej w przypadku dostępu przez URL.

Przejrzałem Google pod tym względem, ale tyle jest możliwości, że pogubiłem się na samym początku. Może ktoś po prostu już to przerabiał. Pytajcie, gdybym za mało dał konfiguracji.


EDIT: Zmieniłem zapis ścieżek na prawidłowy.


EDIT 2: Komunikat w pliku /etc/httpd/logs/error_log pojawiający się przy próbie dostępu do dowiązania symbolicznego js jest następujący:

Symbolic link not allowed or link target not accessible: /var/www/html/js, referer: http://localhost/

EDIT 3: Znalazłem takie rozwiązanie: https://unix.stackexchange.com/a/21339. Autor sugeruje, że należy dać prawa odczytu dla każdego z katalogów nadrzędnych, tj. w moim przypadku /home/user/web, /home/user, /home oraz /. Jakkolwiek w komentarzach sugerują, że to jest zwyczajne zachowanie, i w sumie logika by tak nakazywała (bo, wydaje mi się, ścieżki nie są odczytywane od dołu do /, tylko od / w dół), to jednak nadal nie jestem pewien, czy to właściwe rozwiązanie. Muszę jeszcze sprawdzić, czy nie da się tego obejść, w sensie uprawnień.


EDIT 4: Powyższe rozwiązanie zdaje się coś robić (dla czystości konfiguracji zamiast chmod o+x /home/user ustawiłem ACL (https://fedoraproject.org/wiki/Administration_Guide_Draft/ACLs#Enabling_ACLs_on_a_file_system) na tym katalogu dla użytkownika apache). Nadal jest 403 Forbidden, ale teraz dostaję inny komunikat w logu: file permissions deny server access: /var/www/html/js/index.js, referer: http://localhost/.


EDIT 5: Udało się! – ale na razie tylko obejść. :) Okazało się, że SELinux blokował – ale co, jak i gdzie, to tego stwierdzić na razie nie mogę. Przy okazji, ciekawostka, nawet Red Hat (od Fedory) podaje przykład u siebie z Apache'a ;) – https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/selinux_users_and_administrators_guide/sect-security-enhanced_linux-troubleshooting-fixing_problems


EDIT 6: Udało się – chyba już na stałe. :) Ustaliłem, że trzeba zmienić tzw. SELinux context, jak opisane w tym artykule: https://wiki.apache.org/httpd/13PermissionDenied

If all the standard permissions are correct and you still get a Permission Denied error, you should check for extended-permissions. For example you can use the command setenforce 0 to turn off SELinux and check to see if the problem goes away. If so, ls -alZ can be used to view SELinux permission and chcon to fix them. [pogrubienie moje]

Co prawda nie twierdzę, że jest to metoda całkiem bezpieczna i trwała (w szczególności są różne sposoby zmiany kontekstu SELinuksa, trwałe i nietrwałe – https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/selinux_users_and_administrators_guide/sect-security-enhanced_linux-working_with_selinux-selinux_contexts_labeling_files). Jednak nie znam na razie lepszej. Parę dodatkowych źródeł:

Z bieżących wątpliwości pozostaje zastanowić się, czy należy zmieniać kontekst raz dla katalogu, czy cały czas dla każdego nowego pliku, a może gdzieś indziej w systemie można to też zrobić.

Z wątpliwości dalszych - czy jest to w ogóle bezpieczne.


Jeśli ktoś zna lepsze rozwiązanie, chętnie się dowiem, wątek jest otwarty.

0

Stwórz symlink z pełnym, absolutnym adresem, a nie relatywnym.
Twoje ~ nie jest tym samym, co apaczowe.

0

@Patryk27: jak zasugerowałeś w komentarzu, spróbowałem dać plus. Podczas apachectl restart pojawia się "Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.. A polecenie systemctl status httpd.service zwraca coś takiego:

● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor prese
   Active: failed (Result: exit-code) since Thu 2018-03-15 15:56:40 CET; 1min 3
     Docs: man:httpd.service(8)
  Process: 29940 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, 
 Main PID: 29940 (code=exited, status=1/FAILURE)
   Status: "Reading configuration..."

EDIT: Post nieaktualny, rozwiązanie opisałem w pierwszym poście.


UPDATE: W pierwszym poście wyraziłem też pytania i wątpliwości co do tego rozwiązania – jeśli by ktoś chciał, może mi pomóc. :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1