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


69

更新摘要

/ 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目录的最佳方法的人将获胜。

Answers:


47

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


在我看来合理。
wazoox

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

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

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

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

8

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

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

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


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

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

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

然后将git用户添加到apache组,并赋予文件夹组写权限。
大卫·里克曼

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

7

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

Git权限已解决。

通过将需要访问www目录的所有用户添加到www-data运行apache(和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目录

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

sudo chmod -R 2770 /var/www

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

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


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

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

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

6

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

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

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

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

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


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

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

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

2

我确实认为做到这一点的最佳方法是使用Posix ACL。它们使用起来很舒适,并提供您需要的所有功能。

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


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

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

1

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

0

除了@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文件等)。但是,仍然只允许其他所有人进行只读访问。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.