如何为Laravel 5(和其他人)设置文件权限

Rob*_*bok 186 php apache file-permissions laravel laravel-5

我正在使用拥有所有者的Apache Web Server _www:_www.我永远不知道文件权限的最佳做法是什么,例如当我创建新的Laravel 5项目时.

Laravel 5要求/storage文件夹可写.我找到了许多不同的方法来使它工作,我通常最终以777递归方式使用chmod.我知道这不是最好的主意.

官方文件说:

Laravel可能需要配置一些权限:Web服务器中的文件夹, storagevendor要求Web服务器进行写访问.

这是否意味着Web服务器本身也需要访问storagevendor文件夹本身或仅需要访问其当前内容?

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

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

  1. 更改 chmod
  2. 更改文件的所有者以匹配Web服务器的所有者,并可能将文本编辑器(和Finder?)设置为跳过要求输入密码,或者让它们使用 sudo
  3. 更改Web服务器的所有者以匹配os用户(我不知道后果)
  4. 还有别的

bgi*_*ies 484

只是为任何观看此讨论的人说明显而易见....如果您给予任何文件夹777权限,则允许任何人读取,写入和执行该目录中的任何文件....这意味着您已经给出了任何人(全世界任何黑客或恶意人士)上传任何文件,病毒或任何其他文件的权限,然后执行该文件......

如果您将您的文件许可设置为777,则您已将您的服务器打开给任何可以找到该目录的服务器.足够清楚??? :)

基本上有两种方法来设置您的所有权和权限.要么给自己所有权,要么让网络服务器成为所有文件的所有者.

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

假设www-data(可能是其他东西)是您的网络服务器用户.

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

如果你这样做,网络服务器拥有所有文件,也是组,你将有一些问题上传文件或通过FTP处理文件,因为你的FTP客户端将以你的身份登录,而不是你的网络服务器,所以添加您的用户访问网络服务器用户组:

sudo usermod -a -G www-data ubuntu

当然,这假设您的网络服务器以www-data(Homestead默认值)运行,而您的用户是ubuntu(如果您使用Homestead,它就是流浪者).

然后将所有目录设置为755,将文件设置为644 ... SET文件权限

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

SET目录权限

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

您的用户是所有者

我更喜欢拥有所有目录和文件(这使得更容易处理所有内容),所以我做:

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

然后我给自己和网络服务器权限:

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 {} \;

然后授予Web服务器读取和写入存储和缓存的权限

无论您设置哪种方式,您都需要为Web服务器提供读取和写入权限,以便存储,缓存以及Web服务器需要上载或写入的任何其他目录(具体取决于您的具体情况),因此请运行上面的bashy命令:

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

现在,您是安全的,您的网站是有效的,您可以非常轻松地使用这些文件

  • 我认为人们误解了"任何人"的概念.Linux的"任何人"标志意味着**任何用户**,而不是任何人.您仍需要服务器访问权限. (27认同)
  • 很好的例子,如果没有www-data用户,请使用apache:apache代替www-data(在某些发行版上) (3认同)
  • @ andreshg112第一个www数据是用户的名称,第二个www数据是组的名称。因此,这意味着所有者是apache和(此组)apache。使用www-data:www-data或将您的用户添加到该组。(CLI:useradd -G {group-name} username),然后您可以将其锁定为username:www-group (3认同)
  • 这个答案应该在 Laravel 官方文档中,就在简介部分之后。 (3认同)
  • @fs_tigre我认为安全性没有太大差别...除了我猜有两个用户猜测密码而不是一个,当然我一直用我的用户帐户登录,所以如果我以一种不安全的方式(普通FTP和使用密码)这样做可能会损害网站,但我只使用Putty和SSH登录,当我使用FTP时它是SFTP,所以没有任何问题.建议使用bashy建议的命令,因为它们设置了粘滞位,因此如果您的Web服务器创建子目录,它们将具有与父级相同的所有者/权限 (2认同)
  • 在第一种方法中,用户是否仍然无法上传文件,因为您没有给该组提供"写入"权限? (2认同)
  • 执行`sudo chown -R my-user:www-data /path/to/your/root/directory` 后,`sudo chgrp -R www-data storage bootstrap/cache` 真的有用吗? (2认同)
  • @SaidbakR Laravel 的 chown 应用程序根目录,因为大多数(全部?)Laravel 文件不在公共目录中 (2认同)
  • 不要运行 `sudo find /path/to/your/laravel/root/directory -type f -exec chmod 664 {} \;`!此后您将无法从命令行运行任何命令(例如“vendor/bin/”中的所有命令)!我现在必须弄清楚如何让 Laravel 再次从命令行工作。 (2认同)
  • @Fahmi 也应该是 664,对吧?目前,如果权限设置为 644,我无法通过 FTP 上传文件。这是一个错字吗? (2认同)
  • 我创建了一个 bash shell 脚本,它根据您的回答完成所有工作:https://github.com/marounmelhem/laravel-permissions-fix (2认同)
  • 我有,和你写的一模一样。但此解决方案不涵盖 www-data 创建的新文件(如会话、缓存等)。它生成带有 chmod 644 的文件,这意味着组无法删除该文件。我在使用它部署脚本时遇到问题。无法删除旧文件。 (2认同)

