/ var / www目录由root:root拥有,这意味着没有人可以使用它,它完全没用.既然我们都想要一个实际工作的Web服务器(并且没有人应该以“root”身份登录),那么我们需要解决这个问题.
只有两个实体需要访问权限
> PHP / Perl / Ruby / Python都需要访问文件夹和文件,因为它们创建了许多文件夹和文件(即/ uploads /).这些脚本语言应该在Nginx或apache下运行(甚至可以在FastCGI for PHP之类的其他东西上运行).
>开发人员
他们如何获得访问权限?我知道有人,某个地方以前做过这件事.然而,有数十亿的网站,你会认为会有更多关于这个主题的信息.
我知道777是所有者/组/其他人的完全读/写/执行权限.因此,这似乎不需要正确,因为它为随机用户提供了完全权限.
需要在/ var / www上使用哪些权限,以便:
>源代码控制,如git或svn
>像“网站”这样的群组中的用户(甚至添加到“www-data”)
> apache或lighthttpd等服务器
>和PHP / Perl / Ruby
可以在那里读取,创建和运行文件(和目录)吗?
如果我是正确的,Ruby和PHP脚本不会直接“执行” – 而是传递给解释器.所以不需要对/ var / www中的文件执行权限吗?因此,似乎正确的许可将是chmod -R 1660
>这四个实体可共享的所有文件
>所有错误的文件都是不可执行的
>完全阻止目录中的其他人
>将所有未来文件的权限模式设置为“sticky”
它是否正确?
更新1:我刚刚意识到文件和目录可能需要不同的权限 – 我在谈论上面的文件,所以我不确定目录权限需要什么.
更新2:/ var / www的文件夹结构发生了巨大变化,因为上面四个实体之一总是添加(有时删除)多个级别的文件夹和子文件夹.他们还创建和删除其他3个实体可能需要读/写访问权限的文件.因此,权限需要对文件和目录执行上述四项操作.由于它们都不需要执行权限(请参阅上面关于ruby / PHP的问题)我会假设rw-rw-r–权限将是所有需要且完全安全的,因为这四个实体由受信任的人员运行(请参阅# 2)系统上的所有其他用户只有读访问权限.
更新3:这适用于个人开发机器和私人公司服务器.没有像共享主机那样的随机“网络客户”.
更新4:This article by slicehost似乎是最好的解释为www文件夹设置权限所需的内容.但是,我不确定用PHP或svn / git运行的用户或组apache / Nginx以及如何更改它们.
更新5:我(我认为)终于找到了一种方法来使这一切工作(下面回答).但是,我不知道这是否是正确且安全的方法.因此我开始了赏金.拥有保护和管理www目录的最佳方法的人获胜.
解决方法
> sudo usermod -a -G developer user1(将每个用户添加到开发者组)
> sudo chgrp -R developer /var/www/site.com/,以便开发人员可以在那里工作
> sudo chmod -R 2774 /var/www/site.com/以便只有开发人员才能创建/编辑文件(其他/世界可以阅读)
> 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