您永远不必从主目录中运行网站。 永远 否则,您将必须使Web服务器能够遍历/home/
以查看目录结构,而且还可以进入/home/$USER/
(您的用户的主目录,我们可以在其中尝试查看您的用户目录中还存在什么内容)以及任何其他子文件夹在那里。配置不当,配置不当或未打补丁的Web服务器可能会以这种方式导致大量数据泄漏或凭据丢失,从而使您的个人数据和登录名在其他内容上处于危险之中。您所使用的symlink方法由于试图授予Apache读取权限的相同原因而无济于事/home/andre/www/moodle
-Web服务器必须能够遍历您的主目录才能到达符号链接/var/www/html
指向的位置,这仍然构成安全风险。
首先,使用sudo cp -r /home/andre/www/moodle/ /var/www/html/
。这会将您的文件复制到/var/www/html
,并使其远离您自己的主目录。然后,我们将重做权限,以便您和Web服务器可以访问该目录中的所有内容,并为您的用户提供对所有文件和目录的完全读/写权限。然后,您将只需要/var/www/html
为您的站点工作。
将数据复制回到/var/www/html
:这实际上是四个步骤
- 授予Apache访问文件夹和文件的权限,以便它可以为网站提供服务,而不会出现403错误。
- 为您的用户提供文件和文件夹的“所有者”,并让您自己对所有文件和文件夹具有读/写权限,并具有遍历目录的能力。
- (可选,但建议使用)进行设置,以使在此之后整个目录结构中创建的任何文件或文件夹的组均设置为
www-data
。
- (可选)最终安全清理,我们在其中设置了权限,因此您和Web服务器可以查看站点数据,但是其他用户无法访问该站点的文件或目录结构。
(1)允许Apache访问文件夹和文件。
sudo chgrp -R www-data /var/www/html
sudo find /var/www/html -type d -exec chmod g+rx {} +
sudo find /var/www/html -type f -exec chmod g+r {} +
这将递归地将“组”设置www-data
为文件夹和文件。然后,这将赋予Web服务器权限以递归并获得对站点文档根目录结构的访问(+x
仅对于目录)。然后,它还确保Web服务器具有对所有文件的读取权限,因此可以接收站点数据。
在某些情况下,您必须授予Web服务器对文件或目录的写许可权-这可以通过执行以下操作来实现sudo chmod g+w /var/www/html/PATH
(其中PATH
,目录结构中文件或文件夹的路径需要在其中应用Web服务器的写权限)。
注意:在很多情况下,这可能会公开有关站点配置的“安全”信息(例如数据库访问凭据等),并且您应使用以下命令删除对这些单独文件或目录上的数据的“其他”访问权限:以下内容:(sudo chmod o-rwx /var/www/html/FILEPATH
替换FILEPATH
为相对于/var/www/html
文件文件夹的路径)。
另请注意,如果“新文件”出现403问题,将来可能必须重新运行这些命令,以便为Web服务器赋予正确的权限,以继续访问在其中创建或复制的文件和文件夹。没有www-data
正确设置组。
(2)授予所有者对文件夹和文件的读/写特权,并允许文件夹访问遍历目录结构。
sudo chown -R USER /var/www/html/
sudo find /var/www/html -type d -exec chmod u+rwx {} +
sudo find /var/www/html -type f -exec chmod u+rw {} +
USER
用您自己的用户名替换第一个命令!
我们在这里做三件事。首先,我们将您的用户设置为中所有文件和目录的“所有者” /var/www/html
。接下来,我们设置文件夹的读写权限,并允许您访问文件夹以进入文件夹(+x
目录项中的项)。然后,我们将所有文件都设置为对所有者(我们刚刚设置)具有读/写权限。
(3)(可选)确保创建后的每个新文件都具有www-data
“访问”用户的身份。
sudo find /var/www/html -type d -exec chmod g+s {} +
这将为目录上的组设置“设置gid”位。在这些目录中创建的文件和文件夹将始终具有www-data
组,以允许Web服务器访问。
(4)(可选)最终安全清除,如果您不希望其他用户能够看到数据
我们需要您的用户查看目录和文件。我们也需要Web服务器这样做。我们可能不希望其他系统用户(root用户除外)查看数据。因此,不要让他们具有这种访问权限,而是只有您的用户和Web服务器才能看到数据。
sudo chmod -R o-rwx /var/www/html/
注意:您以后不必重新运行此操作,也不必在此处编辑“其他”类别的权限。如果“其他”用户无法访问/var/www/html/
(他们没有必要的+x
位/var/www/html
来遍历文件结构和目录结构,也没有+r
读取文件列表的位),那么其他用户对该目录下项目的权限或小组并没有太大的关系。
尽管也不能保证它适用于所有新文件,也不能保证它适用于所有文件系统,包括文件访问控制列表,但也存在侵入性较小的解决方案。这样一来,您就可以保留文件的所有权www-data
,但即使您不是个人拥有文件,也可以出于所有意图和目的为您提供有效的所有者权利。
该解决方案的侵入性较小,它使您可以拥有一个目录以及其中的所有文件,这些文件归www-data:www-data
或拥有,root:www-data
但同时也为您提供访问权限。它使用访问控制列表,使您可以让多个用户拥有权限而无需设置单个组。这还使root
或www-data
系统用户拥有文件,也使您可以逐案添加其他权限,并微调某些用户的权限,以便他们可以读取内容但不能编辑等。
假设我们仍在使用/var/www/html/
,并且除了我们和系统(当然还有root),我们都不希望窥探用户来查看我们的数据,我们需要执行以下操作:
- 将所有权交还给Web服务器系统用户
www-data
。
须藤chown -R www-data:www-data / var / www / html
- 递归给你读/写上的文件,同时给其他用户(不包括
www-data
和root
当然的),对文件的访问权限。
sudo查找/ var / www / html -type f -exec setfacl -mu:YOURUSERNAME:rw -m其他:: --- {} \;
- 递归地允许您自己在目录上进行读/写/遍历,删除其他用户(
www-data
和root
和除外)对文件夹的访问,并将其设置为目录中新文件的“默认” ACL。
sudo查找/ var / www / html -type d -exec setfacl -d -mu:YOURUSERNAME:rwx -mo :: --- {} \;
- 我们还需要
setgid
为所有目录设置该位,以便在创建文件时,Web服务器仍然可以www-data
通过组权限来访问它。
sudo查找/ var / www / html -type d -exec chmod g + x {} \;
现在,您已经可以访问所有目录,并且不必剥夺对目录的www-data
帮助,因为网络服务器仍然可以根据需要在任何地方创建文件(例如,基于PHP的前端具有自己的缓存目录,例如需要创建并写入以进行正确操作)。
唯一的警告:如果您手动创建新文件,则需要对它们进行相应的修改以将所有权授予Web服务器。这很简单sudo chown www-data:www-data filename
,并且访问控制列表仍应使您对文件具有有效的所有者权限。
在很多情况下,对于某些类型的非标准访问,我必须以sysadmin的身份进行操作,而无需更改给定文件的所有者。这行得通,但有其自身的麻烦,因为并非每个文件系统都支持文件访问列表。
+x
授予文件可执行权限,我们不希望通过PHP命令行或作为服务器本身上的可执行文件执行PHP文件-我们希望它们由Web服务器中的PHP解析器处理(不需要PHP文件,+x
PHP解析器就可以读取和处理它们。目录需要+x
允许遍历目录-也就是说,如果目录不是目录+x
并且我不是root用户,则无法进入目录,这是Apache遇到的与符号链接和主目录不兼容的问题目录。