题 我的网站文件/文件夹在Linux网络服务器上应具有哪些权限?


这是一个 典型问题 关于Linux Web服务器上的文件权限。

我有一个运行Apache2的Linux Web服务器,它托管着几个网站。每个网站在/ var / www /中都有自己的文件夹。

/var/www/contoso.com/
/var/www/contoso.net/
/var/www/fabrikam.com/

基目录/ var / www /由root:root拥有。 Apache以www-data:www-data运行。 Fabrikam网站由两位开发人员Alice和Bob维护。这两个Contoso网站都由一位开发人员Eve维护。所有网站都允许用户上传图片。如果网站遭到入侵,影响应尽可能地受到限制。

我想知道设置权限的最佳方式,以便Apache可以提供内容,网站可以抵御攻击,开发人员仍然可以进行更改。其中一个网站的结构如下:

/var/www/fabrikam.com
    /cache
    /modules
    /styles
    /uploads
    /index.php

如何在这些目录和文件上设置权限?我在某处读到你不应该在网站上使用777权限,但我不明白可能导致什么问题。在繁忙时段,网站会自动缓存某些页面并将结果存储在缓存文件夹中。网站访问者提交的所有内容都会保存到uploads文件夹中。


283
2018-02-06 01:50




这是一个目的 典范 回答我们获得的有关网站权限的所有问题。 - Nic
“我在某个地方读到你不应该在网站上使用777权限,但我不明白......” - 那么读者是否能够理解或者至少能够在这里比较答案的优点?任何解决方案都应该基于特定的要求 - 这里的要求不够具体(威胁模型是什么) - symcbean
我喜欢你问的是Apache,但是正在使用微软通常用作域的域名。 - gWaldo
另见 在/ var / www中处理apache2用户www-data权限的最佳方法是什么? - Gareth
您可以在此处参考有关Linux中网站文件和文件夹所需权限的完整详细信息 serverfault.com/questions/124800/...


答案:


在决定使用哪些权限时,您需要确切地知道您的用户是谁以及他们需要什么。 Web服务器与两种类型的用户交互。

经过身份验证 用户在服务器上拥有用户帐户,并且可以提供特定权限。这通常包括系统管理员,开发人员和服务帐户。他们通常使用SSH或SFTP对系统进行更改。

匿名 用户是您网站的访问者。虽然他们没有直接访问文件的权限,但他们可以请求网页,Web服务器代表他们行事。您可以通过小心Web服务器进程具有哪些权限来限制匿名用户的访问。在许多Linux发行版上,Apache都是以 www-data 用户,但它可以是不同的。使用 ps aux | grep httpd 要么 ps aux | grep apache 查看Apache在您的系统上使用的用户。


关于linux权限的说明

Linux和其他符合POSIX标准的系统使用传统的unix权限。维基百科上有一篇很棒的文章 文件系统权限 所以我不会在这里重复一切。但是你应该注意一些事情。

执行位
解释的脚本(例如Ruby,PHP)在没有执行权限的情况下工作得很好。只有二​​进制文件和shell脚本需要执行位。为了遍历(输入)目录,您需要具有该目录的执行权限。 Web服务器需要此权限才能列出目录或提供其中的任何文件。

默认新文件权限
创建文件时,它通常会继承创建文件的组ID。但有时您希望新文件继承创建它们的文件夹的组ID,因此您将在父文件夹上启用SGID位。

默认权限值取决于您的umask。 umask从新创建的文件中减去权限,因此公共值022会导致使用755创建文件。与组合作时,将umask更改为002非常有用,这样您创建的文件可以由组成员修改。如果要自定义上载文件的权限,则需要更改uache的umask或在上载文件后运行chmod。


777的问题

当你 chmod 777 你的网站,你没有任何安全保障。系统上的任何用户都可以更改或删除您网站中的任何文件。但更严重的是,请记住,Web服务器代表您网站的访问者,现在Web服务器能够更改它正在执行的相同文件。如果您的网站中存在任何编程漏洞,则可能会利用这些漏洞破坏您的网站,插入网络钓鱼攻击或从您的服务器窃取信息,而您却不知道。

此外,如果您的服务器运行在 着名的港口 (它应该防止非root用户产生世界可访问的侦听服务),这意味着您的服务器必须由root启动(尽管任何合理的服务器将在绑定端口后立即转移到权限较低的帐户) 。换句话说,如果您正在运行一个Web服务器,其中主可执行文件是版本控制的一部分(例如CGI应用程序),则保留其权限(或者,就此而言,包含目录的权限,因为用户可以重命名可执行文件)在777允许 任何 用户运行 任何 以root身份执行。


定义要求

  • 开发人员需要对文件进行读/写访问,以便他们可以更新网站
  • 开发人员需要对目录进行读/写/执行,以便他们可以浏览
  • Apache需要对文件和解释脚本的读访问权限
  • Apache需要对可服务目录的读/执行访问权限
  • Apache需要对上载内容的目录进行读/写/执行访问

