Ubuntu 20.04 上的奇怪文件安全性

Ubuntu 20.04 上的奇怪文件安全性

Ubuntu 20.04,磁盘分区格式为 EXT4。具有 sudo 权限的普通用户,在 tmp 目录中,例如:~/tmp/

$ sudo touch c.txt
// this will create a root-root(user-group) file with mode 644, as expected.
$ rm c.txt
$ rm: remove write-protected regular empty file `c.txt'?     // sys prompt
if I selected 'y', then c.txt will be removed ! // NOT as expected.

我甚至尝试 rm 非空文件,仍然可以删除!

我尝试了两台安装了 Ubutnu 20.04 的计算机,结果一样。

为什么普通用户无需 sudo 即可删除 root 文件?

谢谢!

附言:检查文档后 https://help.ubuntu.com/community/FilePermissions 是的,普通用户可以删除完全控制目录(rwx=7)中的任何文件,无论文件所有者、模式如何。然而,它似乎不适用于修改操作。例如:

// TC2
sudo vim d.txt     // this will create a root-root(user-group) with 644 mode

vim d.txt   
// edit by normal user, use w! to save in vim, 
// after exit vim, the file content changed and the user-group 
// chagned to current user group, not root-root anymore.

这符合预期吗?

答案1

删除目录中的文件允许在目录本身上,该文件的权限无关紧要。 在您的例子中,普通用户对包含文件的目录拥有完全权限。 您可以将其更改为不可变以防止删除它:sudo chattr +i 文件

或者:

sudo chmod ow /路径到目录

答案2

目录是文件和子目录的列表(更准确地说,对于每个条目:文件名或子目录名称、所属用户、所属组、权限位、扩展权限、指向文件/子目录在磁盘上的位置的指针以及其他深奥的元数据)。目录有所有者和组。目录的权限控制哪些用户可以读取、写入和cd进入该目录。如果您希望在目录中创建文件,则必须具有写入目录的权限。如果您希望从目录中删除文件,则必须具有写入目录的权限。如果您希望重命名文件,则必须具有写入目录的权限。如果您希望更改文件的权限,则必须具有写入目录的权限。所有这些都是对目录的修改,因此请使用目录的权限。(存在与扩展权限相关的例外情况,我在这里将其放在一边。)

在下文中,我将继续写“您用来访问它的目录条目”,因为文件系统中的文件可能有多个目录条目,因此可能有不同的名称。事实上,单个目录中的多个条目(必然具有不同的名称)可能指向磁盘上的同一个文件,并且各个条目可以具有不同的拥有用户、拥有组和权限。

目录中的文件条目具有所属用户、所属组和权限。如果您希望读取文件的内容,则用于访问该文件的目录条目必须允许您具有读取权限。如果您希望写入文件的内容,则用于访问该文件的目录条目必须允许您具有写入权限。如果您希望执行文件的内容,则用于访问该文件的目录条目必须允许您具有执行权限。

那么让我们通过你的例子来研究一下。

  • 当前工作目录是~/tmp/,因此当前用户是拥有用户、拥有组,并且对该目录具有读+写+执行权限。
  • sudo touch c.txt 这将创建一个文件,其所有者root具有读写权限,组root具有写入权限,并且其他用户具有写入权限。(4 = 读取,2 = 写入,1 = 执行;6 = 4+2 = 读取+写入)
  • rm c.txt出现警告/提示“ rm: remove write-protected regular empty file 'c.txt'?”此警告的意思是:当前用户对当前目录具有写入权限,因此可以删除此文件,但当前用户对此文件的内容只有读取权限,这表明当前用户希望保留此文件以防止更改。这两个意图是不相容的,因此需要进一步指导。
  • 选择yc.txt删除。是的。您有权限从目录中删除该条目,因此当您响应 时y,该条目将从目录中删除。文件的内容绝不会被写入或执行(这是文件条目权限所不允许的)。

您的第二种情况也有效,但原因与您预期的不同。 vim许多其他编辑器(包括 Microsoft Word 等随机示例)不编辑原始文件。他们复制文件,然后编辑副本。如果未保存编辑,则可以删除副本。如果保存了编辑,则原始文件将从目录中删除,副本将重命名为原始文件的名称。让我们看看会发生什么。

mkdir test
cd test
ls -laF

total 8
drwxrwxr-x  2 fuzzy fuzzy 4096 Oct 31 11:40 ./
drwxr-xr-x 78 fuzzy fuzzy 4096 Oct 31 11:40 ../

我们看到我的用户fuzzy和我的组fuzzy拥有当前目录,.并且设置了 775 权限(用户fuzzy:rwx,组fuzzy:rwx,其他:rx)。

sudo vim d.txt
[supply password]
[vim session starts]
[insert mode]Hi.

现在让我们转到另一个 shell 并查看目录中发生的情况。

[another shell, not sudo...]
cd test
ls -laF

total 20
drwxrwxr-x  2 fuzzy fuzzy  4096 Oct 31 11:44 ./
drwxr-xr-x 78 fuzzy fuzzy  4096 Oct 31 11:44 ../
-rw-------  1 root  root  12288 Oct 31 11:44 .d.txt.swp

我们看到sudo vim已创建了一个名为 的临时文件,.d.txt.swp其所有者root.root和模式为600。现在返回并将文件保存在sudo vim会话中并再次检查。

ls -laF

total 12
drwxrwxr-x  2 fuzzy fuzzy 4096 Oct 31 11:48 ./
drwxr-xr-x 78 fuzzy fuzzy 4096 Oct 31 11:48 ../
-rw-r--r--  1 root  root     4 Oct 31 11:48 d.txt

我们看到临时文件的目录条目已被修改为具有新名称和新权限。此处的当前用户是fuzzy,他只具有读取权限d.txt,但这就是fuzzy在编辑器中打开文件所需的全部内容。

[first session, notice not sudo...]
vim d.txt
[go to end of first line]
[append.  warned: "W10: Warning: Changing a readonly file"]
[type a single space after "Hi."]

当我们附加之后,Hi.vim 临时文件就会出现在目录中。

[second session]
ls -laF

total 16
drwxrwxr-x  2 fuzzy fuzzy 4096 Oct 31 11:53 ./
drwxr-xr-x 78 fuzzy fuzzy 4096 Oct 31 11:52 ../
-rw-r--r--  1 root  root     4 Oct 31 11:48 d.txt
-rw-------  1 fuzzy fuzzy 4096 Oct 31 11:53 .d.txt.swp

此目录对用户具有 rwx 权限fuzzy,因此允许创建此条目。与往常一样,vim对临时文件的权限保持非常严格。

[first session]
[exit insert mode]
[Esc]:w
[obtain error: "E45: 'readonly' option is set (add ! to override)"]

这意味着原始目录条目对当前用户没有写入权限,fuzzy。这通常具有文件不可修改的语义,因此vim可以尊重这些语义或覆盖它们(因为目录权限允许fuzzy删除d.txt条目并将重命名.d.txt.swpd.txt)。你想要哪一个?

[first session]
[Esc]:w!

您选择覆盖。

让我们看看现在目录中发生了什么。

[second session]
ls -laF

total 28
drwxrwxr-x  2 fuzzy fuzzy  4096 Oct 31 12:01 ./
drwxr-xr-x 78 fuzzy fuzzy  4096 Oct 31 12:00 ../
-rw-r--r--  1 fuzzy fuzzy     5 Oct 31 12:01 d.txt
-rw-r--r--  1 fuzzy fuzzy     4 Oct 31 11:48 d.txt~
-rw-------  1 fuzzy fuzzy 12288 Oct 31 12:01 .d.txt.swp

您可能看不到该d.txt~文件。我可能打开了vim始终保存原始文件备份的选项。我不记得vim此选项的默认行为是什么。

现在有三个文件:

  • d.txt——我们刚刚保存的修改版本。它包含“Hi。”。后续保存将替换此文件。
  • d.txt~-- 原始文件的备份副本。它包含“Hi”。此目录条目由以 身份运行的进程创建fuzzy,因此具有fuzzy的默认所有权和权限。
  • .d.txt.swp——当前工作文件。后续编辑将定期自动保存到此文件。

现在让我们结束本次vim会议。

[first session]
[Esc]:q

并再次查看文件系统中发生的情况。

[second session]
ls -laF

total 16
drwxrwxr-x  2 fuzzy fuzzy 4096 Oct 31 12:05 ./
drwxr-xr-x 78 fuzzy fuzzy 4096 Oct 31 12:05 ../
-rw-r--r--  1 fuzzy fuzzy    5 Oct 31 12:01 d.txt
-rw-r--r--  1 fuzzy fuzzy    4 Oct 31 11:48 d.txt~

这两个文件都是由无特权的用户创建的fuzzy,因此具有fuzzy的默认所有权和权限。 fuzzy能够创建和删除这些目录条目,因为fuzzy具有对当前目录的写权限.

相关内容