Linux 不再将“root”用户视为超级用户,而是使用能力它赋予进程特权(我认为 BSD 做了类似的事情)。
例如,在较旧的 Linux 版本中,如果进程EUID
(或FSUID
不确定)是“root”,Linux 将允许进程创建套接字,但在现代 Linux 版本中,只有当进程具有允许进程创建套接字所需的权限。
但我想知道,是否有一些 Unix 或类 Unix 操作系统仍然将“root”用户视为超级用户?
答案1
问题的前提大多是有缺陷的。 Linux做将用户 0 视为超级用户。 (始终是用户 0;调用该用户root
只是一种约定。)功能是一种附加机制,允许非 root 进程接收特定权限。用户 0 通常实际上拥有所有功能,因此 root 仍然是超级用户。
使用有效用户 ID 0 运行的进程可能会失去功能,但这并不限制其功能,除非在高度受控的环境中。任何以有效用户 ID 0 运行并且可以创建可执行文件并可以调用的进程都execve
可以使用所有功能执行任意代码,因为execve
当有效用户 ID 为 root 时,不会保留进程的功能掩码。 (请参阅《root 程序的功能和执行》)手动的.)
SECBIT_NOROOT
通过在登录期间设置标志并确保无法恢复它,或者通过从边界集中删除功能,可以使操作系统完全剥夺对某些功能的访问权限,同时仍然使用用户 ID 0。但这并不是 Linux(如 Linux 操作系统)通常的工作方式。这是内核的一项额外功能,对于受限操作系统(例如在容器内)非常有用。
功能可以限制 root 的权限,但以这种方式使用它们并不容易,而且这也不是它们的主要用途:功能主要用于避免以 root 身份运行进程。 Linux 内核确实还有其他限制 root 权限的功能。无论用户 ID 如何,SELinux 和 AppArmor 等安全模块都适用,因此可以建立一个用户 id 0 几乎什么都不做的系统(但同样,这不是正常系统的设置方式)。和用户命名空间,用户 id 0 只是该命名空间内的超级用户,此功能广泛用于容器。
FreeBSD 提供辣椒能力。我不知道 Capsicum 是否限制了用户 id 0 的权限。再次强调,功能的主要目标是减少以所有权限运行的代码量,而不是删除所有权限进程的概念。
我认为其他 BSD 都没有能力机制。 OpenBSD 的目标是通过最大限度地减少特权代码的复杂性和数量来确保安全。增加安全机制的复杂性以减少特权数量,特权代码并不是免费的午餐。