我试图不是在我的文件夹中授予777
权限/var/www/html
,但我想在没有的情况下编辑我的文件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/
尝试更改它,但它仍然保留对所有人具有读取、写入和执行权限。我尝试对moodle
中的文件夹进行相同操作/home/andre/www/moodle
,但它保持不变。ls -la
中的输出/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/moodle
出现 403 Forbidden 错误。
我在这里做错了什么?
答案1
你永远不必从主目录中运行网站。 曾经。 否则,您必须让 Web 服务器能够遍历/home/
目录结构,同时还要能够进入/home/$USER/
(您的用户主目录,我们可以尝试查看您的用户目录中还存在哪些内容)以及其中的任何其他子文件夹。配置不当、配置错误或未打补丁的 Web 服务器可能会以这种方式导致大量数据泄露,或丢失凭据等,从而使您的个人数据和登录信息面临风险。您使用的符号链接方法也无济于事,原因与尝试授予 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 {} +
这将为目录中的组设置“set 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/
,并且我们不希望除了我们和系统(当然还有根用户)之外的其他监视用户看到我们的数据,我们需要做以下事情:
- 将所有权交还给网络服务器系统用户
www-data
。
sudo chown -R www-data:www-data /var/www/html
- 递归地授予您对文件的读/写权限,同时不允许其他用户(当然
www-data
不包括root
)访问这些文件。
sudo find /var/www/html -type f -exec setfacl -mu:YOURUSERNAME:rw -m other::--- {} \;
- 递归地授予自己对目录的读/写/遍历权限,删除其他用户(不包括
www-data
和root
)对文件夹的访问权限,并将其设置为目录中新文件的“默认”ACL。
sudo find /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+s {} \;
现在你可以访问所有目录了,和您不必剥夺访问权限,www-data
这有助于 Web 服务器仍然可以根据需要在任何地方创建文件(例如基于 PHP 的前端有自己的缓存目录,需要创建和写入才能正常运行)。
唯一需要注意的是:如果您手动创建新文件,则需要相应地更改它们的所有者权限,以将所有权授予网络服务器。这很简单sudo chown www-data:www-data filename
,访问控制列表仍应允许您对文件拥有有效的所有者权限。
有好几次,我作为系统管理员必须这样做,才能获得某种非标准访问权限,而无需更改给定文件的所有者。这种方法可行,但也有其自身的麻烦,因为并非每个文件系统支持文件访问列表。
答案2
Thomas ward 的出色回答 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/
答案3
使用符号链接解决权限问题的整个想法是有缺陷的,无法奏效。符号链接本身显示的权限大多无关紧要,它们不能用于规避“真实”目录的权限。从 到 创建符号链接/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/
。
您在 Web 服务器中收到的 403 错误可能是因为您的 Web 服务器没有进入所需的权限/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) 可能需要不同的权限,您必须查阅其文档。