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

我试图不在我的/var/www/html文件夹中给予777权限,但我想在没有sudo情况下编辑我的文件。 所以我在/var/www/html主目录中创建了一个文件夹的符号链接。 我使用sudo ln -sT /home/andre/www/moodle/ moodle创建它,而ls -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/尝试更改它,但它保留了对所有人的读取,写入和执行权限。 我尝试使用/home/andre/www/moodle的moodle文件夹,但它保持不变。 /home/andre/www/ls -la的输出是:

 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 

所以/home/andre/www/的文件夹moodle具有我想要的权限。

作为一个额外的问题,当我访问localhost/moodle我得到403 Forbidden错误。

我在这做错了什么?

您永远不必在主目录之外运行网站EVER。 否则,您必须让Web服务器能够遍历/home/以查看目录结构,还可以访问/home/$USER/ (您的用户的主目录,我们可以尝试查看您的用户中还有其他内容)目录),以及其中的任何其他子文件夹。 配置不当或配置错误或未修补的Web服务器可能会以这种方式导致大量数据泄漏,或丢失凭据等会导致您的个人数据和登录不同的事情处于危险之中。 您正在使用的符号链接方法没有任何帮助,原因与尝试授予读取/home/andre/www/moodle Apache权限相同 – 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 {} + 

这将为目录上的组设置“set gid”位。 在这些目录中创建的文件和文件夹将始终具有www-data作为组,允许Web服务器访问。


(4) (可选)最终安全清理,如果您不希望其他用户能够查看数据

我们需要您的用户查看目录和文件。 我们也需要网络服务器这样做。 我们可能不希望其他系统用户(root除外)看到数据。 因此,不要让他们访问,并使其只有您的用户和Web服务器才能看到数据。

 sudo chmod -R o-rwx /var/www/html/ 

注意:您不必在以后重新运行此操作,也不必在此处编辑“其他”权限类别的权限。 如果’其他’用户无法访问/var/www/html/ (他们在/var/www/html上没有必要的+x位来遍历文件结构和目录结构,也没有+r位到读取文件列表),那么对于其他用户或组,该目录下面的项目的权限实际上并不重要。


虽然它不能保证适用于所有新文件,也不能保证在涉及文件访问控制列表的所有文件系统上都能正常工作 。 这使您可以使用www-data保留文件的所有权,但是为所有意图和目的提供有效的所有者权限,即使您不亲自拥有这些文件。

此解决方案的侵入性较小,并且您可以拥有一个目录以及www-data:www-data所拥有的所有文件www-data:www-dataroot:www-data但也可以自行访问。 它使用访问控制列表 ,使您可以让多个用户拥有权限,而无需设置单个组。 这也允许rootwww-data系统用户拥有文件,但也允许您根据具体情况添加其他权限,并微调某些用户的权限,以便他们可以阅读但不能编辑等等。

假设我们仍在使用/var/www/html/ ,并且我们不希望窥探除我们以外的用户和系统(当然还有根)看到我们的数据,我们需要做以下事情:

  1. 将所有权归还给Web服务器系统用户www-data
  sudo chown -R www-data:www-data / var / www / html 
  1. 递归地给你读/写文件,同时给其他用户(当然不包括www-dataroot )无法访问文件。
  sudo find / var / www / html -type f -exec setfacl -mu:YOURUSERNAME:rw -m other :: --- {} \; 
  1. 递归地给自己读取/写入/遍历目录,删除对其他用户(不包括www-dataroot )的文件夹的访问权限,并将其设置为目录中新文件的“默认”ACL。
  sudo find / var / www / html -type d -exec setfacl -d -mu:YOURUSERNAME:rwx -mo :: --- {} \; 
  1. 我们还需要为所有目录设置setgid位,这样,如果您创建文件,Web服务器仍然可以通过组权限将其作为www-data访问。
  sudo find / var / www / html -type d -exec chmod g + x {} \; 

现在你可以访问所有目录, 而且你不必访问www-data ,这有助于web服务器仍然可以在任何地方创建文件(例如基于PHP的前端有自己的缓存)需要创建和写入目录以及正确操作的目录。

唯一需要注意的是:如果您手动创建新文件,则需要相应地对其进行chown以赋予Web服务器所有权。 这是一个简单的sudo chown www-data:www-data filename ,访问控制列表仍然可以让你拥有该文件的有效所有者权限。

在不改变给定文件的所有者的情况下,我有多种情况需要将其作为某种类型的非标准访问的系统管理员。 这有效,但有其自身的问题,因为并非每个文件系统都支持文件访问列表。

使用符号链接来解决权限问题的整个想法是有缺陷的,无法工作。 为符号链接本身显示的权限大多不相关,它们不能用于规避“真实”目录的权限。 从/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/实际上确实有效,但不同于你认为它没有改变符号链接的权限,而是符号链接目标/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服务器的确切用户/组取决于您的配置。 您的应用程序(moodle)可能需要不同的权限,您必须查阅其文档。

托马斯病房的优秀答案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/