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

更新摘要

/ var / www目录由root:root拥有,这意味着没有人可以使用它,这是完全没有用的。 既然我们都想要一个真正有效的web服务器(而且没有人应该以“root”身份login),那么我们需要解决这个问题。

只有两个实体需要访问。

  1. PHP / Perl / Ruby / Python都需要访问文件夹和文件,因为他们创build了许多文件(即/uploads/ )。 这些脚本语言应该在nginx或apache下运行(或者甚至像FastCGI for PHP一样)。

  2. 开发者

他们如何获得访问? 我知道有人在某个地方做过这个事情。 不过,有数十亿的网站,你会认为会有更多关于这个话题的信息。


我知道777是完全读/写/执行所有者/组/其他的权限。 所以这似乎并不需要正确,因为它给随机用户的完整权限。

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

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

都可以读取,创build和运行文件(和目录)吗?

如果我是正确的,Ruby和PHP脚本不是直接“执行”,而是传递给解释器。 所以没有必要对/var/www文件执行许可…? 因此,似乎正确的许可将会是chmod -R 1660

  1. 这四个实体共享的所有文件
  2. 所有文件都是不可执行的
  3. 完全阻止目录中的其他人
  4. 将所有未来文件的权限模式设置为“sticky”

它是否正确?

更新1:我刚刚意识到,文件和目录可能需要不同的权限 – 我正在谈论上面的文件,所以我不知道什么目录权限将需要。

更新2: /var/www的文件夹结构急剧变化,因为上述四个实体之一总是添加(有时删除)很多级别的文件夹和子文件夹。 他们还创build和删除其他3个实体可能需要读/写访问的文件。 因此,权限需要对文件和目录做以上四件事情。 因为他们都不需要执行权限(请参阅上面关于ruby / php的问题),我会假设rw-rw-r--权限将是所有需要的,并且完全安全,因为这四个实体由可信人员运行(请参阅# 2)系统上的所有其他用户只能读取访问权限。

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

更新4:由slicehost 这篇文章似乎是最好的解释什么是需要为您的www文件夹设置权限。 但是,我不确定PHP或svn / git运行的用户或组apache / nginx以及如何更改它们。

更新5:我(我想)终于find了一个方法来得到这一切工作(下面的答案)。 但是,我不知道这是否是正确和安全的方式来做到这一点。 所以我开始了赏金。 拥有保护和​​pipe理www目录的最佳方法的人获胜。

    经过更多的研究似乎是另一种(可能更好的方法)来回答这个问题就是像这样设置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/这样只有开发者可以创build/编辑文件(其他/世界可以读取)
    4. sudo chgrp -R www-data /var/www/site.com/uploads这样www-data(apache / nginx)就可以创build上传了。

    因为git以用户调用它的方式运行,只要用户在“开发者”组中,他们应该能够创build文件夹,编辑PHP文件以及pipe理git存储库。

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

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

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

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

    在做了更多的研究之后,似乎git / svn 工具不是一个问题,因为它们以任何用户正在使用的方式运行。 (但是,git / svn守护进程是另外一回事!)我用git创build/克隆的所有东西都有我的权限,git工具被列在/usr/bin ,符合这个论点。

    Git权限解决了。

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

    所以这个问题的答案似乎是这样的:

    默认情况下, /var/www属于root:root没有人可以在其中添加或更改文件。

    1)更改组所有者

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

     sudo chgrp -R www-data /var/www 

    2)添加用户到万维网数据

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

     sudo usermod -a -G www-data demousername 

    3)CHMOD www目录

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

     sudo chmod -R 2770 /var/www 

    现在,任何有权访问的用户创build的文件和目录(即“www-data”组)都可以通过apache进行读写。

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

    粘性不是权限inheritance。 对目录的粘滞性意味着只有文件的所有者或目录所有者才能重命名或删除目录中的该文件,尽pipe权限不是这样说的。 因此1777上/ tmp /。

    在传统的Unix中,没有基于文件系统的权限inheritance,只有当前进程的umask。 在* BSD上,或在目录上有setgid的Linux,新创build文件的组字段将被设置为与父目录相同。 对于其他事情,您需要查看ACL,并在目录上使用“默认”ACL,这样可以让您拥有inheritance的权限。

    您应该首先定义:*哪些用户可以访问系统*您的威胁模型是什么

    例如,如果您正在与多个客户进行networking托pipe,并且您不希望他们看到其他人的文件,那么您可以为所有这些用户使用一个公共组“webcusts”,目录模式为0705。 webserver进程( 不在 “webcusts”)将会看到其他的perms并被允许; 客户不能看到彼此的文件,用户可能会惹祸于自己的文件。 但是,这意味着当你允许CGI或者PHP的时候,你必须确保这些进程像特定的用户那样运行(无论如何,对于多用户一主机来说,这是一个良好的实践)。 否则,客户可以通过让CGI这样做来混淆彼此的文件。

    但是,如果网站的运行时用户与网站的所有者相同,则在脚本中出现安全漏洞的情况下,您无法保护内容不受滥用者的影响。 哪里是专用主机赢的地方,这样你就可以拥有一个与静态内容所有者截然不同的运行时用户,而不必担心与其他用户的交互。

    我相信最好的方法是使用Posix ACL。 他们很乐意与您合作并提供您所需要的所有function。

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

    这是一个如何使用ACL的指南。 根据您的发行版,您的内核可能已经包含ACL支持。

    http://www.cs.unc.edu/cgi-bin/howto?howto=linux-posix-acls

    该文件的所有者应该是创build它的人,而该组应该是www-data。 目录/文件的模式通常是755/644。 而目录和文件组需要写入访问MOD是775/664。 假设稻田是开发商。 总之这使得:

     chown -R paddy:www-data /var/www/websiteindevelopment chmod -R 755 /var/www/websiteindevelopment chmod -R 775 /var/www/websiteindevelopment/directorywritablebygroup find /var/www/websiteindevelopment -type f -perm 755 -print -exec chmod 644 {} \; find /var/www/websiteindevelopment -type f -perm 775 -print -exec chmod 664 {} \; 

    添加到@ Xeoncross的答案,我认为这将是很好的文件和目录分别configuration权限。

     sudo find /var/www -type d -exec chmod 775 {} \; # Change permissions of directories to rwxrwxr-x sudo find /var/www -type f -exec chmod 664 {} \; # Change file permissions to rw-rw-r-- 

    这将允许开发人员在/ var / www中创build和修改目录。 这似乎很重要,因为开发人员可能需要创build额外的目录或删除不再需要的目录。

    它还将允许开发人员创build和修改代码文件(读取HTML,PHP文件等)。 但是,仍然只允许其他人以只读方式访问。