我有一个 AWS EC2 LAMP 服务器(使用 Apache 2.0 和 mod_php5) 的基本目录结构如下:
var
|-- www
| `-- api_folder (NOT public)
| | |-- sensitive files (NOT public)
| | |-- folder with sensitive files and 1 public webhook API file
| | | |-- sensitive files (NOT public)
| | | |-- Public_Webhook.php file receiving POST <== (PUBLIC)
| | | |-- sensitive files (NOT public)
| '-- public_html (PUBLIC)
| | |-- files_and_folders (PUBLIC)
| | |-- ...
问题
- 为了能够从某些服务接收 POST webhook,PHP 文件是否需要公开访问?
- 如果是,那么是否可以将其
Public_Webhook.php file receiving POST
公开,而文件夹所在的其余内容都是私有的,不对公众开放? - 如果可能的话,我是否只需要
chmod 700
(我是否需要自己设置文件,600
或者如果我将文件夹设置为,它会自动完成700
?)整个私有 API 文件夹并将私有 PHP 文件的权限设置为644
?
编辑/更新
跑步$ ps aux | grep http
,让我:
$ ps aux | grep http
root 32267 0.0 1.9 370488 19968 ? Ss 14:40 0:00 /usr/sbin/httpd
apache 32275 0.0 2.5 459372 26324 ? S 14:40 0:00 /usr/sbin/httpd
apache 32276 0.0 2.6 460168 27080 ? S 14:40 0:00 /usr/sbin/httpd
apache 32277 0.0 2.5 459400 26412 ? S 14:40 0:00 /usr/sbin/httpd
apache 32278 0.0 2.5 459240 26272 ? S 14:40 0:00 /usr/sbin/httpd
apache 32279 0.0 2.5 459372 26304 ? S 14:40 0:00 /usr/sbin/httpd
apache 32280 0.0 2.5 459372 26288 ? S 14:40 0:00 /usr/sbin/httpd
apache 32314 0.0 2.5 459372 26288 ? S 14:50 0:00 /usr/sbin/httpd
apache 32316 0.0 2.5 459372 26288 ? S 14:50 0:00 /usr/sbin/httpd
apache 32319 0.0 2.5 459236 26240 ? S 14:50 0:00 /usr/sbin/httpd
apache 32324 0.0 2.4 458332 25132 ? S 14:50 0:00 /usr/sbin/httpd
ec2-user 32524 0.0 0.2 110456 2208 pts/0 S+ 15:50 0:00 grep --color=auto http
所以我的 apache 用户很简单apache
(而我认为在某些发行版中,这会像www-data
或ubuntu
等)。
目前,我还没有/public_html
目录,但我计划设置它。目前,我的公共文件夹是/var/www/html/
,所有敏感文件都位于该目录中——呃!
$ ls -l /var/www/html
显示如下:
drwxrwsr-x 2 ec2-user www 4096 Jul 2 19:56 archive
-rw-r--r-- 1 ec2-user www 364 Jul 7 00:02 config.ini.php
drwxrwsr-x 4 root www 4096 Jun 30 21:42 private_api_files
drwxrwsr-x 2 root www 4096 Jun 26 21:29 some_assets
-rw-r--r-- 1 ec2-user www 643 Jul 6 00:02 mail_test.php
-rw-rw-r-- 1 root www 18 Jul 5 22:53 phpinfo.php
drwxrwsr-x 7 ec2-user www 4096 Jul 2 20:25 PHPMailer-master
几乎所有这些目录/文件都是私密的,并且包含敏感信息。出于某种原因,这看起来不对劲,但我对此还不太熟悉,无法判断。
解决方案?
如果我错了,请纠正我。所以,
我会将
.../Public_Webhook.php
敏感文件保留在其位置,然后在 webhook PHP 文件中正确地重新链接它们。/var/www/html/public_html/
然后,我将在新创建的私有文件上运行以下命令并将其更改为:
/var/www/html/private_api_files/
$ chown -R apache:apache /var/www/html/private_api_files/
$ chmod -R go-rwx /var/www/html/private_api_files/
$ chmod -R 700
然后我会在新创建的
/var/www/html/public_html/
$ chown -R apache:apache /var/www/html/public_html/
$ chmod -R rwxr-xr-x /var/www/html/public_html/
$ chmod -R 755
或者
- 将所有敏感文件移出
/var/www/html/
并放入一个文件夹,并简单地将所有内容公开,这样会更干净吗?这样,我就不必更改所有权/权限或 Apache/var/www/all_sensitive_api_files/
/var/www/html/
DocumentRoot 指令设置,对吧?
附言:我的 Server Fault 分数太低了,我甚至不能给你点赞 :/
答案1
就你的情况而言,php 本质上与 apache forks 是同一个用户。因此,拥有子 apache 进程的用户就是需要访问文件的用户。
用户 apache 按照 apache conf 文件中的配置运行。您可以通过运行以下命令来验证运行系统中的此用户是谁:
ps aux | grep http
您将看到一个由 root 拥有的进程,以及一些您感兴趣的子进程。
从目录的角度来看,这是需要 RX 权限的用户。
没有任何内容需要“公开”,因为系统上的每个用户都需要访问它,但是运行 apache 的用户需要访问它将要读取的任何文件。
Apache 有一个 webroot 的概念。你可以在 conf 文件中配置它,通常在 vhost 部分中使用文档根目录指令。webroot 下的文件可通过正在运行的 Apache 服务器访问。看来 public_html 是您的 webroot。如果是这样,那么 Public_Webhook.php 应该位于 webroot 下。
但这并不意味着任何私有文件都需要位于 webroot 下。您可以定义这些文件的路径并从 Public_Webhook.php 访问它们,这是一种常见的做法。
大多数带有前端控制器的框架仅将前端控制器本身与静态资产一起放置在 webroot 下。所有其他文件都放置在 webroot 之外并根据需要包含。
再次强调,任何私人文件都必须由运行 Apache 的用户访问,并且您可以根据需要开放或限制这些权限。
至于默认权限和文件所有权,这个问题有很多。有 umask,然后你可以做一些更细致的事情。你可以为拥有相关目录的用户配置 unmask,当新文件添加到现有目录时,设置该用户的 umask 可能会解决你的问题。参见此umask 基础知识网站
请参阅此问题您可以通过安装目录 acl 来执行更多高级操作。
更改目录的权限只需使用通配符和/或递归选项的某种组合即可。这对所有权和权限都有效:
所有权,递归改变:
chown -R apache:apache /some/dir
烫发:
递归删除组/其他的所有权限
chmod -R go-rwx /some/dir
以递归方式设置仅所有者的权限:
chmod -R 700
再次提醒,请记住,需要访问文件的 php 脚本不需要该文件的执行权限。
容易让人困惑的是,目录需要执行权限,以便 apache(或任何用户)读取其中的文件。文件本身(不包括将要执行的 .php 脚本)不必具有执行权限,并且可以设置为 apache 仅具有 R 访问权限。
从安全角度来看,如果 apache 用户对所有内容都有 RWX 访问权限,那么您提供的安全性就不高。即使在 webroot 下,您也不希望 apache 用户对目录和脚本有写入权限。
通常,使用 apache/mod_php 的人会进行设置,以便 Apache 通过文件的组权限访问文件。
这允许您拥有不同的用户来拥有/编辑/更新目录和文件,并且您可以专注于组权限并尽可能地限制这些权限。
已更新,解决方案答案:
- 是的,引用文件的包含。在 PHP 中,所有与文件相关的函数都不是指“网络空间”,而是指实际的文件系统。因此,您可以在运行 php 脚本的用户可以访问的系统上的任何位置包含/打开等文件。
让系统上的非 Apache 用户拥有您的目录(包括私人目录和网络空间目录)。为简单起见,此用户将以用户|组的身份拥有所有文件,其中用户名和组名相同。现在让我们将此帐户称为 fsuser。
chown -R fsuser:fsuser /var/www/html/private_api_files/ chown -R fsuser:fsuser /var/www/html/public_html/
现在处理目录权限并只授予用户和组访问权限。
chmod -R 750 /var/www/html/public_html
chmod -R 750 /var/www/html/private_api_files
现在对于目录中的各个文件(仅针对 php 文件),为其提供以下内容:
chmod find /var/www/html/public_html -type f -name '*.php' -exec chmod 650 {} \;
对于其他目录,您不想设置执行位,因此您只希望组具有读取访问权限。这将查找所有文件并设置其访问权限。
find /var/www/html/private_api_files/ -type f -exec chmod 640 {} \;
现在您只需将 apache 用户作为补充组成员添加到 fsuser 组:
usermod -a -G fsuser apache
确保在进行任何这些类型的更改或调整后始终重新启动 apache。
sudo service httpd restart