Apache nie podąża za dowiązaniami symbolicznymi (403 zabronione)

92

Mam problem ze skonfigurowaniem Apache na Ubuntu. Postępowałem zgodnie z tym przewodnikiem .

# /usr/sbin/apache2 -v
Server version: Apache/2.2.17 (Ubuntu)
Server built:   Feb 22 2011 18:33:02

Mój katalog publiczny / var / www może z powodzeniem obsługiwać i uruchamiać umieszczone w nim strony PHP. Jednak chcę utworzyć łącze symboliczne w / var / www, które wskazuje na katalog w moim folderze domowym i udostępnia tam strony.

[root /var/www]# ll
total 36
drwxr-xr-x  3 root root 4096 2011-09-11 14:22 .
drwxr-xr-x 14 root root 4096 2011-06-04 22:49 ..
lrwxrwxrwx  1 root root   16 2011-09-11 13:21 about -> /root/site/about

Kiedy próbuję uzyskać dostęp / informacje w przeglądarce, otrzymuję

Forbidden

You don't have permission to access /about on this server.

O ile wiem, dałem wystarczające uprawnienia do plików, które chcę obsługiwać:

[root ~/site/about]# ll
total 24
drwxr-xr-x 5 root root 4096 2011-09-11 13:20 .
drwxr--r-- 3 root root 4096 2011-09-11 13:19 ..
drwxr-xr-x 2 root root 4096 2011-09-11 13:21 contact
-rwxr-xr-x 1 root root 1090 2011-09-11 13:19 index.php
drwxr-xr-x 2 root root 4096 2011-09-11 13:20 me
drwxr-xr-x 2 root root 4096 2011-09-11 13:21 resume

Znam opcję FollowSymLinks i wydaje mi się, że jest ona ustawiona w moim pliku / etc / apache2 / sites-enabled / 000-default:

DocumentRoot /var/www
<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>
<Directory /var/www/>
    Options FollowSymLinks Indexes MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
</Directory>

Masz jakiś pomysł, czego mógłbym przegapić?

Tim
źródło

Odpowiedzi:

129

Sprawdź, Apache posiada prawa do wykonania /root, /root/sitei /root/site/about.

Biegać:

chmod o+x /root /root/site /root/site/about
palacsint
źródło
8
Wielkie dzięki ... Nie zdawałem sobie sprawy, że katalogi nadrzędne również muszą być wykonywalne.
Tim
39
Cóż, nie mówię, że to nie zadziała, ale generalnie podanie o + x na / root nie jest dobrym pomysłem;)
Michał Rzemieniecki
11
Michał ma rację. Odkryłem, że mogę używać list ACL (przynajmniej na Macu):, chmod -R +a "_www allow list,search,readattr" /root /root/site /root/site/aboutktóre przyznaje te uprawnienia tylko aplikacji Apache (_www), która jest nieco bezpieczniejsza niż „inne”.
James S
1
W systemie Mac OS (10.9.4) moje ~ / Dokumenty nie miały praw do wykonywania i miałem repozytorium git, w którym hostowałem pliki mojej witryny. Przyznanie chmod o + x na ~ / Documents załatwiło sprawę! Dzięki!
Ernani Joppert,
1
Wreszcie otrzymałem odpowiedź! Dzięki.
whoan
23

Błąd 403 może być również spowodowany przez zaszyfrowany system plików, np. Łącze symboliczne do zaszyfrowanego folderu domowego .

Jeśli twoje łącze symboliczne wskazuje na zaszyfrowany folder, użytkownik apache (np. Www-data) nie może uzyskać dostępu do zawartości, nawet jeśli uprawnienia do apache i plików / folderów są ustawione poprawnie. Dostęp użytkownika danych www można przetestować za pomocą takiego połączenia:

sudo -u www-data ls -l /var/www/html/<your symlink>/

Istnieją obejścia / rozwiązania tego problemu, np. Dodanie użytkownika danych www do Twojej grupy prywatnej (ujawnia zaszyfrowane dane użytkownikowi sieciowemu) lub skonfigurowanie niezaszyfrowanego folderu rsynced (prawdopodobnie raczej bezpieczny). Ja sam prawdopodobnie zdecyduję się na rozwiązanie rsync podczas programowania.

/ubuntu/633625/public-folder-in-an-encrypted-home-directory