由单个用户维护

如果只有一个用户负责维护站点,请将其设置为网站目录中的用户所有者,并为用户授予完整的rwx权限。 Apache仍然需要访问以便它可以提供文件,因此将www-data设置为组所有者并为组提供r-x权限。

在你的情况下,夏娃,其用户名可能是 eve,是唯一维护的用户 contoso.com :

chown -R eve contoso.com/
chgrp -R www-data contoso.com/
chmod -R 750 contoso.com/
chmod g+s contoso.com/
ls -l
drwxr-s--- 2 eve      www-data   4096 Feb  5 22:52 contoso.com

如果您有需要Apache可写的文件夹,则只需修改组所有者的权限值,以便www-data具有写访问权限。

chmod g+w uploads
ls -l
drwxrws--- 2 eve      www-data   4096 Feb  5 22:52 uploads

这种配置的好处是,系统中的其他用户可以更加困难(但并非不可能*),因为只有用户和组所有者才能浏览您的网站目录。如果配置文件中包含机密数据,这将非常有用。你的umask要小心!如果您在此处创建新文件,则权限值可能默认为755.您可以运行 umask 027这样新文件默认为640(rw- r-- ---)。


由一组用户维护

如果有多个用户负责维护站点,则需要创建一个用于分配权限的组。最好为每个网站创建一个单独的组,并在该网站之后命名该组。

groupadd dev-fabrikam
usermod -a -G dev-fabrikam alice
usermod -a -G dev-fabrikam bob

在前面的示例中,我们使用组所有者为Apache授予权限,但现在用于开发人员组。由于用户所有者对我们不再有用,因此将其设置为root是确保不泄漏任何权限的简单方法。 Apache仍然需要访问权限,因此我们提供对世界其他地方的读取权限。

chown -R root fabrikam.com
chgrp -R dev-fabrikam fabrikam.com
chmod -R 775 fabrikam.com
chmod g+s fabrikam.com
ls -l
drwxrwxr-x 2 root     dev-fabrikam   4096 Feb  5 22:52 fabrikam.com

如果您有需要Apache可写的文件夹,则可以使Apache成为用户所有者或组所有者。无论哪种方式,它都将拥有所需的所有访问权限。就个人而言,我更喜欢将其设为用户所有者,以便开发人员仍然可以浏览和修改上传文件夹的内容。

chown -R www-data uploads
ls -l
drwxrwxr-x 2 www-data     dev-fabrikam   4096 Feb  5 22:52 uploads

虽然这是一种常见的方法,但存在缺点。由于系统上的每个其他用户都拥有与Apache相同的网站权限,因此其他用户可以轻松浏览您的站点并读取可能包含秘密数据的文件,例如配置文件。

你可以吃蛋糕,也可以吃

这可以进一步改进。对于拥有者而言,拥有比组更少的权限是完全合法的,因此不是通过将用户所有者分配给root来浪费用户所有者,而是可以使Apache成为您网站中目录和文件的用户所有者。这是单个维护者场景的逆转,但它同样有效。

chown -R www-data fabrikam.com
chgrp -R dev-fabrikam fabrikam.com
chmod -R 570 fabrikam.com
chmod g+s fabrikam.com
ls -l
dr-xrwx--- 2 www-data  dev-fabrikam   4096 Feb  5 22:52 fabrikam.com

如果您有需要Apache可写的文件夹,则只需修改用户所有者的权限值,以便www-data具有写访问权限。

chmod u+w uploads
ls -l
drwxrwx--- 2 www-data  dev-fabrikam   4096 Feb  5 22:52 fabrikam.com

使用此解决方案时要注意的一件事是,新文件的用户所有者将与创建者匹配,而不是设置为www-data。因此,除非您使用它们,否则您创建的任何新文件都不会被Apache读取。


* Apache权限分离

我之前提到,无论您使用何种权限,其他用户实际上都可以窥探您的网站。默认情况下,所有Apache进程都以相同的www-data用户身份运行,因此任何Apache进程都可以从同一服务器上配置的所有其他网站读取文件,有时甚至可以进行更改。任何能够让Apache运行脚本的用户都可以获得与Apache本身相同的访问权限。

为了解决这个问题,有各种方法 特权分离 在Apache中。但是,每种方法都有各种性能和安全缺陷。在我看来,任何具有更高安全性要求的站点都应该在专用服务器上运行,而不是在共享服务器上使用VirtualHosts。


其他考虑因素

我之前没有提到它,但让开发人员直接编辑网站通常是一种不好的做法。对于较大的站点,您最好使用某种版本系统从版本控制系统的内容更新Web服务器。单一的维护者方法可能是理想的,但不是一个人,而是拥有自动化软件。

