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.