Problemas de permisos con / var / www / html y mi propio directorio de inicio para la raíz del documento de un sitio web

34

Estoy tratando de no dar permiso 777 en mi /var/www/htmlcarpeta, pero quiero editar mis archivos sin sudo. Así que pensé en crear un enlace simbólico de una carpeta en mi directorio de inicio dentro /var/www/html. Lo creé usando sudo ln -sT /home/andre/www/moodle/ moodle, y el ls -laresultado es este:

andre@andre-270E5G:/var/www/html$ ls -la
total 8
drwxr-xr-x 2 root root 4096 Mai  4 10:20 .
drwxr-xr-x 4 root root 4096 Abr 29 14:29 ..
lrwxrwxrwx 1 root root   23 Mai  4 10:20 moodle -> /home/andre/www/moodle/

Entonces, mi carpeta moodle tiene permisos de lectura, escritura y ejecución para todos, y eso no es lo que quiero. Usé el comando sudo chmod -R 775 moodle/tratando de cambiarlo, pero se quedó con los permisos de lectura, escritura y ejecución para todos. Intenté lo mismo con la carpeta moodle /home/andre/www/moodle, pero se mantuvo igual. La salida de ls -lain /home/andre/www/es:

andre@andre-270E5G:~/www$ ls -la
total 28
drwxrwxr-x  3 andre andre  4096 Mai  4 10:02 .
drwx------ 49 andre andre 20480 Mai  4 10:01 ..
drwxrwxr-x 41 andre andre  4096 Mai  4 10:02 moodle

Así que la carpeta moodleen /home/andre/www/cuenta los permisos que quiero.

Como un problema adicional, cuando accedo localhost/moodleme sale 403 Error prohibido.

¿Qué estoy haciendo mal aquí?

André Carvalho
fuente

Respuestas:

63

Nunca debería tener que ejecutar un sitio web desde su directorio de inicio . SIEMPRE. De lo contrario, tendría que darle al servidor web la capacidad de atravesar/home/para ver la estructura del directorio, pero también hacia/home/$USER/(el directorio de inicio de su usuario, donde podemos probar y ver qué más existe en su directorio de usuario), así como cualquier otra subcarpeta ahí. Un servidor web mal configurado o mal configurado o sin parche puede causar una fuga masiva de datos de esta manera, o la pérdida de credenciales y cosas que pondrían en riesgo sus datos personales e inicios de sesión. El enfoque de enlace simbólico que está utilizando tampoco ayuda por la misma razón que tratar de otorgar permisos de Apache para leer/home/andre/www/moodle- el servidor web debe poder atravesar su directorio de inicio para llegar a la ubicación a la que /var/www/htmlapunta el enlace simbólico , lo que aún representa ese riesgo de seguridad.

En primer lugar, use sudo cp -r /home/andre/www/moodle/ /var/www/html/. Esto copiará sus archivos /var/www/htmly lo mantendrá alejado de su propio directorio de inicio. Luego, volveremos a hacer los permisos para que usted y el servidor web puedan acceder a todo en ese directorio, y darle a su usuario lectura / escritura completa en todos los archivos y directorios. Entonces, solo tendrá que trabajar /var/www/htmlpara su sitio.

Esto está en efecto, cuatro pasos, después de copiar sus datos nuevamente a /var/www/html:

  1. Dé acceso a Apache a las carpetas y archivos, para que pueda servir el sitio sin errores 403.
  2. Dele a su usuario 'propietario' sobre los archivos y carpetas, y dése lectura / escritura en todos los archivos y carpetas, así como la capacidad de recorrer los directorios.
  3. (Opcional pero recomendado) Configúrelo de modo que cualquier archivo o carpeta creado a partir de aquí en la totalidad de la estructura de directorios tenga configurado el grupo www-data.
  4. (Opcional) Limpieza de seguridad final, donde configuramos permisos para que usted y el servidor web puedan ver los datos del sitio, pero otros usuarios no pueden acceder a los archivos o la estructura de directorios del sitio.

(1) Permitir el acceso de Apache a las carpetas y los archivos.

sudo chgrp -R www-data /var/www/html
sudo find /var/www/html -type d -exec chmod g+rx {} +
sudo find /var/www/html -type f -exec chmod g+r {} +

