如何设置 WWW 文件夹的 Linux 权限?

如何设置 WWW 文件夹的 Linux 权限?

更新摘要

/var/www 目录归 拥有,root:root这意味着没有人可以使用它,它完全没用。因为我们都想要一个真正能用的 Web 服务器(没有人应该以“root”身份登录),所以我们需要解决这个问题。

只有两个实体需要访问权限。

  1. PHP/Perl/Ruby/Python都需要访问文件夹和文件,因为他们创建了许多文件夹和文件(即/uploads/)。这些脚本语言应该在 nginx 或 apache 下运行(或者甚至在 PHP 中使用 FastCGI 等其他东西)。

  2. 开发商

他们如何获得访问权限?我知道某人,某处以前做过这个。然而,现在有数十亿个网站,你会认为应该有更多关于这个主题的信息。


我知道 777 是所有者/组/其他用户的完整读/写/执行权限。因此,这似乎没有必要,因为它会为随机用户提供完整权限。

需要使用哪些权限/var/www以便:

  1. git 或 svn 等源代码控制
  2. 属于“网站”等群组的用户(甚至添加到“www-data”
  3. 像 apache 或 lighthttpd 这样的服务器
  4. 以及 PHP/Perl/Ruby

都可以在那里读取、创建和运行文件(和目录)吗?

如果我没记错的话,Ruby 和 PHP 脚本不会直接“执行” - 而是传递给解释器。所以不需要对文件执行权限/var/www...?因此,似乎正确的权限应该chmod -R 1660

  1. 这四个实体可共享的所有文件
  2. 全部文件因错误而无法执行
  3. 完全阻止其他人访问目录
  4. 将未来所有文件的权限模式设置为“粘性”

它是否正确?

更新 1:我刚刚意识到文件和目录可能需要不同的权限 - 我上面的讨论是文件,所以我不确定目录权限需要什么。

更新 2:由于上述四个实体之一总是添加(有时删除)多层级的文件夹和子文件夹,因此文件夹结构/var/www发生了巨大变化。它们还创建和删除其他 3 个实体可能需要读写权限的文件。因此,权限需要对文件和目录执行上述四项操作。由于它们都不需要执行权限(请参阅上面关于 ruby​​/php 的问题),因此我认为rw-rw-r--权限就是所需的全部内容,并且完全安全,因为这四个实体由值得信赖的人员(参见#2)并且系统上的所有其他用户都只有读取权限。

更新 3:这是为个人开发机器和私人公司服务器准备的。没有像共享主机那样的随机“网络客户”。

更新 4: 本文由slicehost撰写的文章似乎最能解释设置www文件夹权限所需的内容。但是,我不确定运行PHP或svn/git的apache/nginx以哪个用户或组身份运行以及如何更改它们。

更新 5:我(我认为)终于找到了一种方法来让这一切发挥作用(答案如下)。但是,我不知道这是否是正确且安全的方法。因此,我发起了悬赏。拥有最佳保护和管理 www 目录方法的人将获胜。

答案1

经过进一步研究后,似乎另一个(可能更好的)回答这个问题的方法就是像这样设置 www 文件夹。

  1. sudo usermod -a -G developer user1(将每个用户添加到开发者组)
  2. sudo chgrp -R developer /var/www/site.com/以便开发人员可以在那里工作
  3. sudo chmod -R 2774 /var/www/site.com/这样只有开发人员可以创建/编辑文件(其他人/世界可以读取)
  4. sudo chgrp -R www-data /var/www/site.com/uploads以便 www-data(apache/nginx)可以创建上传。

由于git以任何用户调用的方式运行,因此只要用户属于“开发人员”组,他们就应该能够创建文件夹,编辑 PHP 文件和管理 git 存储库。

注意:在步骤 (3) 中:2774 中的“2”表示为目录“设置组 ID”。这会导致在其中创建的新文件和子目录继承父目录的组 ID(而不是用户的主要组)参考:http://en.wikipedia.org/wiki/Setuid#setuid_and_setgid_on_directories

答案2

我不确定这是否“正确”,但这是我在服务器上所做的:

  • /var/www 包含每个网站的文件夹。
  • 每个网站都有一个指定的所有者,该所有者被设置为该网站目录中所有文件和文件夹的所有者。
  • 所有维护该网站的用户都被放入该网站的一个组中。
  • 该组被设置为目录中所有文件和文件夹的组所有者。
  • 任何需要由 Web 服务器(即 PHP)写入的文件或文件夹的所有者都更改为 www-data,即 apache 运行的用户。

请记住,您应该在目录上启用执行位,以便您可以列出内容。

答案3

经过进一步的研究,似乎 git/svn工具不是问题,因为它们以任何用户的身份运行。(但是,git/svn 守护进程是另一回事!)我用 git 创建/克隆的所有内容都有我的权限,并且 git 工具已列出,/usr/bin这符合本文的观点。

Git 权限已解决。

通过将所有需要访问 www 目录的用户添加到www-dataapache(和 nginx)运行的组中,似乎可以解决用户权限问题。

因此看来一个答案这个问题的答案是这样的:

默认情况下/var/www归并root:root没有人可以在那里添加或更改文件。

1)更改群主

首先,我们需要将 www 目录组更改为“www-data”组,而不是“root”组

sudo chgrp -R www-data /var/www

2)将用户添加到 www-data

然后我们需要将当前用户(以及其他任何人)添加到 www-data 组

sudo usermod -a -G www-data demousername

3)CHMOD www 目录

更改权限,以便只有所有者(root)和“www-data”组中的所有用户可以 rwx(读/写/执行)文件和目录(其他人都不应该能够访问它)。

sudo chmod -R 2770 /var/www

现在,任何有访问权限的用户(即“www-data”组)创建的所有文件和目录都可以被 apache 和 php 读取/写入。

这是正确的吗?那么 PHP/Ruby 创建的文件呢 - www-data 用户可以访问它们吗?

答案4

我确实认为最好的方法是使用 Posix ACL。它们使用起来很方便,并且能提供您需要的所有功能。

http://en.wikipedia.org/wiki/Access_control_list#Filesystem_ACLs

相关内容