"Enlace simbólico no permitido o destino de enlace no accesible" / Apache en CentOS 6

30

Tengo una nueva instalación de CentOS 6, que tiene un enlace simbólico en la raíz del documento a mis archivos de desarrollo:

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

Mi httpd.conf tiene esto:

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

El objetivo del enlace simbólico tiene permisos que deberían permitir que apache lea lo que quiera:

 [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

También he intentado deshabilitar SELinux cambiando /etc/selinux/conf:

SELINUX=disabled

Sin embargo, no importa lo que haga, cuando alguien intente ir a ese enlace, http://localhost/refresh-app/recibo una página de error 403 PROHIBIDO y esto está escrito en /var/log/httpd/error_log:

Symbolic link not allowed or link target not accessible

¿Por qué no puede Apache acceder al destino del enlace simbólico?

Billy ONeal
fuente
¿Con qué usuario se está ejecutando Apache? ¿Puedes leer ese recurso como ese usuario?
Draeath
Además, es mejor ejecutar selinux en modo permisivo y luego usar sealert para analizar el registro de auditoría; esto le permite ver por qué / cómo SELinux lo niega y, a menudo, incluso le brinda una resolución.
Draeath
@draeath: No tengo idea de cómo verificar eso.
Billy ONeal
@draeath: 1. Esta no es una caja de producción; No me importa si SELinux está apagado. 2. En cualquier caso, solo estoy solucionando problemas en este punto, probablemente lo restauraré una vez que descubra la causa raíz.
Billy ONeal
No se preocupe, este es un descuido común, la primera vez que lo hice me quedé atrapado durante días, serverfault.com/questions/313485/… :: Es uno de esos errores. : D
whoami

Respuestas:

44

Encontró el problema. Resulta que Apache quiere acceder no solo al directorio en el que estoy sirviendo /home/billy/refresh-app/, sino también a todos los directorios que se encuentran arriba, a saber/home/billy/ , /homey /. (No tengo idea de por qué ... otorgarle a alguien acceso a un subdirectorio no debería requerir otorgar permisos a todo lo que está por encima de ese subdirectorio ...)

Supongo que está buscando .htaccesso algo así, o tal vez * nix sea extraño sobre cómo trata los permisos para el directorio transversal.

Billy ONeal
fuente
15
No es extraño Asi es como funciona. Debe tener + x para toda la ruta a la que intenta acceder.
bahamat
44
@bahamat: Eso no tiene ningún sentido. ¿Por qué alguien necesitaría privilegios de ejecución para archivos que no se ejecutan? (Esto descarta por completo que uno no debería tener que ceder derechos a /... casi nunca) Los sistemas con ACL generalmente tienen una opción transversal de directorio separada. Pensarías después de 30 años desde que se diseñó Unix, y la amplia disponibilidad de sistemas ACL, que las ACL serían el estándar. : suspiro:
Billy ONeal
11
Creo que quiso decir + x en los directorios. Intente cambiar al usuario y cd-ing al directorio w / o + x. De memoria + x que permite el acceso pero no ver el directorio + r mientras que permite a archivos de lista y + w que permite a archivos de cambios en dicho directorio
1
@BillyONeal: la frase "ruta completa" implica directorios.
bahamat
55
Este es el comportamiento correcto en Unix. Necesita ejecutar privilegios (+ x para goo) en los directorios principales que está intentando cambiar en subdirectorios debajo de ellos.
slm
11

Tuve un problema similar en el que tenía la siguiente configuración que solía funcionar con Ubuntu 10, pero dejó de funcionar con Ubuntu 14 (Apache 2.4):

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

Cambiar a esto solucionó el problema (aunque el usuario del servidor web no pudo acceder directamente al enlace simbólico)

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

Por lo que puedo decir es solo el -SymLinksIfOwnerMatch configuración y tiene algo que ver con los cambios en Apache 2.4, pero no he intentado investigar la causa exacta.

También pensé que podría deberse a openbase_dirrestricciones en PHP, pero no fue eso.

icc97
fuente
6

Este error también puede ser causado si está vinculando a una carpeta encriptada.

cherrysoft
fuente
4

Parece que "FollowSymLinks" es la opción que necesita en httpd.conf. Se detalla aquí . Parece que también podrías necesitar una regla en htdocs ... pero es la opción que necesitas.

RobotHumanos
fuente
3
Ver Options All- FollowSymLinksya está especificado.
Billy ONeal
2

También es posible que desee verificar si selinux se aplica o no. En RedHat / Fedora, ejecute esto:

getenforce

Si la respuesta es 'Ejecución', es posible que desee ejecutar

setenforce 0

e intente la url nuevamente en su navegador.

Tenga en cuenta que no estoy diciendo que deshabilitar selinux es la mejor manera de resolver este problema, pero puede ayudar a identificar la causa.

botkop
fuente
Esto solucionó el problema del enlace simbólico, pero ¿hay algún efecto negativo?
digz6666
2
Options +FollowSymLinks

Crear un archivo .htaccess con esto me ayudó (póngalo en un directorio antes del enlace simbólico).

Codebeat
fuente
En mi caso, estaba haciendo /var/wwwun enlace simbólico a otro enlace simbólico intermedio. Si debe utilizar enlaces simbólicos, conviértalo en un enlace simbólico DIRECTO a su destino.
Sridhar Sarnobat
0

eso es lo que resuelve mi problema después de permitir todos los permisos y permitir el enlace de seguimiento "En el caso de FollowSymLinks específicamente, DEBE estar dentro de una estructura de Directorio dentro de un archivo .conf. Del manual actual de Apache

Las opciones FollowSymLinks y SymLinksIfOwnerMatch funcionan solo en secciones o archivos .htaccess.

responde desde aquí

yoni333
fuente
0

Mi solución fue crear una carpeta compartida para todos los repositorios nombrados /home/repo.

Luego enlace simbólico desde mi propia casa como: ln -s /home/repo ~/Code entonces ~/Code/www.xxxx.com/public apunta a /home/repo/www.xxxx.com/public

y también un enlace a /var/www/html puntos raíz web de apache para /home/repo/www.xxxx.com/public

Lo encontré aquí: https://github.com/alghanmi/ubuntu-desktop_setup/wiki/Git-Local-Repository-Setup-Guide

Con algunos enlaces simbólicos + acrobacia de grupos de usuarios puede implementar múltiples usuarios / versiones.

alo Malbarez
fuente
0

@Billey ONeil @Flion No pude responder en línea (recuento bajo de repeticiones)
Aquí tenía que hacer:
( nota: 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/

Ahora mire cada directorio en el enlace fuente

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/

El directorio / home / DATA es el culpable.
Solucionalo con esto:

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/

La solución es inmediata: no es necesario reiniciar Apache.

ausinch
fuente
-1

También puede ajustar la configuración de SELinux, y setenforce puede no estar en su camino. Así que prueba esto:

sudo /usr/sbin/setenforce 0

y hacer que esto persista entre reinicios

sudo vi /etc/sysconfig/selinux
Rami Jaamour
fuente