/ var / www / html和我自己的网站文档根目录的主目录的权限问题


34

我试图给我的/var/www/html文件夹777权限,但是我想不带编辑文件sudo。因此,尽管我在的主目录中创建了一个文件夹的符号链接/var/www/html。我使用创建了它sudo ln -sT /home/andre/www/moodle/ moodlels -la输出是这样的:

andre@andre-270E5G:/var/www/html$ ls -la
total 8
drwxr-xr-x 2 root root 4096 Mai  4 10:20 .
drwxr-xr-x 4 root root 4096 Abr 29 14:29 ..
lrwxrwxrwx 1 root root   23 Mai  4 10:20 moodle -> /home/andre/www/moodle/

因此,我的moodle文件夹具有针对所有人的读取,写入和执行权限,这不是我想要的。我使用了sudo chmod -R 775 moodle/尝试更改它的命令,但是它保留了对所有人的读取,写入和执行权限。我在中的moodle文件夹中尝试过相同的操作/home/andre/www/moodle,但保持不变。ls -lain 的输出/home/andre/www/是:

andre@andre-270E5G:~/www$ ls -la
total 28
drwxrwxr-x  3 andre andre  4096 Mai  4 10:02 .
drwx------ 49 andre andre 20480 Mai  4 10:01 ..
drwxrwxr-x 41 andre andre  4096 Mai  4 10:02 moodle

因此,该文件夹moodle/home/andre/www/有我想要的权限。

另一个问题是,当我访问时,出现localhost/moodle403 Forbidden错误。

我在这里做错了什么?

Answers:


63

您永远不必从主目录中运行网站永远 否则,您将必须使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:这实际上是四个步骤

  1. 授予Apache访问文件夹和文件的权限,以便它可以为网站提供服务,而不会出现403错误。
  2. 为您的用户提供文件和文件夹的“所有者”,并让您自己对所有文件和文件夹具有读/写权限,并具有遍历目录的能力。
  3. (可选,但建议使用)进行设置,以使在此之后整个目录结构中创建的任何文件或文件夹的组均设置为www-data
  4. (可选)最终安全清理,我们在其中设置了权限,因此您和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但同时也为您提供访问权限。它使用访问控制列表,使您可以让多个用户拥有权限而无需设置单个组。这还使rootwww-data系统用户拥有文件,也使您可以逐案添加其他权限,并微调某些用户的权限,以便他们可以读取内容但不能编辑等。

假设我们仍在使用/var/www/html/,并且除了我们和系统(当然还有root),我们都不希望窥探用户来查看我们的数据,我们需要执行以下操作:

  1. 将所有权交还给Web服务器系统用户www-data
须藤chown -R www-data:www-data / var / www / html
  1. 递归给你读/写上的文件,同时给其他用户(不包括www-dataroot当然的),对文件的访问权限。
sudo查找/ var / www / html -type f -exec setfacl -mu:YOURUSERNAME:rw -m其他:: --- {} \;
  1. 递归地允许您自己在目录上进行读/写/遍历,删除其他用户(www-dataroot和除外)对文件夹的访问,并将其设置为目录中新文件的“默认” ACL。
sudo查找/ var / www / html -type d -exec setfacl -d -mu:YOURUSERNAME:rwx -mo :: --- {} \;
  1. 我们还需要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的身份进行操作,而无需更改给定文件的所有者。这行得通,但有其自身的麻烦,因为并非每个文件系统都支持文件访问列表。


