通常的Web项目目录有什么完美的Unix权限?


12

在编写的Web应用程序中,以下内容的八进制格式的最佳最小权限是什么?

  1. 用户上载静态文件(images / swf / js文件)的目录
  2. 管理员上载静态文件(images / swf / js文件)的目录
  3. 应用程序中使用的库所在的目录
  4. 可执行/可浏览服务器端脚本将驻留的目录
  5. 服务器端代码将在其中编辑现有文件(txt或xml)的目录

这是我的建议和理由

  1. 555,每个人都可以读写,没有人可以执行
  2. 544,所有者只能写,其他人只能读,没有人可以执行
  3. 000,没有人需要读取,写入或执行,只会被Web服务器使用吗?
  4. 661,所有者可以读取,写入,其他所有人只能执行
  5. 600,所有者可以读写(可能不需要),没有其他人可以做任何事情

现在我对两件事感兴趣:

  1. 在第一个列表中我遗漏了一些基于Web的应用程序中常用的东西吗?
  2. 您在第二个列表中有什么不同意的地方吗?您有什么选择?为什么它更好呢?

1
我不明白为什么人们现在使用ACL ...
pfo 2012年

Answers:


20

假设“ Web应用程序”在服务器(例如apache,nginx等)上运行,并且是用某种动态脚本语言(例如PHP,Ruby等)编写的,则您对“用户”的身份有误解。

用户不是登录到您的应用程序的人-并且,他们在应用程序中的角色(管理员等)与方案完全无关。该用户是运行该进程的Linux系统用户。您网站的代码仅以一个用户身份运行-它可能是您的Web服务器用户(这不是一件好事),或者可能是特定于您网站的用户(更好)。

在linux上,用户属于组-我们可以将用户添加到另一个组,并为该组分配特权。

良好的设置将使您的服务器以一个用户身份运行(我们称此用户为“ webserver”),而动态脚本语言(例如通过FastCGI)以其自己的用户身份运行(每个站点一个用户-我们将第一个用户称为“ site1”) 。

要提供文件,Web服务器需要访问它们,脚本语言需要访问它们。这意味着:“ site1”和“ webserver”需要能够读取您的文件。但是,其中只有一个可以“拥有”文件。所有者是“用户”(在用户,组中,其他)。我们还需要脚本语言才能写入目录(并读取其写入的文件)。因此,用户“ site1”需要读写权限。由于我们希望组和其他权限尽可能严格,因此我们的“所有者”将是“ site1”,并且将读写相应的用户权限。

由于我们无法将我们的网络服务器的权限指定为另一个“用户”,因此我们将“网络服务器”添加到“ site1”组(您当然可以创建一个同时包含“ site1”和“ webserver”的其他组。全部)该组的成员将被赋予相同的权限,(用户,组,其他集合中)最宽松的权限将应用于任何给定的用户,以确定他们的权限。

值得注意的是,良好的设置不应要求文件具有动态语言的执行权限。这些文件不是直接运行,而是被读入解释器-运行典型脚本(一个不写任何东西的脚本)仅需要读取权限。

目录的“执行”权限具有不同的含义-允许遍历而无法读取内容。为了能够读取目录中的文件,用户必须对目录上方的每个目录都具有“执行”权限。

对于Web应用程序,每个文件都必须具有其所有者的读取权限-否则,它是一个毫无意义的文件。无论用户还是管理员(通过Web应用程序)上传文件,“所有者”(即动态语言)都需要具有写权限。有效的设置将尝试直接通过Web服务器提供静态文件,因为动态语言在读取大文件和回显内容方面往往比较慢。因此,Web服务器需要对您的静态文件具有读取权限。

因此,最小文件权限可能是:

  • 用户上载静态文件(images / swf / js文件)的目录中的文件将位于:640
  • 管理员上载静态文件(images / swf / js文件)的目录中的文件将位于:640
  • 应用程序中使用的库所在的目录中的文件:400(或440)
  • 可执行文件/可浏览服务器端脚本将驻留在目录中的文件:400(或440)
  • 目录中的文件,将通过服务器端的代码在其中编辑现有文件(txt或xml):640或600
    • (取决于Web服务器是否会不时显示这些内容,而有时会显示这些内容)

