如何为Laravel设置文件权限?

我使用的Apache Web服务器的所有者设置为_www:_www。我从来不知道文件权限的最佳实践是什么,例如当我创建新的Laravel 5项目时。

Laravel 5要求/storage文件夹是可写的。我发现了很多不同的方法来使它工作,我通常以递归地使它777 chmod结束。但我知道这不是个好主意。

官方医生说:

Laravel可能需要一些权限来配置:文件夹内 storagevendor需要web服务器的写访问

这是否意味着web服务器也需要访问storagevendor文件夹本身,还是只访问它们的当前内容?

我认为更好的是改变老板而不是权限。我将所有Laravel的文件权限递归地更改为_www:_www,这使得网站正常工作,就像我将chmod更改为777一样。问题是,现在每次我想保存任何文件时,我的文本编辑器都会要求我输入密码,如果我试图在Finder中更改任何内容,比如复制一个文件,也会发生同样的情况。

解决这些问题的正确方法是什么?

  1. 改变chmod
  2. 修改文件的所有者以匹配 web服务器,也许设置文本编辑器(和Finder?)跳过 询问密码,或者让他们使用sudo
  3. 更改web服务器的所有者以匹配操作系统用户(我没有 知道后果)
  4. 其他的东西
626285 次浏览

更改项目文件夹的权限,为拥有该目录的组中的任何用户(在你的例子中是_www)启用读/写/exec:

chmod -R 775 /path/to/your/project

然后将你的OS X用户名添加到_www组,以允许它访问目录:

sudo dseditgroup -o edit -a yourusername -t user _www

出于明显的安全原因,storagevendor文件夹的权限应该保持在775

但是,您的计算机和服务器Apache都需要能够在这些文件夹中进行写操作。例如:当你运行像php artisan这样的命令时,你的计算机需要在storage中写入日志文件。

你所需要做的就是把文件夹的所有权交给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

然后你需要将你的用户(由它的username引用)添加到服务器Apache所属的组中。像这样:

sudo usermod -a -G www-data userName

注意:大多数情况下,组名是www-data,但在您的情况下,将其替换为_www

对于观看这个讨论的人来说,这是显而易见的....如果你给你的任何文件夹777权限,你就允许任何人读、写和执行....目录下的任何文件这意味着你给了任何人(任何黑客或恶意的人在整个世界)上传任何文件,病毒或任何其他文件的权限,然后执行该文件…

如果你将你的文件夹权限设置为777,你已经打开了你的文件夹权限 任何能找到该目录的人的服务器。够清楚? ?:) < / p >

设置所有权和权限基本上有两种方法。要么你给自己所有权,要么你让web服务器成为所有文件的所有者。

web服务器作为所有者(大多数人这样做,以及Laravel文档的方式):

假设www-data(它可能是其他东西)是您的web服务器用户。

sudo chown -R www-data:www-data /path/to/your/laravel/root/directory

if you do that, the webserver owns all the files, and is also the group, and you will have some problems uploading files or working with files via FTP, because your FTP client will be logged in as you, not your webserver, so add your user to the webserver user group:

sudo usermod -a -G www-data ubuntu

当然,这是假设你的服务器运行为www-data (Homestead默认),你的用户是ubuntu(如果你使用Homestead,它是流浪者)。

然后你把所有的目录设置为755,文件设置为644… 设置文件权限

sudo find /path/to/your/laravel/root/directory -type f -exec chmod 644 {} \;    

SET directory permissions

sudo find /path/to/your/laravel/root/directory -type d -exec chmod 755 {} \;

用户作为所有者

我更喜欢拥有所有的目录和文件(这让工作变得更容易),所以,去你的laravel根目录:

cd /var/www/html/laravel >> assuming this is your current root directory
sudo chown -R $USER:www-data .

Then I give both myself and the webserver permissions:

sudo find . -type f -exec chmod 664 {} \;
sudo find . -type d -exec chmod 775 {} \;

然后给web服务器读写存储和缓存的权限

无论你用哪种方式设置它,你都需要给web服务器读写权限,用于存储,缓存和任何其他web服务器需要上传或写入的目录(取决于你的情况),所以运行上面bashy的命令:

sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache

现在,你是安全的,你的网站工作,你可以相当容易地处理文件

如前所述

你所需要做的就是把文件夹的所有权交给Apache:

但是我为乔恩命令添加了- r: sudo chown -R www-data:www-data /path/to/your/project/vendor sudo chown -R www-data:www-data /path/to/your/project/storage < /代码> < / p >

bgles发布的解决方案在最初正确设置权限方面对我来说是正确的(我使用第二种方法),但它对Laravel仍然有潜在的问题。

默认情况下,Apache将创建具有644权限的文件。所以这几乎是存储中的任何东西/。所以,如果你删除了存储/框架/视图的内容,然后通过Apache访问一个页面,你会发现缓存的视图已经创建了,就像:

-rw-r--r-- 1 www-data www-data 1005 Dec  6 09:40 969370d7664df9c5206b90cd7c2c79c2

如果你运行"artisan serve"并访问不同的页面,你将获得不同的权限,因为CLI PHP的行为与Apache不同:

-rw-rw-r-- 1 user     www-data 16191 Dec  6 09:48 2a1683fac0674d6f8b0b54cbc8579f8e

就其本身而言,这没什么大不了的,因为你不会在生产中做这些事情。但是如果Apache创建了一个需要用户写入的文件,它就会失败。而这个可以应用于缓存文件,缓存视图和日志时,使用登录用户和工匠部署。一个简单的例子是“artisan cache:clear”,它将无法删除任何www-data:www-data 644的缓存文件。

这可以部分缓解通过运行手工命令作为www-data,所以你会做/脚本的一切:

sudo -u www-data php artisan cache:clear

或者你可以避免这样做的乏味,并将其添加到你的.bash_aliases:

alias art='sudo -u www-data php artisan'

这已经足够好了,并且不会以任何方式影响安全性。但是在开发机器上,运行测试和卫生脚本会让这个操作变得很麻烦,除非你想设置别名来使用'sudo -u www-data'来运行phpunit和其他任何你检查构建时可能会导致文件创建的东西。

解决方案是遵循bgles建议的第二部分,并在/etc/apache2/envvars中添加以下内容,并重新启动(不重新加载)Apache:

umask 002

这将强制Apache默认创建664文件。就其本身而言,这可能会带来安全风险。然而,在这里主要讨论的Laravel环境(Homestead, Vagrant, Ubuntu)中,web服务器以www-data组下的用户www-data运行。因此,如果您不随意地允许用户加入www-data组,应该不会有额外的风险。如果有人设法突破了web服务器,他们有www-data访问级别,所以没有任何损失(虽然这不是最好的态度,必须承认与安全有关)。因此,在生产环境中,这是相对安全的,而在单用户开发机器上,这不是问题。

最终,由于您的用户在www-data组中,并且包含这些文件的所有目录都是g+s(文件总是在父目录的组下创建),用户或www-data创建的任何内容都将是r/w。

这就是我们的目的。

< em >编辑< / em >

在进一步研究上述设置权限的方法时,它看起来仍然足够好,但一些调整可以有所帮助:

默认情况下,目录是775,文件是664,所有文件的所有者和组都是刚刚安装框架的用户。假设我们从这一点开始。

cd /var/www/projectroot
sudo chmod 750 ./
sudo chgrp www-data ./

我们要做的第一件事是阻止其他所有人的访问,并使组为www-data。只有www-data的所有者和成员才能访问该目录。

sudo chmod 2775 bootstrap/cache
sudo chgrp -R www-data bootstrap/cache

允许web服务器创建服务。如官方Laravel安装指南所建议的那样。设置组粘性位意味着这些将由创建者拥有一组www-data。

find storage -type d -exec sudo chmod 2775 {} \;
find storage -type f -exec sudo chmod 664 {} \;
sudo chgrp -R www-data storage

我们对存储文件夹做同样的事情,以允许创建缓存、日志、会话和视图文件。我们使用find显式地为目录和文件设置不同的目录权限。我们不需要在bootstrap/cache中这样做,因为(通常)那里没有任何子目录。

