![明确文件权限](https://linux22.com/image/25470/%E6%98%8E%E7%A1%AE%E6%96%87%E4%BB%B6%E6%9D%83%E9%99%90.png)
我一直在搜索有关文件/目录权限的信息,并且不断找到相同的基本原则。我在任何地方都找不到确定授予所有者、组和其他人哪些权限的基本原理。究竟谁/什么属于这些类别?给予/不给予其中任何人某些权限会产生什么影响?我关心的是确保一切正常运行而不影响安全性。
例如,我正在共享主机 (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 帐户的逻辑分组
磁盘上的文件有两个所有者。业主user
与group
业主。对于任何特定文件,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协议。这可能是ftp
或nobody
。
网络浏览器是“其他”吗?
Web 浏览器什么都不是,因为它不在服务器上执行。但是浏览器访问的是网页服务器。 Web 服务器以某个特定用户身份运行(就像 WS_FTP 一样)。该用户很可能是www-data
,apache
或者nobody
。
PHP 脚本本身是否属于这些类别之一?
PHP 脚本由Web 服务器的脚本引擎模块执行。它们将作为运行 Web 服务器的同一用户来执行。
.php 文件的读取和执行之间有区别吗?
是的。 Read表示用户可以读取文件的内容。执行意味着内容可以作为完整的进程运行。
由于 PHP 脚本在 Web 服务器的脚本引擎内部执行(即,它们是服务器的内存空间和执行线程的一部分),因此不需要将它们设置为可执行。
由于我不知道“inetuser”是谁,我不授予组任何权限是否正确?如果情况并非如此(即该站点的用户名也用于组 - 它位于我的开发站点上的不同主机上)怎么办?
inetuser
是系统上的用户帐户,就像您的帐户一样。也可能是一个团体。希望您在读完本文后能够自己回答这个问题。
在这些情况下每种文件/目录需要什么权限?
一般来说,您希望数据文件是拥有的由实际人类(即您)使用的用户帐户。换句话说,您的网络内容不应该属于阿帕奇用户。
- 对于数据文件,用户权限几乎始终应为 rw-,对于目录和程序,用户权限应始终为 rwx。
- 组权限通常应该是 r-- 对于数据文件或 rx 对于目录和程序。如果您希望该组的成员能够写入这些文件,那么它应该是 rw- 和 rwx。
- 其他权限几乎总是 r-- 用于数据文件,rx 用于目录和程序或者- - 如果你想否定所有的出入口。
答案2
好的,让我们先了解一下文件权限的基础知识,然后我们将转向您的具体案例。
权限
基础的文件权限是:
- read - 提供读取文件内容的能力。
- write - 提供写入该文件的能力。
- eXecute - 提供执行文件或脚本的能力。
的情况下目录名称相同,但含义略有不同:
- r- 提供读取目录中文件名称的能力,但仅此而已。
- w- 能够在目录中创建文件或写入已存在的文件。
- 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
只能读取该文件。
现在回到你的案例
当您通过 WS_FTP 登录时,您将被识别为使用您在登录时提供的用户名的用户。您可以是某些文件的所有者,但您不需要这样做(可能有指定其他所有者的文件)。
Web 浏览器无法访问这些文件。访问它们的是网络服务器,它读取文件,然后将其内容提供给您的浏览器。网络服务器可以以类似或类似的名称运行
apache
httpd
,但如果您使用托管,它也可以将自己标识为inetuser
.如果不是这种情况,它将访问该文件其他用户。PHP 脚本应该是可读的和可写由修改它们的人(很可能是所有者),以及可读的但不是可写通过网络服务器。
对于由 编辑的简单 PHP 脚本
jdoe
,假设网络服务器以webserver
名称运行,适当的权限将为-rwxr-----
。在某些情况下,它可能还需要被其他一些用户读取——在这种情况下-rwxr--r--
可能更合适。对于 PHP 文件来说,读取权限就足够了。
最好的想法是进行快速测试 - 删除特定文件的组的所有权限,并检查您是否仍然可以访问它。我敢打赌,这
inetuser
是网络服务器的别名,因此您的文件应该具有该组的读取权限。对于上传文件,您应该创建一个单独的目录,没有读取或执行权限,但具有写入权限。
答案3
Linux 中的权限并不像 Windows 上那样根据所使用的软件起作用(服务以特定权限自行安装)。在 Linux 中,尝试读取/执行文件/目录的程序以特定用户身份运行,这在共享环境中可能有所不同。
关于脚本,Web服务器运行的用户必须具有执行权限,否则最终用户将看到脚本但无法运行它。
某些 Web 服务器与用户 www-data 一起运行,但由于这是一个共享环境,因此您的情况可能有所不同,您应该联系您的提供商进行检查。
如果您知道正在哪个 http 服务器上运行并且具有 shell 访问权限,则可以运行:
ps -ef | grep <server>
在第一列中,您应该看到服务器正在运行的用户,它可能与您登录时使用的用户相同。
请记住,在共享服务器中,可能有不止一台服务器同时运行,您必须弄清楚哪一台是您的。
您使用的 FTP 客户端不会影响权限,它取决于您登录的用户,但这可能与您的登录用户名不同。
在这种情况下,Web 浏览器不是实体,只有 Web 服务器才是实体,正如我之前提到的,它使用自己的用户运行。
根据经验,对于网站的公共区域,我将向用户、组和其他人授予脚本和目录的执行权限以及其他文件的读取权限。
如果 Web 服务器应该允许在某个目录中创建新文件,则该目录应由运行服务器的用户拥有,或者对所有目录粘性位 (t) 具有写访问权限。