同时,最小目录权限可能是:

  • 用户上载静态文件(图像/ swf / js文件)的目录将位于:750
  • 管理员上载静态文件(images / swf / js文件)的目录将位于:750
  • 应用程序中使用的库所在的目录:500(或550)[至少应为510]
  • 可执行/可浏览服务器端脚本将驻留的目录:500(或550)[至少应为510]
  • 服务器端代码将在其中编辑现有文件(txt或xml)的目录:750或700
    • (取决于Web服务器是否会从此处提供文件,有时不做修改)

再一次-您的Web服务器必须在其需要访问的目录上方的每个目录上都具有“执行”权限-因此,即使该Web服务器不提供给定目录中的文件,我们也应为其授予执行权限。

授予Web服务器对大多数文件的读取访问权限是很普遍的(因此,请将500更改为550)。默认的“有点安全”权限通常是目录755和文件644-没有执行权限,每个人都可以读取,只有用户可以写-您会注意到Linux系统上的绝大多数文件都具有这些权限。

请记住,“其他”权限是指不是所有者或组中的任何系统用户(即,其余所有系统用户)。限制您的“其他”权限是件好事,因为这些用户是未知的-您尚未明确授予他们权限。其他权限通常是最容易在受感染系统上利用的权限(例如/ tmp是常见目标的原因之一)。

在上述情况下,我认为您的最后两个问题无关紧要。将您的目录权限设置为550(并将文件权限设置为440),然后向用户授予您的应用程序要写入的任何目录的写权限(即,目录:750;文件:640)。

(您显然需要写许可权才能上传文件-但是,如果愿意,您可以在以后将其删除-可以说,如果有人正在写一个只有所有者可以写的目录-您的帐户已被盗用-这是一个保留限制性权限的原因)。


@Iain:绝对-当时正在考虑文件权限-可以解决此问题-谢谢。
cyberx86

1

具有完成工作的最小权限集是正常的。如果您的网络服务器和用户共享一个公共组,则可以无需授予任何访问权限o。权限也与用户有关。您似乎对八进制权限有误解。

  1. 555 r-xr-xr-x不是rw-rw-rw。由于它是创建/删除文件的目录,x因此您需要设置文件,因此750 rwxr-x---将是一个不错的起点。这使拥有目录的用户可以添加/删除文件,而公共组中的每个人都可以访问它们。
  2. 与上面的1.相同。
  3. 如果它们是真正的静态文件,则050将为Web服务器提供访问权限,但是首先要创建文件是750。
  4. 与上面的3相同。
  5. 070是允许Web服务器读取和更改文件的最低要求,但是需要创建文件,因此770可能更现实。

Web服务器是否不需要该目录的执行权限即可读取文件(第1点(740?),3、5)?
cyberx86 2012年

h!确实x是访问文件所必需的,r仅允许您列出它们。
user9517 2012年

0

通常,如果在文件系统中使用BSD语义装载文件系统,则在目录上使用0755、0775或2775模式(对于BSD和Linux,目录上的SGID位将使新文件的组关联与父目录设置相匹配,而不是文件创建者的默认GID)。这样,所有用户都可以遍历(chdir进入并通过)并读取(运行ls命令或执行readdir / read系统调用)相关目录。备选方案增加了组/写选项,并且如前所述,目录上的SGID位可以帮助使所有文件和子目录与合适的组关联。

对于文件,通常将使用0644或可能使用0664(世界可读,是否可以组写入)。显然,对于CGI脚本和二进制文件,必须添加x位。对于某些特殊情况,如果二进制文件经过了严格的测试,则可能会添加SUID或SGID位。通常,UNIX和Linux将忽略脚本上的SUID / SGID位,而仅保留其本机已编译可执行二进制文件的语义。但是,您可能会在Apache之类的站点上运行带有“ setuidhack”之类的模块的站点,该模块甚至可以在解释的脚本上用于使Web服务器使用SUID / SGID位。(这是通过HTTP守护程序stat()来处理每个文件,并使用其自己的自定义fork()/ execve()代码来完成的,将正确的解释器字符串插入execve()向量中,而不是简单地传递可执行文件。

这些只是最一般的准则。它们并非在所有情况下都是“完美”的,因此您绝对应该查阅Web服务器以及要安装和配置的任何Web应用程序或框架的文档,并且可能在您开始之前先咨询UNIX安全专家。将您的任何文件,代码或服务器公开到公共Internet。

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.