提问人:YanDatsiuk 提问时间:9/18/2023 更新时间:9/21/2023 访问量:333
使源代码文件可由网络服务器写入是否安全?
Is it secure to make source code files writable by webserver?
问:
我正在使用一个新的 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
我是否需要删除“可写”权限以使应用程序文件结构更安全?
答:
不。嗯,有点。有时这是无济于事的。但是您使用的是 Laravel,所以答案是否定的。
为什么我们不想允许源代码文件是可写的:
通常,网络服务器不应写入文件,因为它会显着降低攻击面和黑客可能造成的最大损害。例如,即使用户以某种方式利用其中一个插件中的安全漏洞来上传文件,如果 Web 服务器本身不写入访问权限,他们也无法上传带有 or 内部的替换文件。index.php
keylogger
javascript-based bitcoin miner
为什么我们可能希望允许源代码文件是可写的:
然而。如果某些 CMS 没有写入权限,它们会很生气。例如,Wordpress 有一个非常人性化的按钮,如果 Web 服务器没有写入访问权限(因为它无法在没有写入访问权限的情况下更新文件),它将无法工作,在这种情况下,您需要通过 FTP 上传更新(或通过克隆阶段,或以 devops 运行的方式)。Install updates
例如,Drupal 使用一个名为的命令行工具来安装更新,但由于 composer 是通过 ssh 用户从命令行运行的,因此 Web 服务器本身不需要写入权限。composer
(Wordpress 赞同这样一种观点,即我们不能总是期望每个 Web 管理员都知道如何通过 SSH 连接到服务器,因此它只是为了用户友好的更新而接受增加的安全风险。
异常:
也就是说,许多CMS,如Wordpress或Drupal,允许管理员上传文件(例如图像或pdf)。对于这些 CMS,服务器应该有一个名为 的可写目录,服务器可以修改该目录。uploads
有时他们还需要能够写入其他文件夹,比如插件可能有一个他们使用的目录。caching
每种类型的网站都有略微不同的目录,因此通常,您可以询问Google您网站的正确权限应该是什么。
对于Laravel来说,底线是:
Laravel 通过 composer 运行更新,这意味着您将运行更新。所以不,您的 Web 服务器不需要写入访问权限。正确的权限是:
用户: 组:YourUsername
www-data
目录: 文件:2755
644
但是,目录和目录应该可以由服务器写入,因此我们将它们更改为 and ...cache
storage
2775
664
这应该这样做:
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
评论
Why exactly does it require execute permissions
顶级域名;不建议在 Laravel 中删除用户的写入权限。它没有提供实际的安全优势,因为 Laravel 依赖于写入访问权限来执行基本任务,例如日志记录、缓存和接受用户上传。虽然可以采用最小访问方法的原则,但它是非标准的,可能会导致将来的代码更改出现问题。对恶意用户获得访问权限的担忧应该促使更广泛的安全考虑,对于一台服务器上的多个网站,最好隔离用户帐户。www-data
www-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.
评论
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 .storage
bootstrap/cache
0775
session, cache driver
filesystem driver
s3
storage/framework/view
评论