你可能需要重新应用任何可执行标志,删除vendor/*并重新安装composer依赖来为phpunit等重新创建链接,例如:

chmod +x .git/hooks/*
rm vendor/*
composer install -o

就是这样。除了上面解释的Apache的umask,这是所有需要的,而不是使整个项目根可被www-data写入,这是在其他解决方案中发生的事情。因此,这种方式稍微安全一些,因为作为www-data运行的入侵者具有更有限的写访问权限。

< em >结束编辑< / em >

Systemd的变化

这适用于php-fpm的使用,但也可能适用于其他应用。

标准的systemd服务需要被覆盖,在override.conf文件中设置umask,并重新启动服务:

sudo systemctl edit php7.0-fpm.service
Use:
[Service]
UMask=0002
Then:
sudo systemctl daemon-reload
sudo systemctl restart php7.0-fpm.service

在为Laravel应用程序设置权限时,我们遇到了许多边缘情况。我们创建了一个单独的用户帐户(deploy),用于拥有Laravel应用程序文件夹并从CLI执行Laravel命令,并在www-data下运行web服务器。这导致的一个问题是,日志文件可能由www-datadeploy拥有,这取决于谁先写入日志文件,显然阻止了其他用户将来写入它。

我发现唯一明智而安全的解决方案是使用Linux acl。这个解决方案的目标是:

  1. 允许拥有/部署应用程序的用户对Laravel应用程序代码进行读写访问(我们使用名为deploy的用户)。
  2. 允许www-data用户读访问Laravel应用程序代码,但不允许写访问。
  3. 防止任何其他用户访问Laravel应用程序代码/数据。
  4. 允许www-data用户和应用程序用户(deploy)对存储文件夹进行写访问,而不管哪个用户拥有该文件(例如,deploywww-data都可以写入同一个日志文件)。

我们做到了以下几点:

  1. application/文件夹中的所有文件都是用默认的umask 0022创建的,这导致文件夹具有drwxr-xr-x权限,文件具有-rw-r--r--权限。
  2. sudo chown -R deploy:deploy application/(或者简单地将应用程序部署为deploy用户,这就是我们所做的)。
  3. chgrp www-data application/使www-data组能够访问应用程序。
  4. chmod 750 application/允许deploy用户读/写,www-data用户只读,并删除任何其他用户的所有权限。
  5. setfacl -Rdm u:www-data:rwx,u:deploy:rwx application/storage/设置storage/文件夹和所有子文件夹的默认权限。在存储文件夹中创建的任何新文件夹/文件将继承这些权限(www-datadeploy均为rwx)。
  6. setfacl -Rm u:www-data:rwX,u:deploy:rwX application/storage/在任何现有的文件/文件夹上设置上述权限。

这是在2017年编写的,大约版本5.1~5.2。在Laravel的后续版本中使用此功能之前,请先了解一些常识。

我决定编写自己的脚本,以减轻建立项目的痛苦。

在项目根目录中运行以下命令:

wget -qO- https://raw.githubusercontent.com/defaye/bootstrap-laravel/master/bootstrap.sh | sh

等待引导完成,然后就可以开始了。

回顾剧本在使用之前。

Laravel 5.4文档表示:

安装Laravel后,您可能需要配置一些权限。 storagebootstrap/cache目录中的目录 你的web服务器应该可以写,否则Laravel将无法运行。如果你 正在使用Homestead虚拟机,这些权限应该

本页有很多答案提到使用777权限。对黑客来说,你就是暴露自己

相反,请遵循其他人关于如何将权限设置为755(或更严格的权限)的建议。你可能需要通过在终端中运行whoami来确定应用程序以哪个用户的身份运行,然后使用chown -R更改某些目录的所有权。

这对我来说很管用:

cd /code/laravel_project
php artisan cache:clear
php artisan config:clear
sudo service php7.4-fpm stop
sudo service nginx stop


sudo chown -R $USER:www-data storage
sudo chown -R $USER:www-data bootstrap/cache
chmod -R 775 storage
chmod -R 755 bootstrap/cache
sudo service php7.4-fpm start && sudo service nginx start




灵感来自https://stackoverflow.com/a/45673457/470749


如果你没有权限使用sudo,因为许多其他答案需要…

您的服务器可能是一个共享主机,例如Cloudways。

(在我的例子中,我已经将我的Laravel应用程序克隆到我的第二台Cloudways服务器上,它并没有完全工作,因为storagebootstrap/cache目录的权限被打乱了。)

我需要使用:

Cloudways Platform > Server > Application Settings > Reset Permission

然后我可以在终端中运行php artisan cache:clear

大多数文件夹应该是正常的“755”,文件应该是“644”

Laravel要求一些文件夹对web服务器用户是可写的。该命令适用于unix操作系统。

sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache

我已经在EC2实例上安装了laravel,花了3天时间来修复权限错误,最终修复了它。 所以我想和其他人分享这段经历

    <李> < p >用户问题 当我登录ec2实例时,我的用户名是ec2-user,用户组是ec2-user。 并且网站工作在httpd用户:apache: apache下 所以我们应该为apache设置权限

  1. 文件夹和文件权限 A.文件夹结构 首先,您应该确保在storage

    下有这样的文件夹结构

    存储

      <李>框架
      • 缓存
      • 会话
      • 的观点
      • 李< / ul > < / > <李>日志 文件夹结构可以根据您使用的laravel版本而有所不同。 我的laravel版本是5.2,你可以根据你的版本找到合适的结构 李< / ul > < / >
< p > B。许可 首先,我看到了在存储下设置777以删除file_put_contents的说明:failed to open stream错误。 所以我设置权限777到存储 chmod -R 777 storage 但是这个错误并没有被修复。 在这里,您应该考虑一个问题:谁将文件写入存储/会话和视图。 这不是ec2-user,而是apache。 是的,对的。 “apache”用户将文件(会话文件、编译后的视图文件)写入会话和视图文件夹。 所以你应该给apache写权限到这些文件夹。 默认情况下:SELinux说/var/www文件夹应该是apache守护程序只读的 因此,我们可以将selinux设置为0: setenforce 0 < / p > 这可以暂时解决问题,但这会使mysql无法工作。 这不是很好的解

你可以用以下方法设置一个读写上下文到存储文件夹(记得setenforce 1来测试它)

chcon -Rt httpd_sys_content_rw_t storage/

这样你的问题就解决了。

  1. 别忘了这个 作曲家更新 PHP工匠缓存:清除

    这些命令将在之后或之前使用。

    我希望你节省时间。 祝你好运。李Hacken < / p > < / >
我找到了一个更好的解决方案。 这是因为php默认以另一个用户运行

所以要解决这个问题

sudo nano /etc/php/7.0/fpm/pool.d/www.conf

然后编辑 用户= "把拥有目录的用户" Group = "put拥有目录的用户" < /代码> < / p >

然后:

sudo systemctl reload php7.0-fpm

添加到composer.json

"scripts": {
"post-install-cmd": [
"chgrp -R www-data storage bootstrap/cache",
"chmod -R ug+rwx storage bootstrap/cache"
]
}

composer install

我有以下配置:

  • NGINX(运行用户:nginx)
  • PHP-FPM

并正确应用权限@bgies建议在接受的答案。在我的情况下,问题是php-fpm的配置运行用户和组最初是apache

如果你使用NGINX和php-fpm,你应该打开php-fpm的配置文件:

nano /etc/php-fpm.d/www.config

并将usergroup选项的值替换为一个NGINX配置的工作;在我的例子中,两者都是nginx:

< p > <代码>… ; Unix用户/进程组 ; 备注:非必选用户。如果未设置组,则默认用户组 ;将被使用。 ; RPM: apache选择能够以httpd的方式访问某些目录 User = nginx ; RPM:在日志目录下保留一个允许写入的组。 Group = nginx ... < /代码> < / p >

保存并重新启动nginx和php-fpm服务。

对于Laravel开发人员来说,目录问题可能有点痛苦。在我的应用程序中,我正在动态地创建目录,并成功地将文件移动到本地环境中的这个目录中。然后在服务器上,我得到错误,而移动文件到新创建的目录。

以下是我所做的事情,并在最后获得了成功的结果。

    <李> sudo find /path/to/your/laravel/root/directory -type f -exec chmod 664 {} \; < br > 李sudo find /path/to/your/laravel/root/directory -type d -exec chmod 775 {} \; < / >
  1. chcon -Rt httpd_sys_content_rw_t /path/to/my/file/upload/directory/in/laravel/project/
  2. 在动态创建新目录时,我使用了命令mkdir($save_path, 0755, true);

在生产服务器上进行这些更改后,我成功地创建了新目录并将文件移动到其中。

最后,如果你在Laravel中使用File facade,你可以这样做: File::makeDirectory($save_path, 0755, true); < / p >

这招对我很管用:

cd [..LARAVEL PROJECT ROOT]
sudo find . -type f -exec chmod 644 {} \;
sudo find . -type d -exec chmod 755 {} \;
sudo chmod -R 777 ./storage
sudo chmod -R 777 ./bootstrap/cache/

只有当你使用npm (VUE,编译SASS等)时,才添加这个:

sudo chmod -R 777 ./node_modules/

它的作用:

  • 将所有文件权限更改为644
  • 将所有文件夹权限更改为755
  • 对于存储和引导缓存(laravel用于创建和执行文件的特殊文件夹,外部不可用),将内部所有内容的权限设置为777
  • 对于nodeJS可执行文件,与上面相同

注意:也许你不能,或者不需要,用sudo做前缀。这取决于你的用户权限、组等等。

我会这样做:

sudo chown -R $USER:www-data laravel-project/


find laravel-project/ -type f -exec chmod 664 {} \;


find laravel-project/ -type d -exec chmod 775 {} \;

最后,你需要给webserver修改storagebootstrap/cache目录的权限:

sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache
sudo chown -R $USER:www-data your_directory_name_under_storage_app

它将给予服务器用户所需的权限&服务器用于文件访问。

Mac OS Big Sur

  1. 在我的情况下,artisan无法访问
    /var/www/{project_name}/storage
    在/logs文件夹中创建文件 所以我必须手动去

    . /var,并创建Laravel需要做符号链接的文件夹结构
  2. 增加文件夹访问权限 sudo chgrp -R $USER /var/www/project_name < / p >

  3. 那么我可以使用 php artisan storage:link没有任何问题。

如果在某些文件中有一些代码更改,然后又有一些权限更改,那么设置正确的权限并再次提交可能比尝试选择权限更改的文件更容易。

.

.

我还遵循了将user作为所有者的方法,并且user是www-data的成员。

我的命令顺序有点不同:

cd /var/www/html/laravel-project-root
sudo chown -R $USER:www-data .


sudo find . -type f -exec chmod 664 {} \;
sudo find . -type d -exec chmod 775 {} \;


sudo find . -type d -exec chmod g+s {} \;  <----- NOTE THIS


sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache

请注意这个答案的特殊性:我是唯一一个(在这里)给每个文件夹添加组位的人。通过这种方式,如果某人或某物创建了一个新的子文件夹,它自动具有www-data作为组

这发生在我们被迫部署一些用户域文件时,使用ftp预加载,因此新的子文件夹文件夹总是属于www-data组,即使是由ftp客户端创建的

还要注意

sudo chgrp -R www-data storage bootstrap/cache >

如果执行列表中的所有命令,则不需要。但如果你想修复一个ftp部署,例如,你没有执行第二行,所以这是需要的。

我已经使用这个代码片段3年多了。


laravel new demo


cd demo


sudo find ./ -type f -exec chmod 664 {} \;
sudo find ./  -type d -exec chmod 775 {} \;


sudo chgrp -Rf www-data storage bootstrap/cache
sudo chmod -Rf ug+rwx storage bootstrap/cache
sudo chmod -Rf 775 storage/ bootstrap/


php artisan storage:link


@realtebo的推荐看起来不错。我会试试的。

sudo find . -type d -exec chmod g+s {} \;  <----- NOTE THIS