Apache ne suivra pas les liens symboliques (403 interdit)

90

J'ai du mal à configurer Apache sur Ubuntu. J'ai suivi ce guide .

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

Mon répertoire public, / var / www, peut servir et exécuter avec succès les pages PHP qui y sont placées. Cependant, je souhaite créer un lien symbolique dans / var / www qui pointe vers un répertoire de mon dossier personnel et y sert des pages.

[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

Lorsque j'essaye d'accéder à / à propos du navigateur, j'obtiens

Forbidden

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

Pour autant que je sache, j'ai accordé des privilèges suffisants aux fichiers que je souhaite servir:

[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

Je connais l'option FollowSymLinks, et je pense qu'elle est définie dans mon fichier / 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>

Une idée de ce que je pourrais manquer?

Tim
la source

Réponses:

126

Vérifiez que Apache a les droits d' exécution pour /root, /root/siteet /root/site/about.

Courir:

chmod o+x /root /root/site /root/site/about
palacsint
la source
8
Merci beaucoup ... Je n'avais pas réalisé que les répertoires parents devaient également être exécutables.
Tim du
39
Eh bien, je ne dis pas que cela ne fonctionnera pas mais en général, donner o + x sur / root n'est pas une bonne idée;)
Michal Rzemieniecki
11
Michal a raison. J'ai trouvé que je pouvais utiliser des ACL (sous Mac, au moins) :, chmod -R +a "_www allow list,search,readattr" /root /root/site /root/site/aboutqui accorde ces autorisations uniquement à l'application apache (_www), ce qui est un peu plus sûr que "other".
James S
1
Sur Mac OS (10.9.4), mon ~ / Documents n'avait aucun droit d'exécution et j'avais un dépôt git où il hébergerait les fichiers de mon site. Accorder chmod o + x sur ~ / Documents a fait l'affaire! Merci!
Ernani Joppert
1
J'ai enfin la réponse! Merci.
whoan
21

L'erreur 403 peut également être causée par un système de fichiers crypté, par exemple un lien symbolique vers un dossier de départ crypté .

Si votre lien symbolique pointe vers le dossier chiffré, l'utilisateur apache (par exemple www-data) ne peut pas accéder au contenu, même si les autorisations apache et fichier / dossier sont correctement définies. L'accès de l'utilisateur www-data peut être testé avec un tel appel:

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

Il existe des solutions de contournement / solutions à cela, par exemple en ajoutant l'utilisateur www-data à votre groupe privé (expose les données cryptées à l'utilisateur Web) ou en créant un dossier rsynced non crypté (probablement plutôt sécurisé). Pour ma part, je vais probablement opter pour une solution rsync pendant le développement.

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

Un outil pratique pour mes besoins est lsyncd . Cela me permet de travailler directement dans mon dossier de départ chiffré et de voir les modifications presque instantanément dans la page Web Apache. La synchronisation est déclenchée par des changements dans le système de fichiers, appelant un rsync. Comme je ne travaille que sur des pages Web et des scripts plutôt petits, la synchronisation est très rapide. J'ai décidé d'utiliser un court délai de 1 seconde avant le démarrage de rsync, même s'il est possible de définir un délai de 0 seconde .

Installation de lsyncd (dans Ubuntu):

sudo apt-get install lsyncd

Démarrage du service d'arrière-plan:

lsyncd -delay 1 -rsync /home/<me>/<work folder>/ /var/www/html/<web folder>/
user3811904
la source
3
C'est sudo -u www-data ...un excellent moyen de vérifier s'il y a un problème d'autorisations! Notez que l'utilisateur peut être www-data, apache ou autre chose selon votre distribution.
mkasberg
Arghh, enfin! Je doutais déjà de mes capacités les plus élémentaires!
kalabalik
J'ai perdu des heures à cela et c'était du cryptage à la fin!
myol
15

J'avais un problème similaire que je ne pouvais pas résoudre depuis longtemps sur mon nouveau serveur. En plus de la réponse de palacsint, une bonne question à se poser est: utilisez-vous Apache 2.4? Dans Apache 2.4, il existe un mécanisme différent pour définir les autorisations qui ne fonctionnent pas lorsque vous utilisez la configuration ci-dessus, j'ai donc utilisé la solution expliquée dans cet article de blog .

Fondamentalement, ce que je devais faire était de convertir mon fichier de configuration à partir de:

Alias /demo /usr/demo/html

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

</Directory>

à:

Alias /demo /usr/demo/html

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

Notez comment les lignes Order et allow ont été remplacées par Exiger tout accordé

RightHandedMonkey
la source
Notez que les commandes Order / Allow / Deny sont toujours disponibles sur la plupart des ordinateurs. Dans les versions plus récentes, il est implémenté dans le access_compatmodule. Si ce module est activé, il est peu probable que la première partie fonctionne comme prévu. Si ce n'est pas là, essayer de démarrer Apache2 devrait échouer avec des erreurs.
Alexis Wilke
Quelle configuration? Le /etc/httpd/conf/httpd.confn'existe pas sur mon système, et le répertoire /etc/httpd/n'existe pas non plus.
Aaron Franke
@AaronFranke Avez-vous installé apache? Pourrait être ici: /etc/apache2/httpd.conf /etc/apache2/apache2.conf /etc/httpd/httpd.conf /etc/httpd/conf/httpd.conf
RightHandedMonkey
Oui, j'ai installé Apache et je suis sur Ubuntu. /etc/apache2/apache2.confexiste pour moi.
Aaron Franke le
7

En ce qui concerne cette question, je viens de comprendre pourquoi mon hôte virtuel me donnait ce 403.

J'avais testé TOUTES les possibilités sur cette question et d'autres sans succès. Cela me rend presque fou.

Je suis en train de configurer un serveur avec un déploiement de versions similaire à Capistrano via des liens symboliques et lorsque j'ai essayé d'accéder au dossier DocRoot (qui est maintenant un lien symbolique vers le dossier de version actuel), il m'a donné le 403.

Mon vhost est:

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

et mon fichier principal httpd.conf était (installation par défaut d'Apache 2.4):

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

Il s'avère que la définition principale des options prenait le pas sur mon champ vhosts (pour moi, c'est contre-intuitif). Alors je l'ai changé en:

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

et Eureka! (notez le signe plus avant FollowSymLinks dans le fichier MAIN httpd.conf. J'espère que cela aidera une autre âme perdue.

mustangp51d
la source
Dans Apache 2.4, votre solution invalidera la configuration et httpd ne démarrera pas, car vous ne pouvez pas combiner '+' et '-' dans une seule ligne Options.
deesto
Oui, c'était ça, même si j'avais déclaré un DocumentRoot "plus tôt" dans le fichier, il remplaçait la section du répertoire enfant (quoi?)
rogerdpack
2

Il y a une autre façon dont les liens symboliques peuvent vous échouer, comme je l'ai découvert dans ma situation. Si vous avez un système SELinux comme serveur et que les liens symboliques pointent vers un dossier monté sur NFS (d'autres systèmes de fichiers peuvent produire des symptômes similaires), httpdpeuvent voir les mauvais contextes et refuser de servir le contenu des dossiers cibles.

Dans mon cas, le contexte SELinux de /var/www/html(que vous pouvez obtenir avec ls -Z) est unconfined_u:object_r:httpd_sys_content_t:s0. Les liens symboliques dans /var/www/htmlauront le même contexte, mais le contexte de leur cible, étant un dossier monté sur NFS, le sont system_u:object_r:nfs_t:s0.

La solution est d'ajouter fscontext=unconfined_u:object_r:httpd_sys_content_t:s0aux mountoptions (par exemple # mount -t nfs -o v3,fscontext=unconfined_u:object_r:httpd_sys_content_t:s0 <IP address>:/<server path> /<mount point>). rootcontextn'est pas pertinent et defcontextest rejeté par NFS. Je n'ai pas essayé tout contextseul.

Urhixidur
la source
2

Commencez par désactiver selinux (vim / etc / selinux / config)

vim /etc/httpd/conf/httpd.conf éditez les lignes suivantes pour les liens symboliques et l'indexation des répertoires:

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

Si fichier .htaccess, AllowOverride all

nsn srinivas
la source
Que faire si je n'ai pas le /etc/httpd/dossier sur mon système?
Aaron Franke
1

En plus de changer les permissions comme les autres réponses l'ont indiqué, j'ai dû redémarrer apache pour qu'il prenne effet:

sudo service apache2 restart
tmath
la source
0

Encore un piège subtil, au cas où vous auriez besoin AllowOverride All :

Quelque part au fond de l'arbre fs, un vieux .htaccess ayant

    Options Indexes

au lieu de

    Options +Indexes

était tout ce qu'il fallait pour désactiver nonchalamment l' FollowSymLinksensemble dans la configuration du serveur, et provoquer un mystérieux 403 ici.

Sz.
la source