Esto establece de forma recursiva el 'grupo' www-datapara las carpetas y archivos. Esto le da al servidor web permiso para recurrir y obtener acceso a la estructura de directorios raíz del documento del sitio ( +xsolo para directorios). Luego también asegura que el servidor web tenga permisos de lectura para todos los archivos, de modo que se puedan recibir los datos del sitio.

Puede haber algunos casos en los que tenga que otorgarle al servidor web permiso de escritura en un archivo o en un directorio; esto se puede lograr haciendo sudo chmod g+w /var/www/html/PATH(dónde PATHestá la ruta al archivo o carpeta en la estructura del directorio donde necesita aplicar el permisos de escritura para el servidor web).

AVISO : Hay muchos casos en los que esto puede exponer información 'segura' sobre la configuración de un sitio (como credenciales de acceso a la base de datos, etc.), y debe eliminar 'otros' permisos de acceso a esos datos en esos archivos o directorios individuales con lo siguiente: sudo chmod o-rwx /var/www/html/FILEPATH(reemplazando FILEPATHcon la ruta relativa a la /var/www/htmlcarpeta del archivo).

Tenga en cuenta también que es posible que deba volver a ejecutar estos comandos en el futuro si los 'nuevos archivos' tienen problemas 403, para otorgar los permisos correctos al servidor web para poder acceder a los archivos y carpetas que se crean o copian y no están www-dataconfigurando el grupo correctamente.


(2) Otorgue a su propietario privilegios de lectura / escritura para las carpetas y los archivos, y permita que el acceso a la carpeta atraviese la estructura del directorio.

sudo chown -R USER /var/www/html/
sudo find /var/www/html -type d -exec chmod u+rwx {} +
sudo find /var/www/html -type f -exec chmod u+rw {} +

¡Reemplace USERen el primer comando con su propio nombre de usuario!

Hacemos tres cosas aquí. Primero, configuramos a su usuario para que sea el "Propietario" de todos los archivos y directorios /var/www/html. A continuación, establecemos permisos de lectura y escritura en las carpetas, y le permitimos acceder a las carpetas para acceder a ellas (el +xelemento en los elementos del directorio). Luego configuramos todos los archivos para que tengan permisos de lectura / escritura para el propietario, que acabamos de configurar.


(3) (Opcional) Asegúrese de que cada archivo nuevo después de esto se cree www-datacomo usuario de 'acceso'.

sudo find /var/www/html -type d -exec chmod g+s {} +

Esto establece el bit "set gid" para el grupo en los directorios. Los archivos y carpetas creados dentro de estos directorios siempre tendrán www-datacomo grupo, permitiendo el acceso al servidor web.


(4) (Opcional) Limpieza de seguridad final, si no desea que otros usuarios puedan ver los datos

Necesitamos su usuario para ver los directorios y archivos. Necesitamos el servidor web para hacerlo también. Es posible que no queramos que otros usuarios del sistema (excepto root) vean los datos. Así que no les demos ese acceso y hagamos que solo su usuario y el servidor web puedan ver los datos.

sudo chmod -R o-rwx /var/www/html/

NOTA: No tendrá que volver a ejecutar esto más adelante, o editar los permisos para la categoría 'otros' de permisos aquí. Si los 'otros' usuarios no pueden acceder /var/www/html/(no tienen el +xbit necesario /var/www/htmlpara atravesar la estructura de archivos y la estructura del directorio, ni el +rbit para leer las listas de archivos), entonces los permisos sobre los elementos debajo de ese directorio para otros usuarios o grupos realmente no va a importar demasiado.


También hay una solución un poco menos invasiva para esto, aunque no está garantizado que funcione para todos los archivos nuevos, ni para todos los sistemas de archivos , que incluyen listas de control de acceso a archivos. Esto le permite dejar la propiedad de los archivos www-datapara las cosas, pero le otorga derechos de propiedad efectivos, para todos los efectos, aunque usted no sea el propietario de los archivos.

Esta solución es un poco menos invasiva y le permite tener un directorio y todos los archivos dentro de los que es propietario www-data:www-datao que root:www-datatambién tiene acceso. Utiliza las listas de control de acceso , que le permiten tener múltiples usuarios con permisos sin configurar grupos individuales. Esto también permite que el rooto www-datalos usuarios del sistema propios archivos, sino que también le permite agregar permisos adicionales sobre una base caso por caso, y los permisos para afinar ciertos usuarios para que puedan leer las cosas, pero no editar, y tal.

