Solución:
Solo para indicar lo obvio para cualquiera que vea esta discusión … si le da a cualquiera de sus carpetas los permisos 777, está permitiendo que CUALQUIERA lea, escriba y ejecute cualquier archivo en ese directorio … lo que esto significa es que le ha dado CUALQUIER PERSONA (cualquier pirata informático o persona malintencionada en todo el mundo) tenga permiso para cargar CUALQUIER archivo, virus o cualquier otro archivo, y ENTONCES ejecutar ese archivo …
SI ESTÁ CONFIGURANDO SUS PERMISOS DE CARPETA EN 777, HA ABIERTO SU SERVIDOR A CUALQUIERA QUE PUEDA ENCONTRAR ESE DIRECTORIO. ¿¿¿Bastante claro??? 🙂
Básicamente, hay dos formas de configurar su propiedad y permisos. O se otorga la propiedad o hace que el servidor web sea el propietario de todos los archivos.
Servidor web como propietario (como lo hace la mayoría de la gente y a la manera 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 es el propietario de 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 vagabundo si está usando Homestead).
Luego configura todos sus directorios en 755 y sus archivos en 644 … SET 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 tener todos los directorios y archivos (hace que trabajar con todo sea mucho más fácil), así que ve a tu 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 tanto para mí como para el servidor web:
sudo find . -type f -exec chmod 664 {} ; sudo find . -type d -exec chmod 775 {} ;
Luego, otorgue al servidor web los derechos para leer y escribir en el almacenamiento y la 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 necesite cargar o escribir también (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 razones obvias 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 ceder 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, debe 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: Más frecuentemente groupName
es www-data
pero en su caso, reemplácelo con _www
Nos hemos encontrado con muchos casos extremos al configurar permisos para aplicaciones de Laravel. Creamos una cuenta de usuario separada (deploy
) para poseer la carpeta de la aplicación Laravel y ejecutar comandos de Laravel desde la CLI, y ejecutar el servidor web en 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, lo que obviamente evita que el otro usuario escriba en él en el futuro.
Descubrí que la única solución sana y segura es usar ACL de Linux. El objetivo de esta solución es:
- Para permitirle al usuario que posee / implementa la aplicación 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 acceso de escritura. - Para evitar que otros usuarios accedan al código / datos de la aplicación Laravel.
- Para permitir tanto el
www-data
usuario y el usuario de la aplicación (deploy
) acceso de escritura a la carpeta de almacenamiento, independientemente de qué usuario sea el 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 del
application/
carpeta se crean con la umask predeterminada de0022
, lo que da como resultado carpetas condrwxr-xr-x
permisos y archivos que tienen-rw-r--r--
. -
sudo chown -R deploy:deploy application/
(o simplemente implemente su aplicación comodeploy
usuario, que es lo que hacemos). -
chgrp www-data application/
para dar elwww-data
acceso de grupo a la aplicación. -
chmod 750 application/
para permitir eldeploy
el usuario lee / escribe, 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.