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/html
apunta 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/html
y 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/html
para su sitio.
Esto está en efecto, cuatro pasos, después de copiar sus datos nuevamente a /var/www/html
:
- Dé acceso a Apache a las carpetas y archivos, para que pueda servir el sitio sin errores 403.
- 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.
- (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
.
- (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-data
para 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 ( +x
solo 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 PATH
está 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 FILEPATH
con la ruta relativa a la /var/www/html
carpeta 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-data
configurando 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 USER
en 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 +x
elemento 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-data
como 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-data
como 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 +x
bit necesario /var/www/html
para atravesar la estructura de archivos y la estructura del directorio, ni el +r
bit 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-data
para 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-data
o que root:www-data
tambié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 root
o www-data
los 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:
- Devolver la propiedad al usuario del sistema del servidor web
www-data
.
sudo chown -R www-data: www-data / var / www / html
- Recurrentemente le permite leer / escribir en los archivos, mientras le da a otros usuarios (excluyendo
www-data
y, root
por supuesto), acceso a los archivos.
sudo find / var / www / html -type f -exec setfacl -mu: SU NOMBREUSUARIO: rw -m otro :: --- {} \;
- Dése recursivamente lectura / escritura / recorrido en los directorios, elimine el acceso a las carpetas para otros usuarios (excluyendo
www-data
y 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 :: --- {} \;
- También necesitamos establecer el
setgid
bit para todos los directorios, de modo que si crea un archivo, el servidor web aún puede acceder a él www-data
mediante 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-data
que 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.
+x
a 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+x
para que el analizador PHP los lea y los procese). Los directorios necesitan+x
para permitir el recorrido a través de los directorios, es decir, si un directorio no es+x
y 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.www-data
es un grupo de sistema: no es un grupo para usuarios estándar./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/html
NO 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)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/moodle
a/home/andre/www/moodle/
no elude los permisos para/home/andre/www/moodle/
. Cualquiera que quiera hacer cosas/var/www/html/moodle
solo 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):
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 grupowww-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.
fuente
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:
haga el mismo trabajo que los siguientes 8 comandos:
fuente