拥有 w(写)权限的人是否也拥有 r(读)权限?

拥有 w(写)权限的人是否也拥有 r(读)权限?

Linux 文件和目录权限有 3 个不同的级别(读取、写入、执行)在《Linux 黑客基础知识》第 50 页中,写权限定义如下:

w 写入权限。这允许用户看法编辑一份文件。

这么说对吗查看一个文件相当于阅读它?

答案1

查看确实是阅读,但写入权限不包括读取权限,因此在我看来这句话是错误的。

/proc并且/sys有仅具有写入权限的伪文件。它用于单向信号传输;因此触发事件(即,如果文件中有一个值,则执行操作,否则不执行任何操作;处理此事件的进程将清除该值)。不要认为它在日常生活中真的有用。

sudo find /proc/[^0-9]* /sys -perm /222 ! -perm /444

找到它们(总计约 5600 个文件)。例如:

$ ls -ltr /sys/module/snd_rawmidi/uevent
--w------- 1 root root 4096 jul 26 15:34 /sys/module/snd_rawmidi/uevent

只能写,不能读。而且,即使是所有者(root)也不能查看它:

rinzwind@schijfwereld:~$ sudo -i
root@schijfwereld:~# more /sys/module/snd_rawmidi/uevent
more: cannot open /sys/module/snd_rawmidi/uevent: Permission denied

答案2

不,写权限不包括读权限,书上的说法是错误的。这些权限是独立的。如果你只有写权限,你可以覆盖文件,但不能读取它。如果你只有读权限,你可以读取文件,但不能覆盖它。如果你同时拥有这两种权限,那么你可以同时执行这两种操作。

以下是示例。我们有一个目录,其中包含三个文件,、file1file2file3每个文件都包含一行文本This is file n(其中n=1、2 或 3),权限如下:

raj@jarek-02:~/test$ ls -l
total 12
-rw--w--w- 1 root root 15 Jul 26 19:54 file1
-rw-r--r-- 1 root root 15 Jul 26 19:52 file2
-rw-rw-rw- 1 root root 15 Jul 26 19:53 file3

这些文件的所有者是root,并且root对这三个文件都具有读写权限,但其他用户(我当前是用户raj,正如您从系统提示符中看到的)对第一个文件只有写权限,对第二个文件只有读权限,对第三个文件有读/写权限。

正如我们所料,我无法读取第一个文件,但可以读取另外两个文件:

raj@jarek-02:~/test$ cat file1
cat: file1: Permission denied
raj@jarek-02:~/test$ cat file2
This is file 2
raj@jarek-02:~/test$ cat file3
This is file 3

现在让我们尝试覆盖这些文件。

raj@jarek-02:~/test$ echo "Overwriting file 1" > file1
raj@jarek-02:~/test$ echo "Overwriting file 2" > file2
bash: file2: Permission denied
raj@jarek-02:~/test$ echo "Overwriting file 3" > file3

第一个和第三个命令成功(因为没有输出),第二个命令失败并出现“权限被拒绝”消息。

现在尝试再次显示文件:

raj@jarek-02:~/test$ cat file1
cat: file1: Permission denied
raj@jarek-02:~/test$ cat file2
This is file 2
raj@jarek-02:~/test$ cat file3
Overwriting file 3

我仍然无法显示file1,尽管我可以更改它。file2没有改变(因为尝试更改它时出现“权限被拒绝”消息),我们可以看到确实file3发生了变化。

为了验证file1是否也发生了变化,让我们尝试以具有root文件读取权限的用户身份显示它:

root@jarek-02:/home/raj/test# cat file1
Overwriting file 1

因此实际上raj,具有写权限的用户可以更改文件的内容,但无论在更改之前还是之后都无法读取该文件。

答案3

不,正如其他答案所指出的,书中的说法是错误的。

只写文件/目录在现实生活中实际上有几种用途:

  • /proc/sys中,只写文件用于以面向事件的方式向内核发送信号,但没有有用的关联状态供用户查询。最常见的情况是用于/sys明确绑定或解除绑定驱动程序的文件,以及v2 cgroups 中的cgroup.killmemory.reclaim文件(分别用于自动终止 cgroup 中的所有进程,并手动触发该 cgroup 中的内存回收)。
  • 只写目录通常用于文件上传系统。用户可以写入目录,但看不到其中的内容。这很重要,因为它确保用户无法看到其他人上传的内容。
  • 共享热目录设置有时也使用只写目录,其安全原因基本上与用于文件上传目录相同。
  • 在某些情况下,对于配置为以该服务运行的用户,给定服务的日志文件可能是只写的。这样做之所以有效,是因为日志是只追加的(因此服务在打开文件时只会查找到末尾,然后开始写入),并且它确保以某种方式破坏服务的攻击者无法读取日志。

更一般地说,Linux 或其他类 UNIX 上的任何权限都是隐式通常是错误的。在经典的 UNIX DAC 模型中,有完全零隐含权限,一切都明确地被编码。POSIX ACL、NFSv4 ACL 和我所知道的 Linux 的所有 MAC 系统也是如此。可能的例外是一些Linux 功能,但如果您不了解实际检查的内容,这些看起来只是隐含的。

这很重要,因为隐式权限很危险。由于它们没有明确地编纂,所以很容易忘记它们,而忘记它们通常会导致安全问题。

相关内容