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的缓存文件。
通过将artisan命令作为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数据访问级别,因此不会丢失任何内容(尽管这不是公认的与安全性有关的最佳态度)。因此,在生产中它是相对安全的,而在单用户开发计算机上,这不是问题。
最终,因为您的用户位于www-data组中,并且包含这些文件的所有目录都是g + s(该文件始终在父目录的组下创建),所以用户或www-data创建的任何内容都将为r / w为另一个。
这就是这里的目标。
编辑
在进一步研究上述方法来设置权限时,它看起来仍然足够好,但是一些调整可以帮助您:
默认情况下,目录为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
根据官方Laravel安装指南的建议,允许网络服务器创建services.json和Compiled.php。设置组粘性位意味着创建者将拥有一组www数据。
find storage -type d -exec sudo chmod 2775 {} \;
find storage -type f -exec sudo chmod 664 {} \;
sudo chgrp -R www-data storage
我们对存储文件夹执行相同的操作,以允许创建缓存,日志,会话和视图文件。我们使用find显式设置目录和文件的目录权限。我们不需要在引导程序/缓存中执行此操作,因为其中(通常)没有任何子目录。
您可能需要重新应用任何可执行标志,并删除vendor / *并重新安装composer依赖项才能重新创建phpunit等的链接,例如:
chmod +x .git/hooks/*
rm vendor/*
composer install -o
而已。除了上面为Apache解释的umask之外,这是所有必需的,而不会使整个projectroot可被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
777
自由太多了,因为它包含了所有人的所有权限。