更新后的摘要

/ var / www目录归root:root所有,这意味着没有人可以使用它,并且它完全没有用。由于我们都希望Web服务器能够正常工作(并且没有人应该以“ root”身份登录),因此我们需要修复此问题。

只有两个实体需要访问。


PHP / Perl / Ruby / Python都需要访问文件夹和文件,因为它们创建了许多文件夹和文件(例如,/uploads/ )。这些脚本语言应在nginx或apache下运行(甚至需要在PHP上使用FastCGI之类的其他方式)。
开发人员

他们如何获得访问权限?我知道有人在某个地方做过此事。然而,在拥有数十亿个网站的情况下,您会认为会有更多关于此主题的信息。


我知道777对所有者/组具有完全的读取/写入/执行权限/其他。因此似乎并不需要正确,因为它赋予了随机用户完整的权限。

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


诸如git或svn之类的源代码
“网站”(或什至添加到“ www-data”)组中的用户
apache或lighthttpd之类的服务器以及PHP / Perl / Ruby

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

如果我是正确的话,Ruby和PHP脚本不会直接“执行”,而是传递给解释器。因此,无需对/var/www中的文件执行权限...?因此,似乎正确的权限将是chmod -R 1660,这将使这四个实体可以共享所有文件
不能错误执行的所有文件

完全禁止其他人进入目录
将以后所有文件的权限模式设置为“粘滞”

这是正确的吗?

更新1:我只是意识到文件和目录可能需要不同的权限-我在上面谈论文件,因此我不确定目录权限将是什么。

