«Lien symbolique non autorisé ou cible de lien non accessible» / Apache sur CentOS 6

30

J'ai une toute nouvelle installation CentOS 6, qui a un lien symbolique dans la racine du document vers mes fichiers de développement:

[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/

Mon httpd.conf a ceci:

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

La cible du lien symbolique a des autorisations qui devraient permettre à apache de lire tout ce qu'il veut:

 [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

J'ai également essayé de désactiver SELinux en modifiant /etc/selinux/conf:

SELINUX=disabled

Pourtant, peu importe ce que je fais, lorsque quelqu'un essaie d'accéder à ce lien, http://localhost/refresh-app/j'obtiens une page d'erreur 403 FORBIDDEN et cela est écrit dans le /var/log/httpd/error_log:

Symbolic link not allowed or link target not accessible

Pourquoi Apache ne peut-il pas accéder à la cible du lien symbolique?

Billy Oneal
la source
Avec quel utilisateur apache fonctionne-t-il? Pouvez-vous réellement lire cette ressource en tant qu'utilisateur?
draeath
De plus, il vaut mieux exécuter selinux en mode permissif, puis utiliser Sealert pour analyser le journal d'audit - cela vous permet de voir pourquoi / comment SELinux le nie et vous donne même souvent une résolution.
draeath
@draeath: Je n'ai aucune idée de comment vérifier cela.
Billy ONeal
@draeath: 1. Ce n'est pas une boîte de production; Je me fiche que SELinux soit éteint. 2. Dans tous les cas, je suis juste en train de dépanner à ce stade - je le restaurerai probablement une fois que j'aurai trouvé la cause première.
Billy ONeal
Ne vous inquiétez pas, c'est une erreur courante, la première fois que je l'ai fait, j'étais coincé pendant des jours, serverfault.com/questions/313485/… :: C'est l'une de ces erreurs. : D
whoami

Réponses:

44

Trouvé le problème. Il s'avère, Apache veut accéder à non seulement le répertoire que je sers, /home/billy/refresh-app/mais aussi tous les répertoires ci - dessus que, à savoir /home/billy/, /homeet /. (Je ne sais pas pourquoi ... donner à quelqu'un l'accès à un sous-répertoire ne devrait pas nécessiter de donner des autorisations à tout ce qui se trouve au-dessus de ce sous-répertoire ....)

Je suppose que c'est à la recherche de .htaccessquelque chose, ou peut-être que * nix est étrange sur la façon dont il traite les autorisations pour le répertoire transversal.

Billy Oneal
la source
15
Ce n'est pas étrange. Voilà comment ça marche. Vous devez avoir + x pour tout le chemin d'accès auquel vous essayez d'accéder.
bahamat
4
@bahamat: Cela n'a aucun sens. Pourquoi quelqu'un aurait-il besoin de privilèges d'exécution pour les fichiers qui ne sont pas exécutés? (Cela exclut complètement le fait que l'on ne devrait pas avoir à céder des droits sur /... à peu près jamais) Les systèmes avec ACL ont généralement une option transversale d'annuaire distincte. On pourrait penser, après 30 ans depuis la conception d'Unix et la grande disponibilité des systèmes ACL, que les ACL seraient la norme. : soupir:
Billy ONeal
11
Je crois qu'il voulait dire + x sur les répertoires. Essayez de basculer dans l'utilisateur et de cd-ing dans le répertoire w / o + x. De la mémoire + x vous permet d'accéder au répertoire sans le voir tandis que + r vous permet de lister les fichiers et + w vous permet de changer les fichiers dans ledit répertoire
1
@BillyONeal: l'expression "chemin complet" implique des répertoires.
bahamat
5
Il s'agit d'un comportement correct sous Unix. Vous avez besoin des privilèges d'exécution (+ x pour g ou o) sur les répertoires parents que vous essayez de changer en sous-répertoires en dessous.
slm
11

J'ai eu un problème similaire où j'avais la configuration suivante qui fonctionnait avec Ubuntu 10, mais a cessé de fonctionner avec Ubuntu 14 (Apache 2.4):

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

Le passage à ceci a trié le problème (même si l'utilisateur du serveur Web n'a pas pu accéder directement au lien symbolique)

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

D'après ce que je peux dire, c'est juste le -SymLinksIfOwnerMatchparamètre et a quelque chose à voir avec les changements dans Apache 2.4 mais je n'ai pas essayé de rechercher la cause exacte.

Je pensais aussi que cela pouvait être dû à des openbase_dirrestrictions en PHP mais ce n'était pas ça.

icc97
la source
6

Cette erreur peut également être provoquée si vous créez un lien vers un dossier chiffré.

cherrysoft
la source
4

Il semble que "FollowSymLinks" soit l'option dont vous avez besoin dans httpd.conf. Il est détaillé ici . Il semble que vous ayez également besoin d'une règle dans htdocs ... mais c'est l'option dont vous avez besoin.

RobotHumans
la source
3
Voir Options All- FollowSymLinksest déjà spécifié.
Billy ONeal
2

Vous pouvez également vérifier si selinux est appliqué ou non. Sur RedHat / Fedora, exécutez ceci:

getenforce

Si la réponse est «Enforcing», vous voudrez peut-être exécuter

setenforce 0

et réessayez l'URL dans votre navigateur.

Notez que je ne dis pas que la désactivation de selinux est le meilleur moyen de résoudre ce problème, mais cela peut aider à identifier la cause.

botkop
la source
cela a résolu le problème de liaison sym mais y a-t-il des effets négatifs?
digz6666
2
Options +FollowSymLinks

Créer un fichier .htaccess avec cela a fait l'affaire pour moi (mettez-le dans un répertoire avant le lien symbolique).

Codebeat
la source
Dans mon cas, je faisais /var/wwwun lien symbolique vers un autre lien symbolique intermédiaire. Si vous devez utiliser des liens symboliques, faites-en un lien symbolique DIRECTEMENT vers votre destination.
Sridhar Sarnobat
0

que ce qui résout mon problème après autoriser toutes les autorisations et autoriser followymlink "Dans le cas de FollowSymLinks spécifiquement, il DOIT être à l'intérieur d'une structure de répertoire dans un fichier .conf. Du manuel actuel d'Apache

Les options FollowSymLinks et SymLinksIfOwnerMatch fonctionnent uniquement dans les sections ou les fichiers .htaccess.

répondre d'ici

yoni333
la source
0

Ma solution a été de créer un dossier partagé pour tous les référentiels nommés /home/repo.

Ensuite , un lien symbolique de ma propre maison comme: ln -s /home/repo ~/Code si des ~/Code/www.xxxx.com/public points à /home/repo/www.xxxx.com/public

et aussi un lien vers la racine Web Apache /var/www/html pointe vers /home/repo/www.xxxx.com/public

Je l'ai trouvé ici: https://github.com/alghanmi/ubuntu-desktop_setup/wiki/Git-Local-Repository-Setup-Guide

Avec certains acrobaties symlink + groupes d'utilisateurs, vous pouvez déployer plusieurs utilisateurs / versions.

alo Malbarez
la source
0

@Billey ONeil @Flion Je ne pouvais pas répondre en ligne (faible nombre de répétitions)
Je devais faire ceci :
( note: 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/

Regardez maintenant chaque répertoire dans le lien source

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/

Le répertoire / home / DATA est le coupable.
Corrigez-le avec ceci:

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/

Le correctif est immédiat - pas besoin de redémarrer apache.

ausinch
la source
-1

Vous pouvez également ajuster vos paramètres SELinux et setenforce peut ne pas être sur votre chemin. Essayez donc ceci:

sudo /usr/sbin/setenforce 0

et pour que cela persiste entre les redémarrages

sudo vi /etc/sysconfig/selinux
Rami Jaamour
la source