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

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

Estoy tratando denodoy 777permiso en mi /var/www/htmlcarpeta, pero quiero editar mis archivos sin sudo. Entonces pensé en crear un enlace simbólico de una carpeta en mi directorio de inicio dentro de /var/www/html. Lo creé usando:

sudo ln -sT /home/andre/www/moodle/ moodle

y la ls -lasalida es esta:

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

Intenté cambiarlo, pero se quedó con permisos de lectura, escritura y ejecución para todos. Intenté lo mismo con la moodlecarpeta en /home/andre/www/moodle, pero permaneció 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

Entonces la carpeta moodletiene /home/andre/www/los permisos que quiero.

Como problema adicional, cuando accedo localhost/moodleme sale el error 403 Prohibido.

¿Qué estoy haciendo mal aquí?

Respuesta1

Nunca debería tener que ejecutar un sitio web desde su directorio de inicio.. ALGUNA VEZ. De lo contrario, tendría que darle al servidor web la capacidad de recorrerlo /home/para ver la estructura del directorio, pero también /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, mal configurado o sin parches puede provocar una fuga masiva de datos de esta manera, o la pérdida de credenciales, etc., lo que pondría en riesgo sus datos personales y sus inicios de sesión en diferentes cosas. El enfoque de enlace simbólico que está utilizando tampoco ayuda por la misma razón que intentar otorgar permisos de lectura a Apache /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, que aún plantea ese riesgo de seguridad.

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

En efecto, esto consta de cuatro pasos después de copiar sus datos nuevamente a /var/www/html:

  1. Otorgue a Apache acceso a las carpetas y archivos, para que pueda servir el sitio sin errores 403.
  2. Otorgue a su usuario el "propietario" de los archivos y carpetas, y concédase lectura/escritura en todos los archivos y carpetas, así como la capacidad de recorrer los directorios.
  3. (Opcional pero recomendado)Configúrelo de manera que cualquier archivo o carpeta creado a partir de ahora en toda la estructura de directorios tenga el grupo configurado como 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 puedan acceder a los archivos ni a la estructura de directorios del sitio.

(1) Permita que Apache acceda 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 que el 'grupo' sea www-datapara las carpetas y archivos. Esto luego le da al servidor web permiso para recurrir y obtener acceso a la estructura de directorios raíz de documentos del sitio ( +xsolo para directorios). Luego también garantiza 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 darle 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 de directorios 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 bases de datos, etc.), y debe eliminar "otros" permisos de acceso a esos datos en esos archivos o directorios individuales con la 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 'archivos nuevos' obtienen problemas 403, para otorgar los permisos correctos al servidor web para seguir pudiendo 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 sobre las carpetas y los archivos, y permita el acceso a las carpetas para atravesar la estructura de directorios.

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 USERel primer comando con su propio nombre de usuario!

Aquí hacemos tres cosas. Primero, configuramos su usuario para que sea el "Propietario" de todos los archivos y directorios en /var/www/html. A continuación, configuramos 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 posterior se cree con www-datael usuario de "acceso".

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

Esto establece el bit "establecer 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 final de seguridad, si no quieres que otros usuarios puedan ver los datos

Necesitamos que su usuario vea los directorios y archivos. Necesitamos que el servidor web también lo haga. 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 ni 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 recorrer la estructura de archivos y la estructura de directorios, 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 existe una solución un poco menos invasiva para esto, aunque no se garantiza que funcione con todos los archivos nuevos ni en todos los sistemas de archivos., que involucra listas de control de acceso a archivos. Esto le permite dejar la propiedad de los archivos a www-datacosas, pero le otorga derechos de propietario efectivos, para todos los efectos, aunque usted no sea el propietario personal de los archivos.

Esta solución es un poco menos invasiva y le permite tener un directorio y todos los archivos que son propiedad de www-data:www-datao root:www-datatambién darse acceso a usted mismo. UsaListas de control de acceso, que le permite tener permisos para varios usuarios sin configurar grupos individuales. Esto también permite que los usuarios rootdel www-datasistema sean propietarios de archivos, pero también le permite agregar permisos adicionales caso por caso y ajustar los permisos para ciertos usuarios para que puedan leer cosas pero no editar, y demás.

Suponiendo que todavía estamos trabajando con /var/www/html/, y no queremos que otros usuarios que no sean nosotros y el sistema (y el root, por supuesto) vean nuestros datos, necesitaremos hacer lo siguiente:

  1. Devolver la propiedad al usuario del sistema del servidor web www-data.
sudo chown -R www-datos:www-datos /var/www/html
  1. De forma recursiva le permite leer/escribir en los archivos, mientras que otros usuarios (excluyendo www-datay rootpor supuesto) no tienen acceso a los archivos.
sudo find /var/www/html -type f -exec setfacl -mu:TUNOMBRE DE USUARIO:rw -m other::--- {} \;
  1. De forma recursiva, lea/escriba/recorra los directorios, elimine el acceso a las carpetas para otros usuarios (excluyendo www-datay root) y configúrelo como la ACL 'predeterminada' para nuevos archivos en los directorios.
sudo find /var/www/html -type d -exec setfacl -d -mu:TUNOMBRE DE USUARIO:rwx -mo::--- {} \;
  1. También necesitamos configurar el setgidbit para todos los directorios, de modo que si crea un archivo, el servidor web aún pueda acceder a él www-dataa través de permisos de grupo.
sudo buscar /var/www/html -type d -exec chmod g+s {} \;

Y ahora tienes acceso a todos los directorios,yno tuvo que quitarle el acceso, www-datalo que ayuda, ya que el servidor web aún puede crear archivos en todas partes según sea necesario (como las interfaces basadas en PHP que tienen sus propios directorios de caché y que deben crearse y escribirse para un funcionamiento adecuado).

La única advertencia: si crea archivos nuevos manualmente, debe editarlos en consecuencia para otorgar propiedad al servidor web. Es una solución simple sudo chown www-data:www-data filenamey 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 archivosapoyalistas de acceso a archivos.

Respuesta2

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/

Respuesta3

La idea de utilizar 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 en su mayoría irrelevantes y no se pueden utilizar para eludir los permisos del directorio "real". Crear un enlace simbólico desde /var/www/html/moodlea /home/andre/www/moodle/no elude los permisos para /home/andre/www/moodle/. Cualquiera que quiera hacer cosas en /var/www/html/moodlesolo puede hacerlo si tiene los permisos necesarios para /home/andre/www/moodle/.

Tu ejecución de sudo chmod -R 775 moodle/realmentehizotiene un efecto, pero a diferencia de lo que pensaba, no cambió el permiso del enlace simbólico, sino del destino del enlace simbólico /home/andre/www/moodle/.

El error 403 que obtienes en el servidor web probablemente se deba a que tu 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 encontrar permisos que le permitan 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 dependen 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 tenga permisos rw, que el servidor web solo tenga acceso de lectura a los archivos a través de los permisos de grupo y que todos los demás usuarios no tengan acceso alguno.

Un ejemplo de permiso (que podría no funcionar para su caso de uso debido a que falta 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

Puedes ver que el directorio tiene acceso suficiente para que tú como propietario ingreses y modifiques su contenido, el servidor web (en el grupo www-data) puede ingresar y leer. Los archivos en sí son legibles y escritos para usted (el propietario) y legibles para el servidor web (en el grupo www-data). Todos los demás usuarios no tienen ningún acceso.

De nuevo, tome esto sólo como ejemplo. El usuario/grupo exacto de su servidor web depende de su configuración. Y tu aplicación (moodle) puede necesitar permisos diferentes, debes consultar su documentación.

información relacionada