Rob*_*bok 186 php apache file-permissions laravel laravel-5
我正在使用拥有所有者的Apache Web Server _www:_www.我永远不知道文件权限的最佳做法是什么,例如当我创建新的Laravel 5项目时.
Laravel 5要求/storage文件夹可写.我找到了许多不同的方法来使它工作,我通常最终以777递归方式使用chmod.我知道这不是最好的主意.
官方文件说:
Laravel可能需要配置一些权限:Web服务器中的文件夹,
storage并vendor要求Web服务器进行写访问.
这是否意味着Web服务器本身也需要访问storage和vendor文件夹本身或仅需要访问其当前内容?
我认为更好的是改变所有者而不是权限.我递归地更改了所有Laravel的文件权限_www:_www,这使得网站正常工作,就像我将chmod更改为777.问题是,现在我的文本编辑器每次要保存任何文件时都要求我输入密码,如果我尝试在Finder中更改任何内容,就会发生同样的情况,例如复制文件.
解决这些问题的正确方法是什么?
chmodsudobgi*_*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
现在,您是安全的,您的网站是有效的,您可以非常轻松地使用这些文件
Bas*_*MHL 40
出于明显的安全原因,storage和vendor文件夹的权限应保持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
Chr*_*rdt 16
在为Laravel应用程序设置权限时,我们遇到了许多边缘情况.我们创建一个单独的用户帐户(deploy),用于拥有Laravel应用程序文件夹并从CLI执行Laravel命令,然后运行Web服务器www-data.这导致的一个问题是日志文件可能由www-data或者拥有deploy,这取决于谁首先写入日志文件,显然阻止其他用户将来写入日志文件.
我发现唯一合理且安全的解决方案是使用Linux ACL.该解决方案的目标是:
deploy).www-data用户读取对Laravel应用程序代码的访问权限,但不允许写入访问权限.www-data用户和应用程序的用户(deploy)写访问存储文件夹,而不管哪个用户拥有该文件(以便既deploy和www-data可以写入例如相同的日志文件).我们完成如下:
application/夹中的所有文件都使用默认的umask创建0022,这会导致文件夹具有drwxr-xr-x权限和文件-rw-r--r--.sudo chown -R deploy:deploy application/(或者只是将您的应用程序部署为deploy用户,这就是我们的工作).chgrp www-data application/授予www-data组访问应用程序的权限.chmod 750 application/允许deploy用户读/写,www-data用户只读,并删除任何其他用户的所有权限.setfacl -Rdm u:www-data:rwx,u:deploy:rwx application/storage/设置storage/文件夹和所有子文件夹的默认权限.在存储文件夹中创建的任何新文件夹/文件都将继承这些权限(rwx对于这两者www-data和deploy).setfacl -Rm u:www-data:rwX,u:deploy:rwX application/storage/ 在任何现有文件/文件夹上设置上述权限.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)
它能做什么:
注意:也许您不能或不需要使用 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
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)
添加到 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
小智 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)
安装Laravel之后,您可能需要配置一些权限。内的目录
storage和bootstrap/cache目录应该是可写的Web服务器或Laravel将无法运行。如果您正在使用Homestead虚拟机,则应该已经设置了这些权限。
此页面上有很多答案提到使用777权限。不要那样做 您可能会将自己暴露给黑客。
相反,请遵循其他人关于如何设置755(或更严格)的权限的建议。您可能需要通过whoami在终端中运行来确定您的应用正在运行的用户,然后使用来更改某些目录的所有权chown -R。
sudo其他答案,则需要...您的服务器可能是共享主机,例如Cloudways。
(就我而言,我已经将Laravel应用程序克隆到了我的第二个Cloudways服务器中,并且由于storage和bootstrap/cache目录的权限被弄乱了,因此无法完全正常工作。)
我需要使用:
Cloudways Platform > Server > Application Settings > Reset Permission
然后我可以php artisan cache:clear在终端上运行。
| 归档时间: |
|
| 查看次数: |
246502 次 |
| 最近记录: |