明确文件权限

明确文件权限

我一直在搜索有关文件/目录权限的信息,并且不断找到相同的基本原则。我在任何地方都找不到确定授予所有者、组和其他人哪些权限的基本原理。究竟谁/什么属于这些类别?给予/不给予其中任何人某些权限会产生什么影响?我关心的是确保一切正常运行而不影响安全性。

例如,我正在共享主机 (Linux) 上开发一个小型网站,我是唯一参与其开发/维护的人。观众无法下载任何内容,但成员可以通过 picmonkey.com API 上传图像(php 脚本使用 move_uploaded_file 完成)。该网站的文件都是 .php、.css、.js、.html、.jpg 和 .gif(尽管也有与一种字体关联的 .eot、.svg、.ttf 和 .woff 文件)。这些目录和文件都以站点的用户名作为所有者,“inetuser”作为组。

我脑子里盘旋的一些问题是:

  • 当我使用 WS_FTP 登录时,我是所有者吗?
  • 网络浏览器是“其他”吗?
  • PHP 脚本本身是否属于这些类别之一?

  • 在这些情况下每种文件/目录需要什么权限?
  • .php 文件的读取和执行之间有区别吗?

  • 由于我不知道“inetuser”是谁,我不授予组任何权限是否正确?如果情况并非如此(即
    该站点的用户名也用于组 - 它位于我的开发
    站点上的不同主机上)怎么办?

如果有人能给我任何见解,以及任何可以回答此类问题的推荐文章或书籍,我将不胜感激。

答案1

您似乎理解权限的概念,但我认为您正在陷入用户/组/其他以及它们在各种上下文中的含义。

简要地,

  • A用户是个人 POSIX 帐户
  • A团体是多个 POSIX 帐户的逻辑分组

磁盘上的文件有两个所有者。业主usergroup业主。对于任何特定文件,other是任何执行此操作的用户帐户不是匹配user 也不是 的成员group换句话说,other是不是用户所有者的任何用户不是群组所有者的成员。

此外,每个过程在特定用户 ID(或 UID)下运行,并且是一个或多个组 ID(GID)的成员。使用该命令ps -ef(在 Linux 和 Solaris 上,或者ps -ej在 OS X 或 *BSD 上)查看执行每个进程的用户。您将看到 apache 和 ws_ftp 也被用户执行。

当进程尝试访问磁盘上的文件时,会发生以下情况:

  • 如果UID进程的 与user文件的所有者匹配,则user强制执行权限。
  • 否则,如果GID进程的任何一个与group文件的所有者匹配,则group强制执行权限。
  • 否则other强制执行权限。

具体回答你的问题:

当我使用 WS_FTP 登录时,我是所有者吗?

从技术上讲是的,因为总是有一个所有者,但这取决于你的定义“我”

如果您以真实的系统上的 POSIX 用户,那么您创建/访问的文件将与您登录的用户相同。如果您匿名登录,那么您创建/访问的文件将是以下 UID 的文件FTP协议。这可能是ftpnobody

网络浏览器是“其他”吗?

Web 浏览器什么都不是,因为它不在服务器上执行。但是浏览器访问的是网页服务器。 Web 服务器以某个特定用户身份运行(就像 WS_FTP 一样)。该用户很可能是www-dataapache或者nobody

PHP 脚本本身是否属于这些类别之一?

PHP 脚本由Web 服务器的脚本引擎模块执行。它们将作为运行 Web 服务器的同一用户来执行。

.php 文件的读取和执行之间有区别吗?

是的。 Read表示用户可以读取文件的内容。执行意味着内容可以作为完整的进程运行。

由于 PHP 脚本在 Web 服务器的脚本引擎内部执行(即,它们是服务器的内存空间和执行线程的一部分),因此不需要将它们设置为可执行。

由于我不知道“inetuser”是谁,我不授予组任何权限是否正确?如果情况并非如此(即该站点的用户名也用于组 - 它位于我的开发站点上的不同主机上)怎么办?

inetuser是系统上的用户帐户,就像您的帐户一样。也可能是一个团体。希望您在读完本文后能够自己回答这个问题。

在这些情况下每种文件/目录需要什么权限?

一般来说,您希望数据文件是拥有的由实际人类(即您)使用的用户帐户。换句话说,您的网络内容不应该属于阿帕奇用户

  • 对于数据文件,用户权限几乎始终应为 rw-,对于目录和程序,用户权限应始终为 rwx。
  • 组权限通常应该是 r-- 对于数据文件或 rx 对于目录和程序。如果您希望该组的成员能够写入这些文件,那么它应该是 rw- 和 rwx。
  • 其他权限几乎总是 r-- 用于数据文件,rx 用于目录和程序或者- - 如果你想否定所有的出入口。