如果您的网站允许不需要提供的上传,那么这些上传应该存储在Web根目录之外的某个位置。否则,您可能会发现人们正在下载旨在保密的文件。例如,如果您允许学生提交作业,则应将其保存到Apache不提供的目录中。对于包含机密的配置文件,这也是一种很好的方法。

对于需求更复杂的网站,您可能需要考虑使用 访问控制列表。这些可以实现更复杂的权限控制。

如果您的网站有复杂的要求,您可能需要编写一个设置所有权限的脚本。彻底测试,然后保证安全。如果你因为某些原因发现自己需要重建你的网站,它可能值得用金重量。


316
2018-02-06 01:50



“chmod -R 775 fabrikam.com”。大多数网站中的文件很少必须是可执行的;例如,只要Web服务器可以读取它们,PHP脚本就可以是0640。 chmod -R a + X fabrikam.com只为目录上的每个人提供可执行权限。
很好的描述! - RNA
请注意,Apache以用户身份运行 apache 在Red Hat派生系统上。 - Michael Hampton♦
这是非常好的,但有一件事我不明白:我不明白将apache作为文件目录的用户/所有者的策略的目标或优势,如果它已经拥有该文件的组所有权。 - idiotprogrammer
这是一篇很棒的文章。这是我的贡献:使用www-data作为所有者和dev-fabrikam作为组的缺点(在中提到) 你可以吃蛋糕,也可以吃 也适用于(反过来)提供的场景 由单个用户维护。在这种情况下,每当Apache创建一个文件夹或文件时,用户将无法访问它,因此需要将文件重新提供给原始用户。我没有更新答案,因为我对我的陈述并不是100%肯定。在修补答案之前,我宁愿让其他人确认一下。


我想知道为什么这么多人使用(或推荐)Linux权利的“其他”(o)部分来控制Apache(和/或PHP)的功能。通过将此正确的部分设置为“0”之外的其他部分,您只需允许整个世界对文件/目录执行某些操作。

我的方法如下:

  • 我创建了两个独立的用户。一个用于SSH / SFTP访问(如果需要),它将拥有所有文件,一个用于PHP FastCGI用户(网站将运行的用户)。我们分别给这些用户打电话 短发 和 鲍勃 - WWW
  • 短发 将拥有完整的权利(RWX 在文件夹上, RW- 在文件上),以便他/她可以阅读和编辑整个网站。
  • PHP FastCGI进程需要 R-X 文件夹和权利 R-- 文件的权限,除了非常特定的文件夹,如 cache/ 要么 uploads/,还需要“写入”权限。为了给PHP FastCGI这个能力,它将运行为 鲍勃 - WWW,和 鲍勃 - WWW 将被添加到自动创建的 短发 组。
  • 我们现在确保所有目录和文件的所有者和组 鲍勃鲍勃
  • 缺少一些东西:即使我们使用FastCGI,但Apache仍然需要读取访问权限,对于静态内容,或.htaccess文件,它将尝试读取 AllowOverride 设置为别的东西 None。避免使用 Ø 部分权利,我补充说 www数据 用户到 短发 组。

现在:

  • 为了控制开发人员可以做什么,我们可以玩 ü 部分权利(但这是下面的说明)。
  • 要控制Apache和PHP可以做什么,我们可以使用 G 部分权利。
  • Ø part始终设置为0,因此服务器上没有其他人可以读取或编辑网站。
  • 什么时候没有问题 短发 用户创建新文件,因为它将自动属于其主要组(短发)。

这是一个回顾,但在这种情况下, 短发 允许SSH。如果不允许任何用户修改网站(例如,客户只通过CMS管理面板修改网站并且没有Linux知识),无论如何都要创建两个用户,但是 /bin/false作为壳 短发 同样,并禁用其登录。

    adduser --home /var/www/bobwebsite --shell /bin/bash bob
    adduser --no-create-home --shell /bin/false --disabled-login --ingroup bob bob-www
    adduser www-data bob
    cd /var/www/bobwebsite
    chown -R bob:bob .
    find -type d -exec chmod 750 {} \;
    find -type f -exec chmod 640 {} \;

注意 : 人们往往会忘记限制 ü (所有者)权利大多数时间是无用和不安全的,因为文件的所有者可以运行 chmod 命令,甚至权利都是000。

告诉我,如果我的方法有一些安全问题,因为我不是100%肯定,但它是我正在使用的。

我认为这个配置有一个问题:当PHP / Apache创建一个新文件(例如上传)时,它将属于 鲍勃 - WWW:鲍勃,和 短发 只能读它。也许setuid在目录上可以解决问题。


13
2017-07-19 21:42



