/ 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 #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/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目录
更改权限,以便仅所有者(根)和“ 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文件等) 。但是,仍将仅允许其他所有人进行只读访问。
评论
在我看来合理。
– 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