Bas*_*MHL 40

出于明显的安全原因,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
Run Code Online (Sandbox Code Playgroud)

然后,您需要将您的计算机(由它引用username)添加到服务器Apache所属的组.像这样:

sudo usermod -a -G www-data userName
Run Code Online (Sandbox Code Playgroud)

注意:最常见的groupName是,www-data但在您的情况下,请更换它_www

  • +1我喜欢这种方法.但我相信`chown`命令应该包含-R标志.此外,在laravel 5.1和5.2中,您应该访问bootstrap/cache目录,而不是vendor目录. (10认同)

Chr*_*rdt 16

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

我发现唯一合理且安全的解决方案是使用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/文件夹和所有子文件夹的默认权限.在存储文件夹中创建的任何新文件夹/文件都将继承这些权限(rwx对于这两者www-datadeploy).
  6. setfacl -Rm u:www-data:rwX,u:deploy:rwX application/storage/ 在任何现有文件/文件夹上设置上述权限.

  • 这是唯一使用 ACL 的答案,正如作者所说,这也是我发现的设置 Laravel 的唯一“理智且安全”的解决方案。真的很欣赏这个答案。 (3认同)

rea*_*ebo 15

我还遵循以用户为所有者的方式,并且用户是 的成员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
Run Code Online (Sandbox Code Playgroud)

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

当我们被迫部署一些使用 ftp 预加载的用户空间文件时,就会发生这种情况,因此新的子文件夹始终属于 www-data 组,即使是由 ftp 客户端创建的

另请注意,

sudo chgrp -R www-数据存储引导/缓存 >

如果您执行列表中的所有命令,则不需要。但是,例如,如果您想修复 ftp 部署,并且您没有执行第二行,那么就需要这样做。


Luc*_* C. 14

这对我有用:

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/
Run Code Online (Sandbox Code Playgroud)

仅当您使用 npm(VUE、编译 SASS 等)时,添加以下内容:

sudo chmod -R 777 ./node_modules/
Run Code Online (Sandbox Code Playgroud)

它能做什么:

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

注意:也许您不能或不需要使用 sudo 前缀来执行此操作。这取决于您的用户的权限、组等...


Bog*_*dan 13

更改项目文件夹的权限,以便为拥有该目录的组中的任何用户启用读/写/执行(在您的情况下是这样_www):

chmod -R 775 /path/to/your/project
Run Code Online (Sandbox Code Playgroud)

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

sudo dseditgroup -o edit -a yourusername -t user _www
Run Code Online (Sandbox Code Playgroud)


小智 9

已发布

您需要做的就是将文件夹的所有权授予Apache:

但我为chown命令添加了-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

  • 为什么我们必须授予供应商目录的权限?存储有意义,写入日志文件等.但供应商?为什么? (2认同)

mar*_*ite 9

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

默认情况下,Apache 将创建具有 644 权限的文件。所以这几乎是 storage/ 中的任何东西。因此,如果您删除 storage/framework/views 的内容,然后通过 Apache 访问页面,您会发现缓存视图已创建如下:

-rw-r--r-- 1 www-data www-data 1005 Dec  6 09:40 969370d7664df9c5206b90cd7c2c79c2
Run Code Online (Sandbox Code Playgroud)

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

