我的网站文件/文件夹在 Linux 网络服务器上应该有什么权限?

Nic*_*Nic 344 security linux permissions web-server apache-2.2

这是一个关于 Linux Web 服务器上文件权限的规范问题

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

/var/www/contoso.com/
/var/www/contoso.net/
/var/www/fabrikam.com/
Run Code Online (Sandbox Code Playgroud)

基本目录 /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
Run Code Online (Sandbox Code Playgroud)

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

Nic*_*Nic 375

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

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

匿名用户是您网站的访问者。尽管他们没有直接访问文件的权限,但他们可以请求一个网页,而 Web 服务器代表他们进行操作。您可以通过注意 Web 服务器进程具有哪些权限来限制匿名用户的访问。在许多 Linux 发行版中,Apache 以www-data用户身份运行,但情况可能有所不同。使用ps aux | grep httpdps aux | grep apache查看 Apache 在您的系统上使用的用户。


linux权限注意事项

Linux 和其他 POSIX 兼容系统使用传统的 unix 权限。维基百科上有一篇关于文件系统权限的优秀文章,所以我不会在这里重复所有内容。但是,您应该注意一些事项。

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

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

默认权限值取决于您的 umask。umask 从新创建的文件中减去权限,因此 022 的常见值导致使用 755 创建文件。与组协作时,将 umask 更改为 002 很有用,以便组成员可以修改您创建的文件。如果您想自定义上传文件的权限,您需要更改 apache 的 umask 或在文件上传后运行 chmod。


777的问题

当您拥有chmod 777您的网站时,您就没有任何安全性。系统上的任何用户都可以更改或删除您网站中的任何文件。但更严重的是,请记住 Web 服务器代表您网站的访问者行事,现在 Web 服务器能够更改它正在执行的相同文件。如果您的网站中存在任何编程漏洞,它们可能会在您不知情的情况下被利用来破坏您的网站、插入网络钓鱼攻击或从您的服务器窃取信息。

此外,如果你的服务器运行在一个众所周知的端口上(它应该防止非 root 用户产生世界可访问的监听服务),这意味着你的服务器必须由 root 启动(尽管任何正常的服务器都会立即丢弃一旦端口被绑定到一个较低特权的帐户)。换句话说,如果您运行的网络服务器的主要可执行文件是版本控制的一部分(例如 CGI 应用程序),则保留其权限(或者,就此而言,包含目录的权限,因为用户可以重命名777 处的可执行文件)允许任何用户以root身份运行任何可执行文件。


定义要求

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

由单个用户维护

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

在您的情况下,用户名可能是 的 Eveeve是唯一维护 的用户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
Run Code Online (Sandbox Code Playgroud)

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

chmod g+w uploads
ls -l
drwxrws--- 2 eve      www-data   4096 Feb  5 22:52 uploads
Run Code Online (Sandbox Code Playgroud)

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


由一组用户维护

如果有多个用户负责维护站点,您将需要创建一个组以用于分配权限。为每个网站创建一个单独的组并以该网站命名该组是一种很好的做法。

groupadd dev-fabrikam
usermod -a -G dev-fabrikam alice
usermod -a -G dev-fabrikam bob
Run Code Online (Sandbox Code Playgroud)

在前面的示例中,我们使用组所有者向 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
Run Code Online (Sandbox Code Playgroud)

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

chown -R www-data uploads
ls -l
drwxrwxr-x 2 www-data     dev-fabrikam   4096 Feb  5 22:52 uploads
Run Code Online (Sandbox Code Playgroud)

虽然这是一种常见的方法,但也有一个缺点。由于系统上的每个其他用户都拥有与 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
Run Code Online (Sandbox Code Playgroud)

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

chmod u+w uploads
ls -l
drwxrwx--- 2 www-data  dev-fabrikam   4096 Feb  5 22:52 fabrikam.com
Run Code Online (Sandbox Code Playgroud)

使用此解决方案需要注意的一件事是,新文件的用户所有者将与创建者匹配,而不是设置为 www-data。因此,您创建的任何新文件在您 chown 之前都不会被 Apache 读取。


*Apache权限分离

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

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


其他注意事项

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

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

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