Wygodnym narzędziem do moich celów jest lsyncd . To pozwala mi pracować bezpośrednio w moim zaszyfrowanym folderze domowym i być w stanie niemal natychmiast zobaczyć zmiany na stronie internetowej Apache. Synchronizacja jest wyzwalana przez zmiany w systemie plików, wywołujące rsync. Ponieważ pracuję tylko na raczej małych stronach internetowych i skryptach, synchronizacja jest bardzo szybka. Postanowiłem użyć krótkiego 1-sekundowego opóźnienia przed uruchomieniem rsync, mimo że można ustawić opóźnienie na 0 sekund .

Instalowanie lsyncd (w Ubuntu):

sudo apt-get install lsyncd

Uruchomienie usługi w tle:

lsyncd -delay 1 -rsync /home/<me>/<work folder>/ /var/www/html/<web folder>/
user3811904
źródło
3
To sudo -u www-data ...świetny sposób na sprawdzenie, czy występuje problem z uprawnieniami! Zwróć uwagę, że użytkownik może być danymi www, apache lub czymś innym w zależności od twojej dystrybucji.
mkasberg
Ach, wreszcie! Już wątpiłem w moje najbardziej podstawowe umiejętności!
kalabalik
Stracone godziny i w końcu było to szyfrowanie!
myol
15

Miałem podobny problem, którego nie mogłem rozwiązać przez długi czas na moim nowym serwerze. Oprócz odpowiedzi palacsinta, dobrym pytaniem jest: czy używasz Apache 2.4? W Apache 2.4 jest inny mechanizm ustawiania uprawnień, które nie działają przy użyciu powyższej konfiguracji, więc skorzystałem z rozwiązania wyjaśnionego w tym wpisie na blogu .

Zasadniczo musiałem przekonwertować plik konfiguracyjny z:

Alias /demo /usr/demo/html

<Directory "/usr/demo/html">
    Options FollowSymLinks
    AllowOverride None
    Order allow,deny
    allow from all

</Directory>

do:

Alias /demo /usr/demo/html

<Directory "/usr/demo/html">
    Options FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

Zwróć uwagę, w jaki sposób kolejność i zezwalanie na wiersze zostały zastąpione wymaganiem wszystkich przyznanych

RightHandedMonkey
źródło
Zwróć uwagę, że polecenia Order / Allow / Deny są nadal dostępne na większości komputerów. W nowszych wersjach jest zaimplementowany w access_compatmodule. Jeśli ten moduł jest włączony, pierwsza część prawdopodobnie będzie działać zgodnie z oczekiwaniami. Jeśli go tam nie ma, próba uruchomienia Apache2 powinna zakończyć się błędem.
Alexis Wilke
Która konfiguracja? Katalog /etc/httpd/conf/httpd.confnie istnieje w moim systemie, a także katalog /etc/httpd/nie istnieje.
Aaron Franke
@AaronFranke Czy masz zainstalowany apache? Może być tutaj: /etc/apache2/httpd.conf /etc/apache2/apache2.conf /etc/httpd/httpd.conf /etc/httpd/conf/httpd.conf
RightHandedMonkey
Tak, mam zainstalowany Apache i jestem na Ubuntu. /etc/apache2/apache2.confistnieje dla mnie.
Aaron Franke
7

W związku z tym pytaniem właśnie zorientowałem się, dlaczego mój vhost dał mi ten 403.

Przetestowałem WSZYSTKIE możliwości dotyczące tego i innych pytań bez powodzenia. Prawie doprowadza mnie to do szaleństwa.

Konfiguruję serwer z wdrożeniem wydań podobnym do Capistrano za pośrednictwem dowiązań symbolicznych, a kiedy próbowałem uzyskać dostęp do folderu DocRoot (który jest teraz dowiązaniem symbolicznym do folderu aktualnej wersji), dostałem 403.

Mój vhost to:

DocumentRoot /var/www/site.com/html
<Directory /var/www/site.com/html>
        AllowOverride All
        Options +FollowSymLinks
        Require all granted
</Directory>

a mój główny plik httpd.conf to (domyślna instalacja Apache 2.4):

DocumentRoot "/var/www"
<Directory "/var/www">
    Options -Indexes -FollowSymLinks -Includes
(...)

Okazuje się, że główna definicja opcji miała pierwszeństwo przed moim polem vhostów (dla mnie jest to sprzeczne z intuicją). Więc zmieniłem to na:

