Problema de permisos: ¿cómo puede acceder Apache a los archivos en mi directorio de inicio?

33

Sé que los permisos de archivos se han cubierto aquí antes, pero estoy luchando por entender el concepto de mi escenario.

  • Creé los archivos en una antigua instalación de ubuntu.
  • Copié los archivos en mi nueva instalación de ubuntu y los puse en mi raíz web.
  • Cuando intento ejecutar los archivos (son archivos PHP) me sale un error relacionado con los permisos

En un intento por solucionar esto, supuse que aún deben ser propiedad del propietario anterior, así que ejecuté chown -Rel directorio, con mi nombre de usuario como argumento, para tomar posesión de todos los archivos del directorio. Cabe señalar que los nombres de usuario entre las instalaciones de ubuntu nuevas y antiguas eran las mismas.

Cuando intento ejecutar los archivos nuevamente, el mismo problema: error 500 debido a problemas de permisos. ¿Alguien puede decirme qué otros pasos debo tomar?

El webroot para mi instalación de apache está dentro de mi carpeta de inicio. Si creo nuevos archivos en mi raíz web, también funcionan como se esperaba, son solo los archivos antiguos los que causan el problema.

richzilla
fuente
No estoy seguro de que los permisos de archivo se copien cuando el archivo es, ¿alguien puede confirmar eso? De lo contrario, ¿sería posible entregar los archivos a algún otro usuario (o root) y luego reclamarlos?
Tagger
Ok, he resuelto mi problema de que los archivos no se ejecuten, pero lo hice simplemente ejecutándome chmod -R 777 diren el directorio en cuestión. Sin embargo
richzilla
3
Los permisos 777 en un archivo permitirán a todos escribir sus archivos, lo que puede dañar sus páginas o piratear. Deberías probar con 755, que normalmente se usa para archivos php. Asegúrese de que no necesita habilitar la "permitir ejecución" para un archivo, en cuyo caso puede ejecutar chmod [filename] -x. Se puede obtener información sobre el comando chmod haciendo clic en el siguiente enlace: catcode.com/teachmod/chmod_cmd.html
Geppettvs D'Constanzo
¿Qué muestra el registro de errores de Apache?
Kees Cook

Respuestas:

14

Los directorios sobre su raíz web deben tener el bit de ejecución establecido para permitir que Apache descienda a los directorios.

Si usted tiene su Webroot situada en /home/user/htdocsel /, /home, /home/usery /home/user/htdocsdebe tener el conjunto bit de ejecución.


La solución anterior "funciona", pero no es ideal. Si ha creado una carpeta, Apache no puede escribir en ella. Lo contrario también sucede.

Esto puede "arreglarse" configurando umask 0007 y agregándose al grupo Apache (www-data si no me equivoco), para que el grupo pueda escribir los archivos y carpetas recién creados.

Alternativamente, puede instalar un Apache MPM alternativo: Apache2 MPM ITK ( información sobre la configuración ) y ajustar la configuración para que Apache se ejecute bajo su usuario.

Lekensteyn
fuente
Para obtener instrucciones explícitas sobre cómo llevar esto a cabo, consulte la respuesta de Marco a continuación
hobs
2
@hobs Aún mejor, askubuntu.com/a/46371/6969
Lekensteyn
44

Si los documentos de su servidor están en el /home/$USER/public_htmldirectorio, debe ejecutar

sudo chown -R www-data:www-data /home/$USER/public_html

para otorgar la propiedad de la carpeta DocumentRoot al usuario www-datay al grupo www-data.

Entonces puedes agregarte al grupo www-data

sudo adduser $USER www-data

Finalmente, debe hacer que el propietario (usuario de www-data) pueda escribir la carpeta DocumentRoot (como parte del www-datagrupo):

sudo chmod -R 775 /home/$USER/public_html

Para mayor comodidad, puede crear secuencias de comandos public_html_fix.shcon contenido:

#!/bin/bash

sudo adduser $USER www-data
sudo chown -R www-data:www-data /home/$USER/public_html
sudo chmod -R 775 /home/$USER/public_html

Guárdelo dentro /home/$USER/biny hágalo ejecutable usando:

sudo chmod +x /home/$USER/bin/public_html_fix.sh

Luego lo llama cuando lo necesita, desde cualquier parte del sistema de archivos que se encuentre así:

public_html_fix.sh
Marko
fuente
1
funcionó para mí ....
Emmanuel Okeke
¡Gran respuesta! - Con ejemplos e incluso un script de conveniencia y cómo usar / instalar Excelente!
Andre
2
Si esto se hace en un host compartido, ¿cómo puede evitar que otros usuarios del www-datagrupo lean sus archivos o escriban para el caso?
jozxyqk
Respuesta realmente impresionante ... me salvaste la vida
NullPoiиteя
1
chmod -R 775 /home/$USER/public_htmlrealmente terrible find /home/$USER/public_html -type d -exec chmod 775 {} \;y find /home/$USER/public_html -type f -exec chmod 664 {} \;es mucho mejor
iharob
1

Además de cambiar archivos y editar archivos apache .conf, quiero decir que nada funcionó para mí porque mis archivos estaban en una partición que había montado automáticamente a través de nautilus. Esto limita la partición solo para su usuario.

Para verificar si sus archivos son visibles www-rooto cualquier usuario que ejecute apache (ejecutar ps -aux | grep apache2para verificar), ejecute el siguiente comando:

sudo su -l www-data -s /bin/bash

e intente leer un archivo desde la raíz de su documento.

Si el archivo no es legible, verifique que:

1) ha configurado todos los demás permisos de archivo

2) ha utilizado FollowSymlinksen sus .confarchivos si es necesario

3) ha configurado DocumentRoot

3) monte su partición para todos los usuarios. Tuve que editar /etc/fstaby especificar mi partición a través de su UUID:

UUID=afdee1d3-5bb8-4652-892f-e83a9b5ff72e /mnt/4tb      ext4    rw,nosuid,nodev,errors=remount-ro

Luego desmonte su partición a través de nautilus y haga una sudo mount -a. Si todo va bien, sus archivos están ahora bajo /mnt. Actualiza tus enlaces simbólicos y listo.

alexg
fuente
1

La mejor manera que he encontrado para configurar esto siempre es la forma en que VirtualMin lo hace.

crear usuario y grupo "myhome"

Haga que el usuario apache sea miembro del grupo "myhome". No al revés como algunas de las explicaciones aquí descritas

Así que ahora Apache ha leído y ejecutado el acceso a / home / myhome además de / home / myhome / www

El usuario "myhome" tiene acceso de escritura

usuario458431
fuente
Me gusta este concepto, pero no parece estar funcionando para mí. El usuario www-datapertenece al grupo myhome. Todos los archivos y directorios tienen permisos de escritura grupales y pertenecen myhome:myhome. Reinicié apache. Apache todavía no puede escribir nuevos archivos y carpetas. (Script PHP usando www-data: usuario / grupo www-data)
squarecandy