如果您的网站有复杂的要求,您可能需要编写一个脚本来设置所有权限。彻底测试它,然后保持安全。如果您发现自己出于某种原因需要重建您的网站,这可能是值得的。

  • “chmod -R 775 fabrikam.com”。大多数网站中很少有文件必须是可执行的;例如,php 脚本可以是 0640,只要 Web 服务器可以读取它们。chmod -R a+X fabrikam.com 将仅授予每个人对目录的可执行权限。 (14认同)
  • 请注意,Apache 在 Red Hat 派生系统上以用户 `apache` 运行。 (8认同)
  • @PatrickM - 实际上,我不同意我上个月的评论。`eve` 不必在 `www-data` 中_来编辑文件_,但是如果你希望 `eve` 能够编辑由 Apache 创建的文件,`eve` _确实需要在 `www-data` 中_ , _e.g._ 上传。 (2认同)

Fox*_*Fox 16

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

我的方法如下:

  • 我创建了两个独立的用户。一个用于 SSH/SFTP 访问(如果需要),它将拥有所有文件,另一个用于 PHP FastCGI 用户(网站将运行的用户)。让我们分别称这些用户为bobbob-www
  • bob将拥有完全权限(文件夹上的rwx,文件上的rw-),以便他/她可以阅读和编辑整个网站。
  • PHP FastCGI 进程需要对文件夹的rx权限和对文件的r--权限,除了非常特定的文件夹,如cache/uploads/,其中还需要“写入”权限。为了赋予 PHP FastCGI 这种能力,它将作为bob-www运行,并且bob-www将被添加到自动创建的bob组中。
  • 我们现在确保所有目录和文件的所有者和组都是bob bob
  • 缺少一些东西:即使我们使用 FastCGI,但 Apache 仍然需要读取访问权限,对于静态内容,或者如果AllowOverride设置为.htaccess 文件,它将尝试读取 .htaccess 文件None。为了避免使用o部分权限,我将www-data用户添加到bob组。

现在:

  • 为了控制开发人员可以做什么,我们可以使用u部分的权限(但这是下面的注释)。
  • 要控制 Apache 和 PHP 可以做什么,我们可以使用权限的g部分。
  • Ø部分总是被设置为0,所以没有其他人在服务器上可以读取或编辑该网站。
  • bob用户创建新文件时没有问题,因为它将自动属于其主组 ( bob )。

这是一个回顾,但在这种情况下,允许bob使用 SSH。如果不允许任何用户修改网站(例如,客户仅通过 CMS 管理面板修改网站并且没有 Linux 知识),无论如何创建两个用户,但/bin/false也为bob提供shell ,并且禁用其登录。

    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 {} \;
Run Code Online (Sandbox Code Playgroud)

注意:人们往往会忘记限制u(所有者)权限在大多数情况下是无用的和不安全的,因为文件的所有者可以运行chmod命令,即使权限是 000。

告诉我我的方法是否有一些安全问题,因为我不是 100% 确定,但这是我正在使用的。

我认为这个配置有问题:当 PHP/Apache 创建一个新文件(例如上传)时,它将属于bob-www:bob,而bob只能读取它。也许目录上的 setuid 可以解决问题。

  • @naxa 任何稍微好的系统都不应该让任何开发人员直接修改网站。理想情况下,网站处于版本控制之下,以便用户帐户“bob”自动拉取和部署每个(稳定)版本。因此,开发人员在异地进行开发,一旦将更改推送到部署服务器,就会部署更改。'bob' 是一个系统用户,应该拥有非常有限的网络权限,不包括远程登录;iptables 实际上允许您按 UID 过滤此类内容。 (2认同)

Pau*_*aul 9

鉴于google在上述优秀答案上的排名,我认为有一点需要注意,而且我似乎无法在答案后留下笔记。

继续这个例子,如果你打算使用 www-data 作为所有者和 dev-fabrikam 作为对目录(或文件)具有 570 权限的组,重要的是要注意Linux 忽略 setuid,因此所有新文件都将由创建它们的用户。这意味着在创建新目录和文件后,您将不得不使用类似于以下内容的内容:

chown -R www-data /newdirectory/
chmod -R 570 /newdirectory/
Run Code Online (Sandbox Code Playgroud)

在 Rackspace OpenStack 的 Ubuntu 12.04 中,我遇到了一个奇怪的问题,我无法获得 570 权限,直到我重新启动服务器,这神奇地解决了这个问题。在这个看似简单的问题上脱发的速​​度越来越快......


归档时间:

查看次数:

492565 次

最近记录:

4 年,7 月 前