通常的 web 项目目录的完美 unix 权限是什么?

use*_*730 12 security linux permissions web-applications

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

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

以下是我的建议和理由

  1. 555,人人可以读写,没有人可以执行
  2. 544,一个人可以写,其他人只能读,没有人可以执行
  3. 000,没有人需要读、写和执行,只会被web服务器使用吗?
  4. 661,owner可以读,可以写,其他人只能执行
  5. 600,拥有者可以读、写(可能不需要),其他人无能为力

现在我对两件事感兴趣:

  1. 有没有我在第一个列表中遗漏的基于 Web 的应用程序中常用的东西?
  2. 在第二个列表中您是否有任何不同意的地方,您的替代方案是什么,为什么它更好?

cyb*_*x86 20

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

用户不是登录到您的应用程序的人——也就是说,他们在应用程序中的角色(管理员等)与场景完全无关。用户是进程运行所在的linux系统用户。您网站的代码仅作为一个用户运行 - 它可能是您的网络服务器的用户(这不是一件好事),也可能是您网站的特定用户(更好)。

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

一个好的设置会让你的服务器作为一个用户运行(我们称这个用户为“网络服务器”),而你的动态脚本语言(例如通过 FastCGI)作为它自己的用户运行(每个站点一个用户 - 让我们称我们的第一个用户为“site1”) .

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

由于我们无法将我们的网络服务器的权限指定为另一个“用户”,我们将把“网络服务器”添加到“站点 1”组(当然,您可以创建一个包含“站点 1”和“网络服务器”的不同组。所有该组的成员将被授予相同的权限。最宽松的权限(用户、组、其他集合)将应用于任何给定用户以确定他们的权限。

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

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

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

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

  • 用户上传静态文件(images/swf/js 文件)所在目录中的文件:640
  • 管理员上传静态文件(images/swf/js 文件)所在目录中的文件:640
  • 应用程序中使用的库所在目录中的文件:400(或 440)
  • 可执行/可浏览服务器端脚本所在目录中的文件:400(或 440)
  • 已存在的文件(txt 或 xml)将在服务器端通过代码编辑的目录中的文件:640 或 600
    • (取决于网络服务器是否会显示这些,有时未修改)

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

  • 用户上传的静态文件(images/swf/js 文件)所在的目录:750
  • 管理员上传静态文件(images/swf/js 文件)所在的目录:750
  • 应用程序中使用的库所在的目录:500(或 550)[至少应该是 510]
  • 可执行/可浏览的服务器端脚本所在的目录:500(或 550)[至少应为 510]
  • 已存在的文件(txt 或 xml)将在服务器端通过代码编辑的目录:750 或 700
    • (取决于网络服务器是否会从这里提供文件,有时未经修改)

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

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

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

在上述背景下,我认为您的最后两个问题没有那么重要。将您的目录权限设置为 550(并将文件权限设置为 440),然后授予用户对您的应用程序将写入的任何目录的写入权限(即目录:750;文件:640)。

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