DocumentRoot "/var/www"
<Directory "/var/www">
    Options -Indexes +FollowSymLinks -Includes
(...)

i Eureka! (zwróć uwagę na znak plus przed FollowSymLinks w GŁÓWNYM pliku httpd.conf. Mam nadzieję, że pomoże to innej zagubionej duszy.

mustangp51d
źródło
W Apache 2.4 twoje rozwiązanie unieważni konfigurację, a httpd nie uruchomi się, ponieważ nie możesz łączyć „+” i „-” w jednej linii Options.
deesto
Tak, to było to, mimo że zadeklarowałem DocumentRoot „wcześniej” w pliku, który przesłaniał sekcję podrzędną katalogu (co?)
rogerdpack
2

Jak odkryłem w mojej sytuacji, istnieje inny sposób, w jaki symboliczne powiązania mogą cię zawieść. Jeśli masz system SELinux jako serwer, a dowiązania symboliczne wskazują na folder zamontowany w systemie NFS (inne systemy plików mogą dawać podobne objawy), httpdmożesz zobaczyć niewłaściwe konteksty i odmówić obsługi zawartości folderów docelowych.

W moim przypadku kontekst SELinux /var/www/html(który można uzyskać ls -Z) to unconfined_u:object_r:httpd_sys_content_t:s0. Dowiązania symboliczne w programie /var/www/htmlbędą miały ten sam kontekst, ale kontekst ich celu, czyli folder zamontowany w systemie plików NFS, tak system_u:object_r:nfs_t:s0.

Rozwiązaniem jest dodanie fscontext=unconfined_u:object_r:httpd_sys_content_t:s0do mountopcji (np # mount -t nfs -o v3,fscontext=unconfined_u:object_r:httpd_sys_content_t:s0 <IP address>:/<server path> /<mount point>.). rootcontextjest nieistotna i defcontextjest odrzucana przez NFS. Sam nie próbowałem context.

Urhixidur
źródło
2

Najpierw wyłącz selinux (vim / etc / selinux / config)

vim /etc/httpd/conf/httpd.conf edytuj następujące wiersze dla dowiązań symbolicznych i indeksowania katalogów:

documentroot /var/www/html
<directory /var/www/html>
    Options Indexes FollowSymLinks
    AllowOverride None
</directory>

Jeśli plik .htaccess, to AllowOverride all

nsn srinivas
źródło
Co jeśli nie mam /etc/httpd/folderu w swoim systemie?
Aaron Franke
1

Oprócz zmiany uprawnień, jak wskazywały inne odpowiedzi, musiałem ponownie uruchomić apache, aby odniosło skutek:

sudo service apache2 restart
tmath
źródło
0

Kolejna subtelna pułapka, jeśli potrzebujesz AllowOverride All:

Gdzieś głęboko pod drzewem FS, stara .htaccessistota

    Options Indexes

zamiast

    Options +Indexes

wystarczyło, aby nonszalancko wyłączyć FollowSymLinkszestaw w konfiguracji serwera i spowodować tajemniczy błąd 403.

Sz.
źródło
0

Z włączoną opcją FollowSymLinks:

$ rg "FollowSymLinks" /etc/httpd/
/etc/httpd/conf/httpd.conf
269:    Options Indexes FollowSymLinks

potrzebujesz, aby wszystkie katalogi w dowiązaniu symbolicznym były wykonywalne przez użytkownika, którego używa httpd.

więc dla tego ogólnego przypadku użycia:

cd /path/to/your/web
sudo ln -s $PWD /srv/http/

Możesz sprawdzić uprawnienia właściciela za pomocą namei :

$ namei -m /srv/http/web
f: /srv/http/web
 drwxr-xr-x /
 drwxr-xr-x srv
 drwxr-xr-x http
 lrwxrwxrwx web -> /path/to/your/web
   drwxr-xr-x /
   drwxr-xr-x path
   drwx------ to
   drwxr-xr-x your
   drwxr-xr-x web

W moim przypadku tokatalog był wykonywalny tylko dla mojego użytkownika:

Włącz wykonywanie przez innych, rozwiąż to:

chmod o+x /path/to

Zobacz, że katalog niewykonywalny może być inny lub musisz wpłynąć na grupy zamiast innych, to zależy od twojego przypadku.

albfan
źródło