Suponiendo que todavía estamos trabajando /var/www/html/y no queremos espiar a otros usuarios que no sean nosotros y el sistema (y la raíz, por supuesto) para ver nuestros datos, necesitaremos hacer lo siguiente:

  1. Devolver la propiedad al usuario del sistema del servidor web www-data.
sudo chown -R www-data: www-data / var / www / html
  1. Recurrentemente le permite leer / escribir en los archivos, mientras le da a otros usuarios (excluyendo www-datay, rootpor supuesto), acceso a los archivos.
sudo find / var / www / html -type f -exec setfacl -mu: SU NOMBREUSUARIO: rw -m otro :: --- {} \;
  1. Dése recursivamente lectura / escritura / recorrido en los directorios, elimine el acceso a las carpetas para otros usuarios (excluyendo www-datay root) y configúrelo como la ACL 'predeterminada' para los nuevos archivos en los directorios.
sudo find / var / www / html -type d -exec setfacl -d -mu: SU NOMBRE DE USUARIO: rwx -mo :: --- {} \;
  1. También necesitamos establecer el setgidbit para todos los directorios, de modo que si crea un archivo, el servidor web aún puede acceder a él www-datamediante permisos de grupo.
sudo find / var / www / html -type d -exec chmod g + x {} \;

Y ahora tiene acceso a todos los directorios, y no tuvo que quitar el acceso, lo www-dataque ayuda, ya que el servidor web todavía puede crear archivos en todas partes, según sea necesario (como las interfaces basadas en PHP que tienen sus propios directorios de caché y necesita ser creado y escrito para su correcto funcionamiento).

La única advertencia: si crea manualmente nuevos archivos, debe crearlos en consecuencia para otorgarle la propiedad al servidor web. Eso es simple sudo chown www-data:www-data filename, y las listas de control de acceso aún deberían permitirle tener derechos de propietario efectivos sobre el archivo.

Hay varios casos en los que he tenido que hacer esto como administrador de sistemas para algún tipo de acceso no estándar sin cambiar los propietarios de un archivo determinado. Esto funciona, pero tiene sus propios dolores de cabeza, ya que no todos los sistemas de archivos admiten listas de acceso a archivos.

