Estoy usando el servidor web Apache que tiene configurado el propietario _www:_www
. Nunca sé cuál es la mejor práctica con los permisos de archivos, por ejemplo, cuando creo un nuevo proyecto de Laravel 5.
Laravel 5 requiere que la /storage
carpeta se pueda escribir. Encontré muchos enfoques diferentes para que funcione y generalmente termino haciéndolo 777
chmod de forma recursiva. Sin embargo, sé que no es la mejor idea.
El documento oficial dice:
Laravel puede requerir que se configuren algunos permisos: carpetas dentro
storage
yvendor
requiere acceso de escritura por parte del servidor web.
¿Significa que el servidor web también necesita acceso a las carpetas storage
y a vendor
ellos mismos o solo a sus contenidos actuales?
Supongo que lo que es mucho mejor es cambiar el propietario en lugar de los permisos. Cambié todos los permisos de archivos de Laravel de forma recursiva _www:_www
y eso hizo que el sitio funcionara correctamente, como si cambiara a chmod 777
. El problema es que ahora mi editor de texto me pide una contraseña cada vez que quiero guardar un archivo y ocurre lo mismo si intento cambiar algo en Finder, como por ejemplo copiar un archivo.
¿Cuál es el enfoque correcto para resolver estos problemas?
- Cambio
chmod
- Cambie el propietario de los archivos para que coincida con los del servidor web y quizás configure el editor de texto (¿y Finder?) Para omitir la solicitud de contraseña o hacer que usen
sudo
- Cambie el propietario del servidor web para que coincida con el usuario del sistema operativo (no sé las consecuencias)
- Algo más
777
es demasiada libertad, porque incluye todos los permisos para todos.storage
y losbootstrap/cache
directorios deben ser editables por su servidor webRespuestas:
Solo para decir lo obvio para cualquiera que esté viendo esta discusión ... si le das permiso a cualquiera de tus carpetas 777, estás permitiendo que CUALQUIERA lea, escriba y ejecute cualquier archivo en ese directorio ... lo que esto significa es que has dado CUALQUIERA (cualquier hacker o persona malintencionada en todo el mundo) tiene permiso para cargar CUALQUIER archivo, virus o cualquier otro archivo, y ENTONCES ejecutar ese archivo ...
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 (la forma en que la mayoría de la gente lo hace, y la forma del documento de Laravel)
suponiendo que www-data (podría ser otra cosa) es su usuario de servidor web.
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 se registrará como usted, no como su servidor web, así que agregue su usuario al grupo de usuarios del servidor web:
Por supuesto, esto supone que su servidor web se está ejecutando como www-data (el valor predeterminado de Homestead), y su usuario es ubuntu (es vagabundo si está utilizando Homestead).
Luego establece todos sus directorios en 755 y sus archivos en 644 ... SET permisos de archivo
SET permisos de directorio
Tu usuario como propietario
Prefiero poseer todos los directorios y archivos (hace que trabajar con todo sea mucho más fácil), así que hago:
Luego me doy permisos a mí mismo y al servidor web:
Luego, otorgue al servidor web los derechos para leer y escribir en el almacenamiento y el caché
De cualquier forma 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 (según su situación), así que ejecute los comandos de bashy arriba:
Ahora, estás seguro y tu sitio web funciona, Y puedes trabajar con los archivos con bastante facilidad.
fuente
anyone
concepto. Laanyone
bandera de Linux significa cualquier usuario , no cualquier persona. Aún necesita acceso al servidor.write
permiso al grupo?Los permisos para las carpetas
storage
yvendor
deben permanecer en775
, 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 registrostorage
.Todo lo que necesita hacer es ceder la propiedad de las carpetas a Apache:
Luego debe agregar su computadora (referenciada por ella
username
) al grupo al que pertenece el servidor Apache. Al igual que :NOTA: Con mayor frecuencia,
groupName
eswww-data
pero en su caso, sustituirlo por_www
fuente
chown
comandos deberían incluir la bandera -R. Además, en laravel 5.1 y 5.2, en lugar del directorio de proveedores, debe dar acceso al directorio bootstrap / cache.Nos hemos encontrado con muchos casos extremos cuando configuramos permisos para aplicaciones Laravel. Creamos una cuenta de usuario separada (
deploy
) para poseer la carpeta de la aplicación Laravel y ejecutar comandos Laravel desde la CLI, y ejecutamos el servidor web bajowww-data
. Un problema que esto causa es que el (los) archivo (s) de registro pueden ser propiedad de ,www-data
odeploy
dependiendo de quién escribió primero en el archivo de registro, obviamente evitando que el otro usuario lo escriba en el futuro.Descubrí que la única solución sana y segura es usar ACL de Linux. El objetivo de esta solución es:
deploy
).www-data
usuario acceso de lectura al código de la aplicación Laravel, pero no acceso de escritura.www-data
usuario y el usuario de la aplicación (deploy
acceso de escritura) a la carpeta de almacenamiento, independientemente del usuario que posee el archivo (por lo tantodeploy
ywww-data
se puede escribir en el mismo archivo de registro, por ejemplo).Logramos esto de la siguiente manera:
application/
carpeta se crean con la umask predeterminada de0022
, lo que da como resultado que las carpetas tengandrwxr-xr-x
permisos y los archivos tengan-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 darwww-data
acceso al grupo a la aplicación.chmod 750 application/
para permitir aldeploy
usuario leer / escribir, elwww-data
usuario de solo lectura y 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 lastorage/
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.fuente
Cambie los permisos para la carpeta de su proyecto para habilitar la lectura / escritura / ejecución para cualquier usuario dentro del grupo propietario del directorio (que en su caso es
_www
):Luego agregue su nombre de usuario OS X al
_www
grupo para permitirle acceder al directorio:fuente
dseditgroup
proporcionada por usted, estoy recibiendo un error:Username and password must be provided.
.sudo
al principio._www:_www
aomyuser:_www
también?_www:_www
, porque 775 significa que cualquier usuario del grupo_www
tendrá permisos completos para leer / escribir / ejecutar en esa carpeta, y acaba de agregar su nombre de usuario a ese grupo.chown myuser:_www
? Sé que el primero es el usuario y el segundo es el grupo, pero ¿significa "este usuario Y CUALQUIERA DE ESTE grupo" o "este usuario PERO SÓLO SI PERTENECE A ESTE grupo"?Como ya publicado
pero agregué -R para el comando chown :
sudo chown -R www-data:www-data /path/to/your/project/vendor sudo chown -R www-data:www-data /path/to/your/project/storage
fuente
La mayoría de las carpetas deben ser normales "755" y archivos, "644"
Laravel requiere que algunas carpetas sean grabables para el usuario del servidor web. Puede usar este comando en sistemas operativos basados en Unix.
fuente
Después
composer install
fuente
Los documentos de Laravel 5.4 dicen:
Hay muchas respuestas en esta página que mencionan el uso de
777
permisos. No hagas eso. Te expondrías a los hackers.En su lugar, siga las sugerencias de otros sobre cómo establecer permisos de 755 (o más restrictivos). Es posible que deba averiguar a qué usuario se está ejecutando su aplicación al ejecutar
whoami
en el terminal y luego cambiar la propiedad de ciertos directorios usandochown -R
.Si no tiene permiso para usarlo,
sudo
ya que muchas otras respuestas requieren ...Su servidor es probablemente un host compartido como Cloudways.
(En mi caso, había clonado mi aplicación Laravel en un segundo servidor mío de Cloudways, y no funcionaba completamente porque los permisos de los directorios
storage
ybootstrap/cache
estaban en mal estado).Necesitaba usar:
Cloudways Platform > Server > Application Settings > Reset Permission
Entonces podría correr
php artisan cache:clear
en la terminal.fuente
La solución publicada por bgles es perfecta para mí en términos de establecer correctamente los permisos inicialmente (uso el segundo método), pero aún tiene problemas potenciales para Laravel.
Por defecto, Apache creará archivos con 644 permisos. Así que eso es prácticamente cualquier cosa en el almacenamiento. Entonces, si elimina el contenido de almacenamiento / marco / vistas, luego acceda a una página a través de Apache, encontrará que la vista en caché se ha creado como:
Si ejecuta "servicio artesanal" y accede a una página diferente, obtendrá permisos diferentes porque CLI PHP se comporta de manera diferente a Apache:
En sí mismo, esto no es gran cosa, ya que no harás nada de esto en producción. Pero si Apache crea un archivo que posteriormente debe ser escrito por el usuario, fallará. Y esto puede aplicarse a los archivos de caché, las vistas en caché y los registros cuando se implementa utilizando un usuario y un artesano conectados. Un ejemplo fácil es "caché artesanal: claro" que no podrá eliminar los archivos de caché que son www-data: www-data 644.
Esto se puede mitigar parcialmente mediante la ejecución de comandos artesanales como www-data, por lo que estará haciendo / scripting todo como:
O evitará el tedio de esto y agregará esto a sus .bash_aliases:
Esto es lo suficientemente bueno y no afecta la seguridad de ninguna manera. Pero en las máquinas de desarrollo, ejecutar scripts de prueba y saneamiento hace que esto sea difícil de manejar, a menos que desee configurar alias para usar 'sudo -u www-data' para ejecutar phpunit y todo lo demás con lo que verifica sus compilaciones que podrían crear archivos.
La solución es seguir la segunda parte de los consejos de Bgles y agregar lo siguiente a / etc / apache2 / envvars, y reiniciar (no recargar) Apache:
Esto obligará a Apache a crear archivos como 664 por defecto. En sí mismo, esto puede presentar un riesgo de seguridad. Sin embargo, en los entornos Laravel que se tratan principalmente aquí (Homestead, Vagrant, Ubuntu), el servidor web se ejecuta como usuario www-data en el grupo www-data. Por lo tanto, si no permite arbitrariamente que los usuarios se unan al grupo www-data, no debería haber ningún riesgo adicional. Si alguien logra salir del servidor web, tiene un nivel de acceso a datos www de todos modos, por lo que no se pierde nada (aunque esa no es la mejor actitud para tener que ver con la seguridad). Entonces, en la producción es relativamente seguro, y en una máquina de desarrollo de un solo usuario, simplemente no es un problema.
En última instancia, como su usuario está en el grupo www-data, y todos los directorios que contienen estos archivos son g + s (el archivo siempre se crea bajo el grupo del directorio principal), todo lo creado por el usuario o por www-data será r / w para el otro.
Y ese es el objetivo aquí.
editar
Al investigar el enfoque anterior para establecer más los permisos, todavía se ve lo suficientemente bueno, pero algunos ajustes pueden ayudar:
Por defecto, los directorios son 775 y los archivos son 664 y todos los archivos tienen el propietario y el grupo del usuario que acaba de instalar el marco. Así que supongamos que comenzamos desde ese punto.
Lo primero que hacemos es bloquear el acceso a todos los demás y hacer que el grupo sea www-data. Solo el propietario y los miembros de www-data pueden acceder al directorio.
Para permitir que el servidor web cree services.json y compiled.php, como lo sugiere la guía de instalación oficial de Laravel. Establecer el bit fijo del grupo significa que estos serán propiedad del creador con un grupo de datos www.
Hacemos lo mismo con la carpeta de almacenamiento para permitir la creación de caché, registro, sesión y visualización de archivos. Utilizamos find para establecer explícitamente los permisos de directorio de manera diferente para directorios y archivos. No necesitábamos hacer esto en bootstrap / cache ya que no hay (normalmente) ningún subdirectorio allí.
Es posible que deba volver a aplicar cualquier indicador ejecutable, y eliminar vendor / * y reinstalar las dependencias del compositor para recrear enlaces para phpunit et al, por ejemplo:
Eso es. Excepto por la umask para Apache explicada anteriormente, esto es todo lo que se requiere sin hacer que todo el proyecto sea grabable por www-data, que es lo que sucede con otras soluciones. Por lo tanto, es marginalmente más seguro de esta manera, ya que un intruso que se ejecuta como www-data tiene un acceso de escritura más limitado.
final de edición
Cambios para Systemd
Esto se aplica al uso de php-fpm, pero tal vez otros también.
El servicio systemd estándar debe ser reemplazado, la umask configurada en el archivo override.conf y el servicio reiniciado:
fuente
Esto funcionó para mí:
Que hace:
Nota: Quizás no pueda o no necesite hacerlo con el prefijo sudo. depende de los permisos de su usuario, grupo, etc.
fuente
Decidí escribir mi propio guión para aliviar un poco el dolor de configurar proyectos.
Ejecute lo siguiente dentro de la raíz de su proyecto:
Espera a que se complete el arranque y listo.
Revise el script antes de usarlo.
fuente
He instalado laravel en la instancia EC2 y he pasado 3 días para corregir el error de permiso y finalmente lo solucioné. Por eso quiero compartir esta experiencia con otra.
problema del usuario Cuando inicié sesión en la instancia ec2, mi nombre de usuario es ec2-user y usergroup es ec2-user. Y el sitio web funciona con httpd user: apache: apache, por lo que debemos establecer el permiso para apache.
permiso de carpeta y archivo A. estructura de carpeta primero, debe asegurarse de tener dicha estructura de carpeta como esta en almacenamiento
almacenamiento
B. permiso Al principio, veo las instrucciones para configurar 777 en almacenamiento para eliminar file_put_contents: error al abrir la transmisión de error. Así que configuré el permiso 777 para el almacenamiento chmod -R 777 storage Pero el error no se solucionó. aquí, debe considerar uno: quién escribe archivos en el almacenamiento / sesiones y vistas. Eso no es ec2-user, sino apache. Si claro. El usuario "apache" escribe el archivo (archivo de sesión, archivo de vista compilado) en la carpeta de sesión y vista. Por lo tanto, debe darle a Apache permiso para escribir en esta carpeta Por defecto: SELinux dice que la carpeta / var / www debe ser de solo lectura por el demonio apache.
Entonces, para esto, podemos establecer el selinux como 0: setenforce 0
Esto puede resolver el problema temporalmente, pero esto hace que mysql no funcione. entonces esta no es una buena solución.
Puede establecer un contexto de lectura y escritura en la carpeta de almacenamiento con: (recuerde setenforce 1 para probarlo)
Entonces su problema será solucionado.
y no olvides esta actualización del compositor php artisan cache: clear
Estos comandos serán útiles después o antes.
Espero que te ahorres tiempo. Buena suerte. Hacken
fuente
Tenía la siguiente configuración:
nginx
)Y aplicó los permisos correctamente como @bgies sugirió en la respuesta aceptada. El problema en mi caso fue el usuario y el grupo configurados en ejecución de php-fpm que originalmente
apache
.Si está utilizando NGINX con php-fpm, debe abrir el archivo de configuración de php-fpm:
Y reemplazar
user
ygroup
opciones con un NGINX está configurado para funcionar; en mi caso, ambos fueronnginx
:... ; Unix user/group of processes ; Note: The user is mandatory. If the group is not set, the default user's group ; will be used. ; RPM: apache Choosed to be able to access some dir as httpd user = nginx ; RPM: Keep a group allowed to write in log dir. group = nginx ...
Guárdelo y reinicie los servicios nginx y php-fpm.
fuente
Para los desarrolladores de Laravel, los problemas de directorio pueden ser un poco molestos. En mi aplicación, estaba creando directorios sobre la marcha y moviendo archivos a este directorio en mi entorno local con éxito. Luego, en el servidor, recibía errores al mover archivos al directorio recién creado.
Aquí están las cosas que hice y obtuve un resultado exitoso al final.
sudo find /path/to/your/laravel/root/directory -type f -exec chmod 664 {} \;
sudo find /path/to/your/laravel/root/directory -type d -exec chmod 775 {} \;
chcon -Rt httpd_sys_content_rw_t /path/to/my/file/upload/directory/in/laravel/project/
mkdir($save_path, 0755, true);
Después de hacer esos cambios en el servidor de producción, creé con éxito nuevos directorios y moví archivos a ellos.
Finalmente, si usa File fachada en Laravel, puede hacer algo como esto:
File::makeDirectory($save_path, 0755, true);
fuente
Encontré una solución aún mejor para esto. Se debe a que php se ejecuta como otro usuario de forma predeterminada.
para arreglar esto
sudo nano /etc/php/7.0/fpm/pool.d/www.conf
luego edite el
user = "put user that owns the directories" group = "put user that owns the directories"
luego:
sudo systemctl reload php7.0-fpm
fuente