-rw-rw-r-- 1 user     www-data 16191 Dec  6 09:48 2a1683fac0674d6f8b0b54cbc8579f8e
Run Code Online (Sandbox Code Playgroud)

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

这可以通过将 artisan 命令作为 www-data 运行来部分缓解,因此您将执行/编写以下所有内容:

sudo -u www-data php artisan cache:clear
Run Code Online (Sandbox Code Playgroud)

或者您将避免这种乏味的操作并将其添加到您的 .bash_aliases 中:

alias art='sudo -u www-data php artisan'
Run Code Online (Sandbox Code Playgroud)

这已经足够好了,并且不会以任何方式影响安全性。但是在开发机器上,运行测试和卫生脚本会使这变得笨拙,除非您想设置别名以使用“sudo -u www-data”来运行 phpunit 以及您检查构建的所有其他内容,否则可能会导致创建文件。

解决方案是按照 bgles 建议的第二部分,并将以下内容添加到 /etc/apache2/envvars,并重新启动(而不是重新加载)Apache:

umask 002
Run Code Online (Sandbox Code Playgroud)

这将强制 Apache 默认将文件创建为 664。这本身就存在安全风险。但是,在此处主要讨论的 Laravel 环境(Homestead、Vagrant、Ubuntu)上,Web 服务器以 www-data 组下的用户 www-data 运行。所以如果不随意让用户加入www-data组,应该不会有额外的风险。如果有人设法脱离网络服务器,他们无论如何都拥有 www-data 访问级别,因此不会丢失任何内容(尽管这不是与安全相关的最佳态度)。因此,在生产环境中它相对安全,而在单用户开发机器上,这不是问题。

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

这就是这里的目标。

编辑

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

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

cd /var/www/projectroot
sudo chmod 750 ./
sudo chgrp www-data ./
Run Code Online (Sandbox Code Playgroud)

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

sudo chmod 2775 bootstrap/cache
sudo chgrp -R www-data bootstrap/cache
Run Code Online (Sandbox Code Playgroud)

按照官方 Laravel 安装指南的建议,允许 web 服务器创建 services.json 和compiled.php。设置组粘滞位意味着这些将由具有一组 www-data 的创建者拥有。

find storage -type d -exec sudo chmod 2775 {} \;
find storage -type f -exec sudo chmod 664 {} \;
sudo chgrp -R www-data storage
Run Code Online (Sandbox Code Playgroud)

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

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

chmod +x .git/hooks/*
rm vendor/*
composer install -o
Run Code Online (Sandbox Code Playgroud)

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

结束编辑

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
Run Code Online (Sandbox Code Playgroud)


Dav*_*lov 9

添加到 composer.json

"scripts": {
    "post-install-cmd": [
      "chgrp -R www-data storage bootstrap/cache",
      "chmod -R ug+rwx storage bootstrap/cache"
    ]
}
Run Code Online (Sandbox Code Playgroud)

composer install

  • 这是一个糟糕的答案。如果您正确配置了网络服务器,则永远不需要对任何文件夹使用 777。使用 777 为任何黑客打开您的服务器以上传文件,并在他们知道文件夹存在的情况下执行该文件。 (4认同)
  • 好的。你提供什么? (2认同)

小智 7

大多数文件夹应为普通的“ 755”,文件应为“ 644”

Laravel要求Web服务器用户可写一些文件夹。您可以在基于Unix的操作系统上使用此命令。

sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache
Run Code Online (Sandbox Code Playgroud)


Rya*_*yan 6

Laravel 5.4文档说:

安装Laravel之后,您可能需要配置一些权限。内的目录storagebootstrap/cache目录应该是可写的Web服务器或Laravel将无法运行。如果您正在使用Homestead虚拟机,则应该已经设置了这些权限。

此页面上有很多答案提到使用777权限。不要那样做 您可能会将自己暴露给黑客。

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

如果您无权使用sudo其他答案,则需要...

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

(就我而言,我已经将Laravel应用程序克隆到了我的第二个Cloudways服务器中,并且由于storagebootstrap/cache目录的权限被弄乱了,因此无法完全正常工作。)

我需要使用:

Cloudways Platform > Server > Application Settings > Reset Permission

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