更新2:/var/www的文件夹结构发生了巨大变化,因为上述四个实体之一总是添加(有时是删除)许多级别的文件夹和子文件夹。它们还会创建和删除其他3个实体可能需要读/写访问权限的文件。因此,权限需要对文件和目录执行以上四项操作。由于它们都不需要执行许可(请参阅上面有关ruby / php的问题),我将假设rw-rw-r--许可将是所有必要的并且完全安全,因为这四个实体都是由受信任的人员(请参阅#2)和所有其他用户运行的系统上的计算机仅具有读取访问权限。

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

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

更新5:我终于找到了一种方法使所有这些都起作用(下面的答案)。但是,我不知道这是否是正确且安全的方法。因此,我开始了赏金计划。拥有保护和​​管理www目录的最佳方法的人将获胜。

#1 楼

经过更多研究之后,似乎另一种(可能是更好的方法)来回答这个问题,是像这样设置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

评论


在我看来合理。

– Wazoox
10 Mar 26 '10在11:24

好。也许如果我可以和更多的人确认这一点,我将使用这种方法。这似乎是我能够挤出人们的最佳答案。

– Xeoncross
10 Mar 26 '10在18:59

您没有指定谁将是文件的所有者。您将其保留为根吗?然后只有sudoers可以编辑您的上载文件夹(可能不是您想要的)。

– Nic
10 Mar 26 '10在23:18

是的,root将仍然是所有者。但是,由于组所有者现在是“开发人员”(并且具有wrx许可),因此所有开发人员(和apache / nginx)也可以阅读。不需要sudo。

– Xeoncross
10 Mar 27 '10在3:00



需要注意的另一件事是umask。许多系统的默认umask为022,它将删除组和公共文件对新文件的写许可权。我怀疑您想要002(不公开)或007(不公开)。您可以在Apache的配置和/或启动脚本中为需要访问目录的任何进程设置umask。不要忘记将其添加到/ etc / profile或/ etc / bashrc中,以便默认情况下也为开发人员设置它

–马克·波特(Mark Porter)
10 Mar 27 '10在15:06

#2 楼

我不确定是否正确,但是这是我在服务器上执行的操作:


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

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

评论


git / svn或PHP如何创建新文件夹?

– Xeoncross
2010-3-22在16:10

PHP在与Web服务器相同的用户上下文中运行,因此它可以在Web服务器拥有的任何目录中创建文件和文件夹。通常只有几个这样的文件夹(例如,/ uploads /)。我不确定git / svn-您可以将它们添加到控制网站的组帐户中吗?

– Nic
2010-3-22在20:00

显然git与用户运行时一样运行-就像其他任何工具一样。

– Xeoncross
10 Mar 24 '10在3:30

然后将git用户添加到apache组,并赋予文件夹组写权限。

– David Rickman
10 Mar 26 '10在11:48

我刚刚说过,git没有用户-它以当前使用它的用户身份运行。

– Xeoncross
10 Mar 26 '10在18:58

#3 楼

经过更多研究后,看来git / svn TOOLS并不是问题,因为它们可以在任何用户使用它们的情况下运行。 (但是git / svn守护程序是另一回事!)我用git创建/克隆的所有东西都有我的权限,并且git工具在/usr/bin中列出,符合本论文的要求。

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

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

默认情况下,/var/wwwroot: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目录

更改权限,以便仅所有者(根)和“ www-data”组中的所有用户n个rwx(读/写/执行)文件和目录(甚至没有人可以访问它)。

sudo chmod -R 2770 /var/www


现在任何人创建的所有文件和目录具有访问权限的用户(即“ www-data”组中的内容)可以被apache读取,也可以被php读取。

这是正确的吗? PHP / Ruby创建的文件又如何-www数据用户可以访问它们吗?

评论


我不喜欢用PHP编写所有Web文件的想法,如果存在脚本漏洞,它会增加您的曝光率。

– Nic
10 Mar 24 '10在14:49

好的,我知道我使用PHP创建了许多文本,tar,日志和图像文件(以及文件夹),因此我只是假设一切都应该是可写的。但是,也许您的权利和PHP应该只能更改它创建的文件,这将是无害的,因为所有PHP应用程序中有99%从未制作脚本文件。另一个选择似乎是只允许某些目录对PHP进行写访问(/ uploads /),但这没有进行,因为那样一来,PHP仍可用于在该目录中创建错误的内容。有任何想法吗?

– Xeoncross
2010-3-24在16:31

尝试将脚本和数据分开。即使攻击者设法在/ uploads /中删除了某些内容,它也不应该是可执行的。分层安全是关键。

– Nic
2010-3-26的1:16

#4 楼

粘性不是权限继承。目录上的粘滞性意味着,尽管权限另有说明,但只有文件所有者或目录所有者才能在目录中重命名或删除该文件。因此,在/ tmp /上为1777。

在经典Unix中,没有基于文件系统的权限继承,仅基于当前进程的umask。在* BSD或目录上带有setgid的Linux上,新创建的文件的group字段将设置为与父目录相同的字段。除此之外,您还需要查看ACL,并在目录上使用“默认” ACL,以确保您拥有继承的权限。

您应该先定义:
*用户拥有什么访问系统
*您的威胁模型是什么

例如,如果您正在与多个客户进行网络托管,并且您不希望他们看到彼此的文件,那么您可能对所有这些用户使用一个公共组“ webcusts”,目录模式为0705。然后,由webserver进程提供服务的文件(不在“ webcusts”中)将看到“其他”权限,并被允许;客户看不到彼此的文件,而用户可能会弄​​乱自己的文件。但是,这确实意味着,一旦允许CGI或PHP,就必须确保进程以特定用户的身份运行(无论如何,对于一个主机上的多用户而言,这是一个好习惯,以确保问责制)。否则,客户可能会因为拥有CGI而使对方的文件混乱。

但是,如果网站的运行时用户与该网站的所有者相同,那么您确实拥有在脚本中存在安全漏洞的情况下,无法保护内容免受滥用者侵害的问题。专用主机在哪里赢了,因此您可以拥有一个与静态内容所有者不同的运行时用户,而不必担心与其他用户的交互。

评论


好答案。在MacOS X上,系统的行为就像自动将SGID位放在目录中一样。粘滞位通常意味着您只能删除可以写入的文件。也就是说,任何人都可以删除/ tmp中的公共可写文件。在MacOS X上,/ tmp是用户专用目录的符号链接-毕竟没有共享。

–乔纳森·莱弗勒(Jonathan Leffler)
2010-3-22在5:19

感谢您的回答,我已用更多信息更新了问题。

– Xeoncross
2010-3-22在16:09

乔纳森(Jonathan):粘滞位表示只有目录的所有者或文件的所有者才能重命名或删除它(即,根据目录在“文件”中的输入进行操作)。这些目录操作(rename(),unlink())对单个文件的权限不起作用,仅对文件本身的操作(open())起作用。这是“通常”的行为。

– Phil P
10 Mar 29 '10在23:37

#5 楼

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

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

评论


+1获取有关ACL的有用信息。但是,我不希望多余的垃圾使系统陷入瘫痪,只是为了与几个开发人员一起管理一台简单的服务器。我也对重新编译内核以使用ACL感到不满意。

– Xeoncross
10 Mar 26 '10在17:01

@ Xeoncross:ACL不会停顿任何东西。它们只是像普通文件权限一样的元信息。并不是所有的“额外”和复杂的事情,我相信这是管理权限的最简单,最好的方法,而不是一些令人困惑的粘性/组/任何解决方案。不要害怕,只需重新安装ACL并尝试一下!

–领带战士
2010-3-28在18:21

#6 楼

文件的所有者应该是创建文件的人,而组应该是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 {} \;


#7 楼

除了@Xeoncross的答案外,我认为最好分别配置文件和目录的权限。

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中创建和修改目录。这似乎很重要,因为开发人员可能需要创建其他目录或删除不再需要的目录。

它还允许开发人员创建和修改代码文件(读取HTML,PHP文件等) 。但是,仍将仅允许其他所有人进行只读访问。