Linux忽略了 setuid。新文件始终由创建者拥有。 - Paul
我不明白。当更多的开发人员在网站上同时工作时,这似乎并没有包含这种情况,因为唯一的用户是 bob。你怎么处理那件事呢?例如。通过ssh,两个用户都以bob身份登录。 bob(1)感觉他/她不记得密码并将其更改为另一个但仍然安全。 bob(2)下次尝试登录,他/她不能。 - n611x007
@naxa任何边缘良好的系统都不应该让任何开发人员直接修改网站。理想情况下,网站受版本控制,以便用户帐户“bob”自动拉取并部署每个(稳定)版本。因此,开发人员在异地进行开发,并且在将更改推送到部署服务器后进行部署。 'bob'是系统用户,其网络权限非常有限,不包括远程登录; iptables实际上允许你通过UID过滤这样的东西。 - Parthian Shot
“我想知道为什么这么多人使用(或推荐)”其他“(o)部分” - 那么也许你应该把这个作为问题发布而不是回答。故意运行具有最低权限级别的Web服务器(作为系统中最暴露的部分)并不常见,而支持,开发,管理帐户也需要不同的访问权限 - symcbean


考虑到上述优秀答案的谷歌排名,我认为应该注意一件事,我似乎无法在答案后留下一个注释。

继续该示例,如果您计划将www-data用作所有者,并将dev-fabrikam用作对目录(或文件)具有570权限的组,请务必注意 Linux忽略了  setuid,因此所有新文件都将由创建它们的用户拥有。这意味着在创建新目录和文件后,您将不得不使用类似于:

chown -R www-data /newdirectory/
chmod -R 570 /newdirectory/

在Ubuntu 12.04 for Rackspace OpenStack中,我遇到了一个奇怪的问题,在我重新启动服务器之前我无法获得权限570,这极大地解决了问题。在那个看似简单的问题上,头发的丢失率越来越高......


9
2018-01-13 22:03



请用谷歌搜索:在Raspbian(也就是在树莓派上,如果你想在lighttpd(或其他网络浏览器)下更改/ var / www的所有权,你必须重新启动。 - gbronner
@gbronner如果找到解决方案是一个难题,您可以考虑将其作为问题发布并提供问题的答案。但是,它可能更适合于不同的SE问答网站。我的猜测是 Unix和Linux 可能是一个很好的地方。 - Paul
还有raspberrypi.stackexchange.com;似乎SE网站正在分解知识。 - gbronner
@gbronner哈哈。我不知道那一个! U&L上的Raspbian标签有120个问题。 - Paul


我使用这个配置:

  1. 所有目录除了上传一个设置为所有者 root 和小组 root,权限 0755
  2. 所有文件都设置为所有者 root 和小组 root,权限 0644
  3. 上传目录设置为所有者 root,小组 www-data,权限 1770。粘滞位不允许组所有者删除或重命名内部的目录和文件。
  4. 在uploads文件夹里面有一个新目录 www-data 所有者用户和组,以及 0700 每个人的权限 www-data 上传文件的用户。
  5. Apache配置:

拒绝 AllowOverride 和 Index 在uploads目录中,以便Apache不读取 .htaccess 文件和Apache用户无法索引uploads文件夹的内容:

<Directory /siteDir>
   Options -Indexes
</Directory>

<Directory /siteDir/uploadDir>
   AllowOverride none
</Directory>

6。 php.ini 组态:

open_basedir = /siteDir:/tmp:/usr/share/phpmyadmin
post_max_size = 5M
file_uploads = On
upload_max_filesize = 3M
max_file_uploads = 20

有了这个配置, www-data 用户将无法进入除。之外的目录 siteDir/  /tmp 和 /usr/share/phpmyadmin。您还可以控制同一请求中的最大文件大小,最大帖子大小和要上载的最大文件。


3
2017-10-23 09:54





如果您有一个名为“leo”的FTP用户需要将文件上传到example.com web目录,您还需要“apache”用户能够在缓存目录中创建uploa-files / sessions / cache文件,然后执行以下操作:

此命令将leo指定为所有者和组作为apache到example.com,apache用户是组apache的一部分,因此它将继承apache组的权限

chown -R leo:apache example.com

另一个确保正确许可并满足安全性问题的命令。

chmod -R 2774 example.com

这里的第一个数字2用于目录,并确保创建的每个新文件将保留在相同的组和所有者权限中。 77是所有者和组意味着他们有完全访问权限。 4是为他人意味着他们只能读低谷。

以下内容有助于理解权限号码

Number  Octal Permission Representation
0   No permission
1   Execute permission
2   Write permission
3   Execute and write permission: 1 (execute) + 2 (write) = 3
4   Read permission
5   Read and execute permission: 4 (read) + 1 (execute) = 5
6   Read and write permission: 4 (read) + 2 (write) = 6
7   All permissions: 4 (read) + 2 (write) + 1 (execute) = 7

3
2017-08-09 07:15