文件权限如何对“ root”用户起作用?


28

我有以下文件:

---------- 1 Steve Steve 341 2017-12-21 01:51 myFile.txt

我将用户切换到root终端中,并且注意到以下行为:

  • 我可以读取该文件并将其写入。

  • 我无法执行此文件。

  • 如果我x在文件的用户权限(---x------)或组权限(------x---)或其他权限(---------x)中设置了位,那么我将能够执行此文件。

谁能向我解释或向我介绍一个教程,该教程解释root用户处理文件和目录时适用的所有规则?

Answers:


38

实际上,对文件和目录的特权访问取决于功能,而不仅取决于是否root存在。在实践中,root通常具有所有可能的功能,但是在某些情况下,所有/很多功能可能会被删除,或者某些功能会分配给其他用户(他们的过程)。

简而言之,您已经描述了访问控制检查如何处理特权进程。这是不同功能实际上如何影响它的方式:

这里CAP_DAC_OVERRIDE的主要功能是,具有它的进程可以“绕过文件读取,写入和执行权限检查”。这包括读取和写入任何文件,以及读取,写入和访问目录。

它实际上不适用于执行未标记为可执行文件的文件。()中的注释在generic_permissionfs/namei.c访问权限检查文件之前说:

读/写DAC始终是可重写的。当至少有一个执行位设置时,可执行的DAC是可重写的。

x如果您要执行文件,代码会检查是否至少设置了一位。我怀疑这只是一个便利功能,可以防止意外运行随机数据文件并避免出现错误或奇怪的结果。

无论如何,如果您可以覆盖权限,则可以制作一个可执行副本并运行它。(尽管它在理论上可能有所不同,因为进程的setuid文件可以覆盖文件权限(CAP_DAC_OVERRIDE),但没有其他相关功能(CAP_FSETID/ CAP_FOWNER/ CAP_SETUID。)但是CAP_DAC_OVERRIDE可以进行编辑/etc/shadow和类似的操作,因此它大致相等只是拥有完整的root访问权限。)

还有一种CAP_DAC_READ_SEARCH功能可以读取任何文件并访问任何目录,但不能执行或写入它们。并CAP_FOWNER允许进程执行通常只保留给文件所有者的内容,例如更改权限位和文件组。

仅在下方提到了覆盖目录中的粘性位CAP_FOWNER,因此似乎CAP_DAC_OVERRIDE不足以忽略它。(这将为您提供写许可权,但通常在粘性目录中您仍然具有写许可权并对其进行+t限制。)

(我认为特殊设备在这里算作“文件”。至少generic_permission()仅对目录进行类型检查,但我没有对此进行检查。)


当然,在某些情况下,甚至功能也无法帮助您修改文件:

  • 在一些文件/proc/sys,因为他们没有真正实际的文件
  • SELinux和其他可能限制根目录的安全模块
  • chattr不可变+i并且仅+a在ext2 / ext3 / ext4上附加标志,这两个标志甚至都停止root用户,并防止文件重命名等。
  • 网络文件系统,服务器可以在其中执行自己的访问控制,例如root_squash在NFS中将root映射为nobody
  • 保险丝,我想可以做任何事情
  • 只读挂载
  • 只读设备

令人惊讶的是,capabilities(7)手册页中似乎没有反映源文件注释-考虑提交错误报告!
Toby Speight

@ilkkachu如图所示,对(几乎)任何文件root都具有rw-权限,并且要获得该x权限,则x必须在该文件的用户/组/其他权限上设置该位。但是目录如何,对任何目录都root具有rwx权限(即使目录根本没有权限(----------))?
约瑟夫

是的,@ Joseph CAP_DAC_OVERRIDE允许覆盖所有目录权限,因此您可以读取,写入和访问目录(即列出目录,创建和取消链接文件)。我引用的有关exec位的注释是在文件上下文中(仅)。
ilkkachu

11

就像您已经注意到默认权限一样:

  • 读取和写入:
    默认情况下,root用户可以访问系统中的任何文件。您可以通过更改属性来删除此访问权限,例如在此处进行解释:chattr。然后将其链接到功能。

  • 执行:
    根用户没有执行权限,除非已设置执行位中的至少一位。


可能存在root无法写入或删除的文件。因此,“ root用户可以访问系统中的任何文件。” 是不正确的。
卢卡斯·博斯玛

您是说像只读文件系统?还是还有其他情况?
凯文·勒梅尔

1
我说的是这样的情况:不可写文件不可删除文件
Lukas Boersma

5

通过myFile.txt获得chmod 000 myFile.txt

0 no permission
1 execute
2 write
3 execute + write
4 read 
5 read + execute
6 read + write
7 all

--------- 表示没有用户,组和其他权限。

root用户具有不受限制的修改该文件的能力。授予读/写权限。要执行此文件,root用户需要使它始终可执行。(chmod 100、010或001)


2

执行模式与其他模式略有不同。

读写权限用于实施安全策略。该root用户是一般的安全限制(也有一些例外,比如不可变的文件,而像功能现代特色使这个更细粒度),这就是为什么这个帐户中的另一个名字是“超级用户”的免疫。

执行权限更是一个咨询模式,区分文件是否打算为可执行文件或仅仅是数据。因此,即使root用户也遵守它-执行数据文件毫无意义。如果未设置任何执行权限,则root无法执行该文件;如果设置了任何一个,他可以。当然,由于root也有权更改任何文件的权限,因此该帐户可以根据需要使文件可执行(除非文件系统是只读的)。

顺便说一句,脚本是一个有趣的例子。脚本是相关解释器的数据文件。如果脚本中有#!一行,则可以将其作为程序执行-在shebang中命名的解释器以脚本文件名作为参数运行。但这仅在设置了执行许可时才能完成。另一方面,您可以直接运行解释器,例如/bin/bash scriptname。口译员只关心是否可以读取文件,不检查执行权限。


1

让我从理论上向您解释。

root用户是操作系统之王。

如果文件或目录具有X的任何执行权限,但没有其他权限,而Steve用户这样的人拥有该文件,则root也可以执行该文件。

永远记住,在Linux中root可以做任何事情,对root没有任何限制。


没有什么。例如,如果文件具有不可变的属性,那么即使root也不能更改它(除非他明确删除了该属性)。
Ruslan

@Ruslan是的,但是他是个新手,这是非常特殊的情况,因此我将其作为基本知识进行解释,默认情况下不会出现此类属性。
哈桑·索伊尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.