使源代码文件可由网络服务器写入是否安全?

Is it secure to make source code files writable by webserver?

提问人:YanDatsiuk 提问时间:9/18/2023 更新时间:9/21/2023 访问量:333

问:

我正在使用一个新的 PHP Laravel 框架安装,我注意到公共目录中所有文件和文件夹的所有权已递归更改为 Web 服务器用户 www-data。下面概述了公用文件夹的文件和所有权:

vagrant@dev:/laravel-app/public$ ls -al
total 20
drwxr-xr-x  2 www-data www-data 4096 Aug 10 09:19 .
drwxr-xr-x 12 www-data www-data 4096 Sep 15 10:39 ..
-rw-r--r--  1 www-data www-data    0 Aug 10 09:19 favicon.ico
-rw-r--r--  1 www-data www-data  603 Aug 10 09:19 .htaccess
-rw-r--r--  1 www-data www-data 1710 Aug 10 09:19 index.php
-rw-r--r--  1 www-data www-data   24 Aug 10 09:19 robots.txt

我是否需要删除“可写”权限以使应用程序文件结构更安全?

PHP Laravel 安全 Web 服务器 文件权限

评论

0赞 brombeer 9/18/2023
这两天已经有人问过了,有答案,从那以后有什么变化吗?
3赞 Lk77 9/18/2023
目录的正确权限为 755 (drwxr-xr-x),文件的正确权限为 644 (-rw-r--r--)
2赞 Lk77 9/18/2023
这不是一个建议,它是整个 php 生态系统的标准权限,无论你在哪里看,它总是 755/644,有时是 750/640,但仅此而已。我想,如果没有人删除 w 权限,那是因为它没有增加安全性,如果用户已经访问 www-data,我想你会遇到更大的问题
2赞 ADyson 9/18/2023
@Lk77这听起来像是一个糟糕的设计。读取和执行权限应该足够了。源代码不应由 Web 服务器写入。很少有(如果有的话)任何充分的理由。
1赞 ADyson 9/22/2023
@JasonOlson,启用日志记录和缓存并不意味着源代码需要可写,它只需要日志文件和缓存是可写的。至于wordpress...好吧,我明白你的意思,但是 Wordpress 也是众所周知的平台之一,它最常成为各种形式的黑客攻击和代码注入攻击的受害者......很难想象源代码可被 Web 服务器帐户覆盖的设置在某种程度上不会对此做出贡献。

答:

8赞 Eliezer Berlin 9/20/2023 #1

不。嗯,有点。有时这是无济于事的。但是您使用的是 Laravel,所以答案是否定的。


为什么我们不想允许源代码文件是可写的:

通常,网络服务器不应写入文件,因为它会显着降低攻击面和黑客可能造成的最大损害。例如,即使用户以某种方式利用其中一个插件中的安全漏洞来上传文件,如果 Web 服务器本身不写入访问权限,他们也无法上传带有 or 内部的替换文件。index.phpkeyloggerjavascript-based bitcoin miner


为什么我们可能希望允许源代码文件是可写的:

然而。如果某些 CMS 没有写入权限,它们会很生气。例如,Wordpress 有一个非常人性化的按钮,如果 Web 服务器没有写入访问权限(因为它无法在没有写入访问权限的情况下更新文件),它将无法工作,在这种情况下,您需要通过 FTP 上传更新(或通过克隆阶段,或以 devops 运行的方式)。Install updates

例如,Drupal 使用一个名为的命令行工具来安装更新,但由于 composer 是通过 ssh 用户从命令行运行的,因此 Web 服务器本身不需要写入权限。composer

