来自 Didi Kohen 的回答
属于基于能力的安全吗sudo
?su
在 Unix 和 Linux 中,有两个级别的权限:标准用户和超级用户(通常称为 root)。
标准用户只能访问他有权通过所有权、组成员身份或权限访问的文件前交叉韧带。
超级用户拥有一切权限(对于这个答案,我们将忽略 SELinux 之类的东西),没有限制在用户空间内。
当一个进程的有效或真实 uid 是 root 并尝试访问文件时,它是否仍然受文件的权限位约束?或者,就像引用所说的(如果我理解正确的话),拥有 euid root 将覆盖文件的权限位?
例如,
当文件的所有者不是root且其组与进程的有效组或补充组不匹配时,文件的“其他”权限位是否适用于该进程?如果文件不允许其他人读写或执行,进程还能读写或执行吗?
当文件的所有者是root,并且“用户”的文件权限位不允许读、写或执行时,进程是否还能读、写或执行该文件?
是否有可能使有效或真实 uid 为 root 的进程无法访问文件?例如,通过更改文件的权限位?
答案1
在传统的 Unix 中,root
可以做任何事情。
然而,在现代 Linux(也许是其他 Unix)上,它现在具有了功能。这里讨论的功能是CAP_DAC_OVERRIDE
,任何具有此功能的进程都将忽略文件权限(除了x
,请参阅其他答案)。
大多数系统将设置为向后兼容模式,以便当进程更改其有效的用户ID为root,将获得所有能力,并且当有效的用户 ID 从 root 更改后会丢失功能。
有一些方法可以避免丢弃功能,这可以用于将某些功能传递给非根进程。还有一种无需成为 root 即可获得功能的方法,其工作原理与进程成为 root 的方式类似。
重要的是有效用户 ID,真实的和已保存的用户 ID 仅允许您将这些 ID 复制到其他 ID 之一(例如复制到有效用户 ID)。
SE_linux 和命名空间/cgroups,可以限制 root 可以执行的操作。
答案2
无论权限位如何,root 都可以访问所有内容。一个例外是,如果未设置任何执行位且 SELinux 设置限制,根进程将不会尝试执行文件。
然而,root 仍然能够设置所需的执行位并更改 SELinux 规则,因此您无法阻止 root 访问您的文件。
编辑
来自“人路径解析”
在传统的UNIX系统上,超级用户(root,用户ID 0)拥有一切权力,访问文件时可以绕过所有权限限制。
答案3
当一个进程有一个有效的或真实的uid 是 root 并尝试访问文件...
对于文件系统访问来说,只有有效的 UID 才重要,而不是真正的 UID。持有特权 UID 的进程可以打乱真实有效的 UID,以暂时放弃特权。
# perl -MEnglish -e '$EUID = 65534; system "id"; system "cat /etc/shadow"'
uid=0(root) gid=0(root) euid=65534(nobody) groups=0(root)
cat: /etc/shadow: Permission denied
但除此之外,你是对的,无论权限位如何,获得特权都可以访问文件。 (除此之外,除非设置了至少一个x
位,否则执行文件不起作用,但这实际上只是一种方便。如果您有特权,通常可以将文件复制并运行它,或者更改首先是权限。)
请参阅 Linux 的最后部分手册页path_resolution(7)
(“绕过权限检查:超级用户和功能”)或POSIX 中的文本(“4.5 文件访问权限”)。
就像后者的提示和前者的简单说明一样,对特权的实际检查可能不仅仅是 UID。在Linux上,它实际上是CAP_DAC_OVERRIDE
能力(或CAP_DAC_READ_SEARCH
在较小程度上)。我不知道其他系统的细节。
答案4
对于特权用户,仅x
评估该位。
这意味着为了允许超级用户执行文件,x
必须至少设置一位。
超级用户的所有其他权限都将被忽略。