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
This will force Apache to create files as 664 by default. In itself, this can present a security risk. However, on the Laravel environments mostly being discussed here (Homestead, Vagrant, Ubuntu) the web server runs as user www-data under group www-data. So if you do not arbitrarily allow users to join www-data group, there should be no additional risk. If someone manages to break out of the webserver, they have www-data access level anyway so nothing is lost (though that's not the best attitude to have relating to security admittedly). So on production it's relatively safe, and on a single-user development machine, it's just not an issue.
最终,由于您的用户在www-data组中,并且包含这些文件的所有目录都是g+s(文件总是在父目录的组下创建),用户或www-data创建的任何内容都将是r/w。
这就是我们的目的。
edit
在进一步研究上述设置权限的方法时,它看起来仍然足够好,但一些调整可以有所帮助:
默认情况下,目录是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运行的入侵者具有更有限的写访问权限。
最后编辑
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