(Wordpress 赞同这样一种观点,即我们不能总是期望每个 Web 管理员都知道如何通过 SSH 连接到服务器,因此它只是为了用户友好的更新而接受增加的安全风险。


异常:

也就是说,许多CMS,如WordpressDrupal,允许管理员上传文件(例如图像或pdf)。对于这些 CMS,服务器应该有一个名为 的可写目录,服务器可以修改该目录。uploads

有时他们还需要能够写入其他文件夹,比如插件可能有一个他们使用的目录。caching

每种类型的网站都有略微不同的目录,因此通常,您可以询问Google您网站的正确权限应该是什么。


对于Laravel来说,底线是:

Laravel 通过 composer 运行更新,这意味着您将运行更新。所以不,您的 Web 服务器不需要写入访问权限。正确的权限是:

用户: 组:YourUsernamewww-data

目录: 文件:2755644

但是,目录和目录应该可以由服务器写入,因此我们将它们更改为 and ...cachestorage2775664

这应该这样做:

cd /path/to/laravel-project/
sudo chown -r YourUsername:www-data .
sudo find ./ -type f -exec chmod 644 {} \;    
sudo find ./  -type d -exec chmod 2755 {} \;

sudo chmod -R g+w storage
sudo chmod -R g+w bootstrap/cache

评论

0赞 Jason Olson 9/22/2023
为什么它需要执行权限?对于PHP来说,这似乎是不必要的和允许的。此外,这种方法假设(没有说明/询问?)他们是否正在执行基于文件的日志记录(Laravel 默认值)、允许上传或从应用程序内部有意进行本地磁盘访问的任何数量的事情。Laravel 的主要模块之一是文件系统组件,虽然它不排除本地存储,但无疑说明了许多站点需要存储系统的观点。
0赞 Eliezer Berlin 9/22/2023
@JasonOlson 目录需要执行权限才能正常工作,但 PHP 不...这就是为什么我们没有给PHP执行。(644 不允许执行。--- 回复:其余的 - 是的,这些设置适用于典型设置。我想这可能是因为 OP 不想允许管理员向网站添加图片,但大多数网站的图片看起来更好,这意味着他们需要允许文件上传或始终坐在内容编辑器旁边。(我想,除非一切都在 STAGE 中完成。Why exactly does it require execute permissions
0赞 Eliezer Berlin 9/22/2023
@JasonOlson 如果您觉得需要禁用您不想要的功能,并且想要进一步细化您的权限,我想您可以使用 laravel.com/docs/10.x/structure 来查看每个目录,并决定是否需要它。但是许多开发人员并不确定他们需要哪些目录,因此“允许 Laravel 写入它想要的目录,并阻止 Laravel 不想写入的所有内容”的设置是标准做法。
0赞 Jason Olson 9/20/2023 #2

顶级域名;不建议在 Laravel 中删除用户的写入权限。它没有提供实际的安全优势,因为 Laravel 依赖于写入访问权限来执行基本任务,例如日志记录、缓存和接受用户上传。虽然可以采用最小访问方法的原则,但它是非标准的,可能会导致将来的代码更改出现问题。对恶意用户获得访问权限的担忧应该促使更广泛的安全考虑,对于一台服务器上的多个网站,最好隔离用户帐户。www-datawww-data

允许用户对您的文件具有写入权限在 Laravel 中具有重要意义。它支持必要的功能,例如生成日志和缓存文件、编译 Blade 模板、管理文件上传以及促进文件生成,例如在本地创建和存储 PDF 文件。根据您的部署方法,其他文件维护任务可能还需要写入访问权限。www-data

值得注意的是,Laravel 文档明确指出:“Laravel 可能需要配置一些权限:文件夹,并且需要 Web 服务器的写入访问权限。

虽然从理论上讲,您可以采用最小访问方法的原则,并仅将写入权限细致地分配给预期要修改的目录和文件,但这种方法偏离了标准设置。因此,将来对代码的更改(例如添加需要写入访问权限的组件)可能会导致意外问题,从而可能由于文件权限错误而导致代码失败。

如果担心恶意用户获取用户访问权限并执行未经审查的代码,则应促使对服务器安全实践进行全面审查。授予写入权限只是一个方面,还有更广泛的漏洞需要解决。此外,由于用户受到高度限制并且不允许交互式登录,因此主要的攻击媒介是通过您的代码,解决安全问题不应仅包括文件写入权限。www-data

An important exception arises when hosting multiple websites or virtual hosts on the same server. In this scenario, it is crucial to isolate user accounts for each website to prevent one website's code from accessing or modifying another's. Isolating user accounts, however, should not be framed as merely removing write access; it involves setting up separate user environments for each website to maintain security and independence.

评论

0赞 Jason Olson 9/21/2023
The irony of your statement is that if you disabled write access you would fundamentally break the built in automatic update features of Woocommerce. So by that fact you would promote not having 3rd party plugins able to update automatically. Furthermore, most of the major woo breaches have leaked data regardless of write access to the path.
0赞 hakre 9/26/2023
@JasonOlson: Actually, (also WordPress) automatic updates are not secure, so the irony is within the statement of your statement. But that's a longer discussion likely out of scope here, so just FYI and no harsh feelings, we can't solve all problems at once for the software we introduce, only at their beginning.
0赞 Raj Kumar 9/21/2023 #3

The and directories need to be writable by Laravel. We'll set their permissions to , giving the owner and group read, write, and execute permissions, while others can only read and execute. Also If You are file and are like then you don't need 755 permission for storage also only you need to give permission for .storagebootstrap/cache0775session, cache driverfilesystem drivers3storage/framework/view