Estoy tratando denodoy 777
permiso en mi /var/www/html
carpeta, 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 -la
salida 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 moodle
carpeta 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 moodle
carpeta en /home/andre/www/moodle
, pero permaneció igual. La salida de ls -la
in /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 moodle
tiene /home/andre/www/
los permisos que quiero.
Como problema adicional, cuando accedo localhost/moodle
me 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/html
apunta 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/html
y 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/html
para su sitio.
En efecto, esto consta de cuatro pasos después de copiar sus datos nuevamente a /var/www/html
:
- Otorgue a Apache acceso a las carpetas y archivos, para que pueda servir el sitio sin errores 403.
- 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.
- (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
. - (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-data
para 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 ( +x
solo 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 PATH
está 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 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 '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-data
configurando 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 USER
el 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 +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 posterior se cree con www-data
el 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-data
como 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 +x
bit necesario /var/www/html
para recorrer la estructura de archivos y la estructura de directorios, 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 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-data
cosas, 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-data
o root:www-data
tambié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 root
del www-data
sistema 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:
- Devolver la propiedad al usuario del sistema del servidor web
www-data
.
sudo chown -R www-datos:www-datos /var/www/html
- De forma recursiva le permite leer/escribir en los archivos, mientras que otros usuarios (excluyendo
www-data
yroot
por supuesto) no tienen acceso a los archivos.
sudo find /var/www/html -type f -exec setfacl -mu:TUNOMBRE DE USUARIO:rw -m other::--- {} \;
- De forma recursiva, lea/escriba/recorra los directorios, elimine el acceso a las carpetas para otros usuarios (excluyendo
www-data
yroot
) 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::--- {} \;
- También necesitamos configurar el
setgid
bit para todos los directorios, de modo que si crea un archivo, el servidor web aún pueda acceder a élwww-data
a 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-data
lo 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 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 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/moodle
a /home/andre/www/moodle/
no elude los permisos para /home/andre/www/moodle/
. Cualquiera que quiera hacer cosas en /var/www/html/moodle
solo 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.