Thomas Ward
fuente
2
@ AndréCarvalho +xa los archivos otorgaría permisos ejecutables, y no queremos que los archivos PHP se ejecuten, necesariamente, a través de la línea de comando PHP o como un ejecutable en el servidor mismo, queremos que sean procesados ​​por el analizador PHP en el servidor web (y nosotros no es necesario que los archivos PHP tengan +xpara que el analizador PHP los lea y los procese). Los directorios necesitan +xpara permitir el recorrido a través de los directorios, es decir, si un directorio no es +xy yo no soy root, no puedo ingresar al directorio, que es el problema que tuvo con Apache que no funciona con sus enlaces simbólicos y su hogar directorio.
Thomas Ward
1
@ AndréCarvalho www-dataes un grupo de sistema: no es un grupo para usuarios estándar.
Thomas Ward
1
@JunaidQadirShekhanzai Imposible de proporcionar ya que las configuraciones de las personas difieren mucho de los entornos que necesitan y de muchos otros factores. Tal 'archivo shell' sería imposible de producir dado que hay componentes opcionales . Podría intentar crear un script de Python que pudiera hacer esto, pero aún así nos encontramos con cosas como restricciones del sistema, tareas opcionales, rutas variadas, etc.
Thomas Ward
1
@ T.Todua eso no es lo que dije. Dije que nunca debe ejecutar un sitio fuera de (leer: desde dentro) su directorio "principal" , es decir, no debe ejecutar nada en /home/USER/...un servidor web. Has leído mal y malinterpretado el significado de las palabras que uso. /var/www/*es un lugar relativamente 'seguro' para ejecutar sitios web porque es una carpeta / espacio dedicado para ello. Sin embargo, /var/www/htmlNO es seguro porque eso está escrito por servidores web en la instalación y tal, y conduce a la destrucción de datos importantes (por lo tanto /var/www/SUBDIRECTORY, úselo con subdirecciones de sitios individuales)
Thomas Ward
1
He ajustado la redacción para mayor claridad.
Thomas Ward
2

La idea de usar enlaces simbólicos para resolver un problema de permiso es errónea y no puede funcionar. Los permisos que se muestran para el enlace simbólico en sí son irrelevantes, no se pueden usar para eludir los permisos del directorio "real". Crear un enlace simbólico de /var/www/html/moodlea /home/andre/www/moodle/no elude los permisos para /home/andre/www/moodle/. Cualquiera que quiera hacer cosas /var/www/html/moodlesolo puede hacerlo si tiene los permisos necesarios para hacerlo /home/andre/www/moodle/.

Su ejecución de sudo chmod -R 775 moodle/hecho lo hizo tener un efecto, pero de manera diferente de lo que se pensaba que no cambió el permiso del enlace simbólico, pero el objetivo de enlace simbólico /home/andre/www/moodle/.

El error 403 que obtiene en el servidor web probablemente se deba a que su servidor web no tiene los permisos necesarios para ingresar /home/andre. Esto no es "un problema adicional", sino que se debe al mismo problema de permisos.

Entonces, en lugar de usar enlaces simbólicos, debe averiguar los permisos que le permiten editar los archivos y el servidor web para acceder a ellos (o incluso editarlos, eso depende de la aplicación). Cuáles son exactamente esos permisos, depende de su caso de uso exacto (su aplicación y configuración del servidor).

En general, creo que es una buena idea que usted sea el propietario de los archivos y que tenga permisos rw, el servidor web solo tiene acceso de lectura a los archivos a través de los permisos de grupo, y todos los demás usuarios no tienen acceso alguno.

Un ejemplo de permiso (que podría no funcionar para su caso de uso debido a la falta de información):

andre@fermat:/var/www/html$ ls -al moodle/
total 0
drwxr-x--- 2 andre www-data 60 mai  4 16:20 .
drwxr-xr-x 3 root  root     80 mai  4 16:20 ..
-rw-r----- 1 andre www-data  0 mai  4 16:20 index.html

Puede ver que el directorio tiene acceso suficiente para que usted, como propietario, pueda ingresarlo y modificar su contenido, el servidor web (en el grupo www-data) puede ingresar y leer. Los archivos en sí son legibles y escribibles para usted (el propietario) y legibles para el servidor web (en el grupo www-data). Todos los demás usuarios no tienen acceso alguno.

Nuevamente, tome esto solo como un ejemplo. El usuario / grupo exacto de su servidor web depende de su configuración. Y su aplicación (moodle) puede necesitar diferentes permisos, debe consultar su documentación.

mastov
fuente
De acuerdo, pero esto no es demasiado útil si no saben cómo configurar los permisos correctamente, y también se encontrarán con otros problemas.
Thomas Ward
@ThomasW .: Entonces, la cuestión de cómo establecer los permisos correctamente debería ser una nueva pregunta, incluida la información necesaria, como la configuración del servidor web, la forma deseada de editar los archivos y las necesidades de la aplicación.
mastov
o escrito como una respuesta correcta, lo que estoy haciendo ahora. Tampoco debe ejecutar nada desde / home / USER / para un sitio web, ya que tiene acceso a muchos otros datos de 'usuario' si el servidor web no está parcheado o configurado correctamente.
Thomas Ward
@mastov Lo tengo. Resuelves muchas preguntas que tuve con tu explicación.
André Carvalho
2

Excelente respuesta de Thomas Ward https://askubuntu.com/a/767534/717860

Puede realizar todos los pasos recomendados en solo 3 comandos en lugar de 8 comandos:

3 comandos:

sudo chown -R ubuntu:www-data /var/www
sudo find /var/www -type d -exec chmod 2750 {} \+
sudo find /var/www -type f -exec chmod 640 {} \+

haga el mismo trabajo que los siguientes 8 comandos:

sudo chgrp -R www-data /var/www
sudo find /var/www -type d -exec chmod g+rx {} +
sudo find /var/www -type f -exec chmod g+r {} +
sudo chown -R ubuntu /var/www/
sudo find /var/www -type d -exec chmod u+rwx {} +
sudo find /var/www -type f -exec chmod u+rw {} +
sudo find /var/www -type d -exec chmod g+s {} +
sudo chmod -R o-rwx /var/www/
vipin mehta
fuente