实际上,如果准备将这种限制定义为从根本上信任操作系统,则可以限制 root 。这可以使用 SELinux(据我所知)和可能的其他此类系统来完成。我见过的以这种方式使用 SELinux 的最佳示例是 Russell Coker 的Play SELinux Machine。
作为对其工作原理的简要概述,“root”这个名称在 Unix 中并不特殊。UID 0 是。UID 0 的意思是“相信我所说的一切”。这特别适用于在 Unices、Unixen 上使用的标准访问模型,或者您将“Unix”复数。
LSM 或 Linux 安全模块允许您连接几乎所有内容并根据您的需要审核/拒绝操作。对于 SELinux,SELinux 权限在 Unix 权限之后检查,因此您的流程如下所示:
Event ----> Has Unix Permissions? ---> Has SELinux Permissions? ---> Let it happen
下一个要了解的阶段是 SELinux 政策有不同的版本,或者在历史上曾经有过不同的版本。在我开始之前,先了解一下 SELinux:
- inode 有类型,后缀为
_t
,也可以称为域;和
- 用户有角色,后缀为
_r
.
结合起来,它们控制给定角色中的用户可以执行的操作,以及给定域中的进程可以执行的操作。
现在,有三个主要的 SELinux 策略:
- 有针对性。这是 Fedora 等桌面的默认策略。目标的想法是关键系统服务和守护程序在域中运行,但您最终用户所做的很多事情都是在
unconfined_u:unconfined_r:unconfined_t
. 猜测这意味着什么没有奖品 - 如果 Unix 权限有效,SELinux 有效地传递。
- 严格的。该政策涉及
unconfined_u
完全删除。这不是一个简单的过程,尤其是在 Linux 桌面(即init 5
)上。具体来说,X11 安全模型不是很好,并且通常需要unconfined_t
某些应用程序。您可以这样做,但我希望使用 X11 会更困难(尽管并非不可能),尤其是在执行需要 root 的 GUI 应用程序时。有一个项目正在进行中,以提供对 X 中类似 SELinux 的功能的支持,称为XACE(X 访问控制扩展)。
- 职业棒球大联盟。MLS 代表多级安全性,表示权限字符串的结尾:
user_u:system_r:httpd_content_t.s0-s2:c5-c7
,即那些s
和c
数字实际上意味着什么。具体来说,它们形成了不读取、不写入的设置,因此除非进程以特定级别运行,否则他们可以看到的信息将受到限制。这种信息级别的想法是保护机密资产——SELinux 最初是由 NSA 开发的,大概就是为了这个目的。
这就是你的背景。现在,根据网页(请参阅常见问题解答) ,播放机上的root是 UID 0 ;但是,root 设置为在严格策略中以user_r而不是sysadm_r身份运行。这意味着将不允许用户从 shell 执行管理功能。
那么,有趣的是需要 root 的其他进程的状态。据推测,此类流程已被适当标记并具有允许它们访问所需访问的策略。那么问题就变成了您如何管理系统以及这些进程中的任何一个是否可以在该用户的上下文中启动一个 shell。如果发生这种情况,您仍然可以管理漏洞。
由于游戏机目前处于停机状态(在撰写本文时),我正在这里进行假设;但本质上,您需要一个在 sysadm_r 中运行并以 UID 0 作为攻击目标的进程。假设这样的过程存在并且可以利用,您仍然可以获取根。至于仍然能够通过 root 进行管理,我可以想到两个选项:
- 要么存在某种受信任的过渡,这意味着 root 然后可以过渡到
sysadm_r
(不太安全)或
- 在不同的运行级别上,应用不同的策略,因此要管理机器,请将运行级别设置为 1,并且该策略不限制 root。我猜这里
概括
如果您的问题是“我现在可以轻松安全地执行此操作吗?” 答案是不。如果您的问题是“我准备好学习 SELinux,对我的发行版感到厌烦,忍受很多不工作的东西”,那么答案是可以比您的平均安装更多地限制 root。也就是说,这绝不会让您对漏洞利用无懈可击——它不会让用户无法在软件或物理上规避这种额外的访问控制。
所以是的,你可以让 root 看不到东西;然而,除了额外的技术负担,同样的警告适用于任何普通用户的任何访问控制设置——没有灵丹妙药。
哦,还有公然的自我推销:你可能会喜欢我关于在软件中存储秘密的博文。它在安全 stackexchange 博客上,所以我对推广它并不感到难过。本质上,正如您所看到的,有一些机制可以使攻击者(和您)的生活变得更加困难,但最终,这是一个“乌龟一路向下”的情况,即根本不可能做到。