答案2

好的,让我们先了解一下文件权限的基础知识,然后我们将转向您的具体案例。

权限

基础的文件权限是:

  1. read - 提供读取文件内容的能力。
  2. write - 提供写入该文件的能力。
  3. eXecute - 提供执行文件或脚本的能力。

的情况下目录名称相同,但含义略有不同:

  1. r- 提供读取目录中文件名称的能力,但仅此而已。
  2. w- 能够在目录中创建文件或写入已存在的文件。
  3. X- 能够读取目录中特定文件的内容,但不允许列出其中的文件(您需要读取权限才能执行此操作)。它还允许更改 (cd) 到此目录。

用户、组和其他

每个文件和目录都有所有者和组的属性。您可以通过调用ls -l命令或查看 FTP 客户端等软件中的指示灯来检查它们。让我们看一个例子:

-rwxr-xr-- 1 jdoe zeppelins  0 08-29 21:50 example_file

这里有一个名为 的文件example_file,该文件是在 2008 年 29 月 21 日 21:50 创建的,长度为 0 字节。它的所有者是一个有名字的用户username,并且它属于一个组zeppelins

现在让我们看看文件权限-rwxr-xr--

  • 第一个字符表示文件类型 - 单破折号-表示它是常规文件(不是链接或目录)。
  • 下一个三元组rwx表示用户 jdoe 可以读取、写入和执行该文件。
  • 以下的r-x意思是所有成员组的成员zeppelins可以读取和执行该文件,但不能修改该文件
  • 最后,r--表示不属于jdoe且不属于该组的用户zeppelins只能读取该文件。

现在回到你的案例

  1. 当您通过 WS_FTP 登录时,您将被识别为使用您在登录时提供的用户名的用户。您可以是某些文件的所有者,但您不需要这样做(可能有指定其他所有者的文件)。

  2. Web 浏览器无法访问这些文件。访问它们的是网络服务器,它读取文件,然后将其内容提供给您的浏览器。网络服务器可以以类似或类似的名称运行apache httpd,但如果您使用托管,它也可以将自己标识为inetuser.如果不是这种情况,它将访问该文件其他用户。

  3. PHP 脚本应该是可读的可写由修改它们的人(很可能是所有者),以及可读的但不是可写通过网络服务器。

  4. 对于由 编辑的简单 PHP 脚本jdoe,假设网络服务器以webserver名称运行,适当的权限将为-rwxr-----。在某些情况下,它可能还需要被其他一些用户读取——在这种情况下-rwxr--r--可能更合适。

  5. 对于 PHP 文件来说,读取权限就足够了。

  6. 最好的想法是进行快速测试 - 删除特定文件的组的所有权限,并检查您是否仍然可以访问它。我敢打赌,这inetuser是网络服务器的别名,因此您的文件应该具有该组的读取权限。

  7. 对于上传文件,您应该创建一个单独的目录,没有读取或执行权限,但具有写入权限。

答案3

Linux 中的权限并不像 Windows 上那样根据所使用的软件起作用(服务以特定权限自行安装)。在 Linux 中,尝试读取/执行文件/目录的程序以特定用户身份运行,这在共享环境中可能有所不同。

关于脚本,Web服务器运行的用户必须具有执行权限,否则最终用户将看到脚本但无法运行它。

某些 Web 服务器与用户 www-data 一起运行,但由于这是一个共享环境,因此您的情况可能有所不同,您应该联系您的提供商进行检查。

如果您知道正在哪个 http 服务器上运行并且具有 shell 访问权限,则可以运行:

ps -ef | grep <server>

在第一列中,您应该看到服务器正在运行的用户,它可能与您登录时使用的用户相同。

请记住,在共享服务器中,可能有不止一台服务器同时运行,您必须弄清楚哪一台是您的。

您使用的 FTP 客户端不会影响权限,它取决于您登录的用户,但这可能与您的登录用户名不同。

在这种情况下,Web 浏览器不是实体,只有 Web 服务器才是实体,正如我之前提到的,它使用自己的用户运行。

根据经验,对于网站的公共区域,我将向用户、组和其他人授予脚本和目录的执行权限以及其他文件的读取权限。

如果 Web 服务器应该允许在某个目录中创建新文件,则该目录应由运行服务器的用户拥有,或者对所有目录粘性位 (t) 具有写访问权限。

相关内容