2
@AndréCarvalho +x授予文件可执行权限,我们不希望通过PHP命令行或作为服务器本身上的可执行文件执行PHP文件-我们希望它们由Web服务器中的PHP解析器处理(不需要PHP文件,+xPHP解析器就可以读取和处理它们。目录需要+x允许遍历目录-也就是说,如果目录不是目录+x并且我不是root用户,则无法进入目录,这是Apache遇到的与符号链接和主目录不兼容的问题目录。
托马斯·沃德

1
@AndréCarvalho www-data是一个系统组-这不是一组标准用户是英寸
托马斯病区

1
@JunaidQadirShekhanzai由于人们的设置与其所需的环境和许多其他因素有很大差异,因此无法提供。如果存在可选组件,那么将无法生成这样的“ shell文件” 。我可以尝试,使一个Python脚本,可以做到这一点,但我们仍然会碰到类似的事情限制系统,可选的任务,不同的路径等
托马斯·沃德

1
@ T.Todua不是我说的。我说过,永远不要“主”目录之外(从内部读取)运行网站 -也就是说,不应在/home/USER/...Web服务器上运行任何内容。您已经误读并误解了我使用的词语的含义。 /var/www/*是运行网站的相对“安全”的地方,因为那是专用的文件夹/空间。但是,这样/var/www/html做并不安全,因为它是由Web服务器在安装时等写入的,并导致破坏重要数据(因此,请/var/www/SUBDIRECTORY与单个站点的子目录一起使用)
Thomas Ward

1
为了清楚起见,我已经调整了措辞。
托马斯·沃德

2

使用符号链接来解决权限问题的整个想法是有缺陷的,并且行不通。为符号链接本身显示的权限大多数是无关紧要的,因此不能使用它们规避“真实”目录的权限。创建从/var/www/html/moodle到的符号链接/home/andre/www/moodle/不会绕过对的权限/home/andre/www/moodle/。任何人/var/www/html/moodle只要有必要的权限,就可以这样做/home/andre/www/moodle/

sudo chmod -R 775 moodle/实际上,您的执行确实会产生影响,但与您认为它不会更改symlink的许可,而是对symlink target的许可的影响不同/home/andre/www/moodle/

您在网络服务器中遇到的403错误可能是因为您的网络服务器没有进入所需的权限/home/andre。这不是“其他问题”,而是由于相同的权限问题。

因此,除了使用符号链接之外,您还必须找出允许您编辑文件的权限,并允许Web服务器访问它们(甚至编辑它们,这取决于应用程序)。这些权限的确切含义取决于您的确切用例(您的应用程序和服务器配置)。

通常,我认为您拥有文件并拥有rw权限是一个好主意,Web服务器仅通过组权限具有对文件的读取访问权限,所有其他用户均无访问权限。

权限示例(由于缺少信息,因此可能不适用于您的用例):

andre@fermat:/var/www/html$ ls -al moodle/
total 0
drwxr-x--- 2 andre www-data 60 mai  4 16:20 .
drwxr-xr-x 3 root  root     80 mai  4 16:20 ..
-rw-r----- 1 andre www-data  0 mai  4 16:20 index.html

您可以看到该目录具有足够的访问权限,您可以作为所有者输入并修改其内容,而Web服务器(在组中www-data)可以输入和读取。文件本身对您(所有者)是可读写的,并且对Web服务器(在组中www-data)也是可读的。所有其他用户均无访问权限。

同样,请仅以此为例。Web服务器的确切用户/组取决于您的配置。而且您的应用程序(面条)可能需要不同的权限,因此您必须查阅其文档。


同意,但是如果他们不知道如何正确设置权限,这并没有太大帮助,他们也会遇到其他问题。
托马斯·沃德

@ThomasW .:那么,如何正确设置权限的问题应该是一个新问题,包括必要的信息,例如Web服务器配置,所需的文件编辑方式以及应用程序的需求。
马斯托夫

或写为正确答案-我现在正在这样做。您也应该永远不要在网站的/ home / USER /之外运行任何东西,如果Web服务器未正确打补丁或配置,它也可以访问许多其他“用户”数据。
托马斯·沃德

@mastov明白了。您解决了我在解释时遇到的许多问题。
安德烈·卡瓦略

2

托马斯·沃德的出色回答 https://askubuntu.com/a/767534/717860

您只需3个命令即可完成所有建议的步骤,而不是8个命令:

3个命令:

sudo chown -R ubuntu:www-data /var/www
sudo find /var/www -type d -exec chmod 2750 {} \+
sudo find /var/www -type f -exec chmod 640 {} \+

与以下8个命令执行相同的工作:

sudo chgrp -R www-data /var/www
sudo find /var/www -type d -exec chmod g+rx {} +
sudo find /var/www -type f -exec chmod g+r {} +
sudo chown -R ubuntu /var/www/
sudo find /var/www -type d -exec chmod u+rwx {} +
sudo find /var/www -type f -exec chmod u+rw {} +
sudo find /var/www -type d -exec chmod g+s {} +
sudo chmod -R o-rwx /var/www/
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.