Miguel, miembro de nuestro equipo, nos ha hecho el favor de redactar este tutorial ya que controla muy bien dicho tema.
Solución:
Solo para indicar lo obvio para cualquiera que esté viendo esta discusión… si otorga permisos 777 a cualquiera de sus carpetas, está permitiendo que CUALQUIER PERSONA lea, escriba y ejecute cualquier archivo en ese directorio… lo que esto significa es que ha otorgado CUALQUIER PERSONA (cualquier pirata informático o persona malintencionada en todo el mundo) permiso para cargar CUALQUIER archivo, virus o cualquier otro archivo, y LUEGO ejecutar ese archivo…
SI ESTÁ CONFIGURANDO SUS PERMISOS DE CARPETA EN 777, HA ABIERTO SU SERVIDOR A CUALQUIER PERSONA QUE PUEDE ENCONTRAR ESE DIRECTORIO. ¿¿¿Bastante claro??? 🙂
Básicamente, hay dos formas de configurar su propiedad y permisos. O te otorgas la propiedad o haces que el servidor web sea el propietario de todos los archivos.
Servidor web como propietario (la forma en que la mayoría de la gente lo hace y la forma del documento de Laravel):
asumiendo que www-data (podría ser otra cosa) es el usuario de su servidor web.
sudo chown -R www-data:www-data /path/to/your/laravel/root/directory
si hace eso, el servidor web posee todos los archivos, y también es el grupo, y tendrá algunos problemas para cargar archivos o trabajar con archivos a través de FTP, porque su cliente FTP iniciará sesión como usted, no como su servidor web, así que agregue su usuario al grupo de usuarios del servidor web:
sudo usermod -a -G www-data ubuntu
Por supuesto, esto supone que su servidor web se ejecuta como www-data (el valor predeterminado de Homestead) y su usuario es ubuntu (es un error si está usando Homestead).
Luego configura todos sus directorios en 755 y sus archivos en 644… ESTABLECER permisos de archivo
sudo find /path/to/your/laravel/root/directory -type f -exec chmod 644 ;
ESTABLECER permisos de directorio
sudo find /path/to/your/laravel/root/directory -type d -exec chmod 755 ;
Tu usuario como propietario
Prefiero ser dueño de todos los directorios y archivos (hace que trabajar con todo sea mucho más fácil), así que vaya a su directorio raíz de laravel:
cd /var/www/html/laravel >> assuming this is your current root directory
sudo chown -R $USER:www-data .
Luego me doy permisos a mí y al servidor web:
sudo find . -type f -exec chmod 664 ; sudo find . -type d -exec chmod 775 ;
Luego, otorgue al servidor web los derechos de lectura y escritura en el almacenamiento y la memoria caché.
Independientemente de la forma en que lo configure, debe otorgar permisos de lectura y escritura al servidor web para almacenamiento, caché y cualquier otro directorio que el servidor web también necesite cargar o escribir (dependiendo de su situación), así que ejecute los comandos de bashy arriba:
sudo chgrp -R www-data storage bootstrap/cache sudo chmod -R ug+rwx storage bootstrap/cache
Ahora, está seguro y su sitio web funciona, Y puede trabajar con los archivos con bastante facilidad.
Los permisos para el storage
y vendor
las carpetas deben permanecer en 775
por obvias razones de seguridad.
Sin embargo, tanto su computadora como su servidor Apache deben poder escribir en estas carpetas. Ej: cuando ejecuta comandos como php artisan
su computadora necesita escribir en el archivo de registros en storage
.
Todo lo que necesita hacer es otorgar la propiedad de las carpetas a Apache:
sudo chown -R www-data:www-data /path/to/your/project/vendor
sudo chown -R www-data:www-data /path/to/your/project/storage
Luego necesita agregar su computadora (referenciada por su username
) al grupo al que pertenece el servidor Apache. Al igual que :
sudo usermod -a -G www-data userName
NOTA: Con mayor frecuencia, groupName
es www-data
pero en tu caso, reemplázalo con _www
Nos hemos encontrado con muchos casos extremos al configurar permisos para aplicaciones Laravel. Creamos una cuenta de usuario separada (deploy
) para poseer la carpeta de la aplicación Laravel y ejecutar los comandos de Laravel desde la CLI, y ejecutar el servidor web bajo www-data
. Un problema que esto causa es que los archivos de registro pueden ser propiedad de www-data
o deploy
dependiendo de quién escribió primero en el archivo de registro, evitando obviamente que el otro usuario escriba en él en el futuro.
Descubrí que la única solución sensata y segura es usar ACL de Linux. El objetivo de esta solución es:
- Para permitir que el usuario que posee/implementa la aplicación tenga acceso de lectura y escritura al código de la aplicación Laravel (usamos un usuario llamado
deploy
). - para permitir el
www-data
el usuario tiene acceso de lectura al código de la aplicación Laravel, pero no tiene acceso de escritura. - Para evitar que otros usuarios accedan al código/datos de la aplicación Laravel.
- Para permitir que tanto el
www-data
usuario y el usuario de la aplicación (deploy
) acceso de escritura a la carpeta de almacenamiento, independientemente del usuario propietario del archivo (por lo que ambosdeploy
ywww-data
puede escribir en el mismo archivo de registro, por ejemplo).
Logramos esto de la siguiente manera:
- Todos los archivos dentro de la
application/
carpeta se crean con el umask predeterminado de0022
lo que da como resultado que las carpetas tengandrwxr-xr-x
permisos y archivos que tienen-rw-r--r--
. sudo chown -R deploy:deploy application/
(o simplemente implemente su aplicación como eldeploy
usuario, que es lo que hacemos).chgrp www-data application/
para dar elwww-data
acceso grupal a la aplicación.chmod 750 application/
para permitir eldeploy
lectura/escritura del usuario, elwww-data
usuario de solo lectura y para eliminar todos los permisos a cualquier otro usuario.setfacl -Rdm u:www-data:rwx,u:deploy:rwx application/storage/
para establecer los permisos predeterminados en elstorage/
carpeta y todas las subcarpetas. Cualquier carpeta/archivo nuevo creado en la carpeta de almacenamiento heredará estos permisos (rwx
para amboswww-data
ydeploy
).setfacl -Rm u:www-data:rwX,u:deploy:rwX application/storage/
para establecer los permisos anteriores en cualquier archivo/carpeta existente.