所以我想知道是否有可能创建一个没有任何(或几乎没有)用户空间进程以超级用户/root 身份运行的 Linux 系统,并且没有(或几乎没有)其他进程可以提升其权限?
有哪些技术方案可以实现这一目标?其中存在哪些技术缺陷?
答案1
虽然删除超级用户不切实际,但root
出于安全考虑,可以限制用户的访问权限。
我将包括一些摘录,但全部复制会产生很大的答案,所以我只给出要点:
以下是管理员可以进一步确保禁止 root 登录的四种不同方法:
更改根外壳
为了防止用户直接以root身份登录,系统管理员可以在/etc/passwd文件中将root帐户的shell设置为/sbin/nologin。
使用任何控制台设备 (tty) 禁用 root 访问
要进一步限制对 root 帐户的访问,管理员可以通过编辑 /etc/securetty 文件在控制台禁用 root 登录。该文件列出了允许 root 用户登录的所有设备。如果该文件根本不存在,root 用户可以通过系统上的任何通信设备登录,无论是通过控制台还是原始网络接口。这是危险的,因为用户可以使用 Telnet 以 root 身份登录到他们的计算机,Telnet 通过网络以纯文本形式传输密码。
禁用 root SSH 登录
要防止 root 通过 SSH 协议登录,请编辑 SSH 守护程序的配置文件 /etc/ssh/sshd_config,并更改以下行:
#PermitRootLogin yes
阅读如下:
PermitRootLogin no
使用 PAM 限制 root 对服务的访问
PAM 通过 /lib/security/pam_listfile.so 模块在拒绝特定帐户方面提供了极大的灵活性。管理员可以使用此模块来引用不允许登录的用户列表。要限制 root 对系统服务的访问,请编辑 /etc/pam.d/ 目录中目标服务的文件,并确保身份验证需要 pam_listfile.so 模块。
所有部分都有我遗漏的更多信息,但如果您感兴趣,可以让您进一步阅读。
塞林克斯
selinux
root
可以通过修改服务/可执行文件/端口/等的selinux上下文来整体剥夺权限。不过,这涉及到一个很大的主题,因此我将链接 RHEL 文档,而不是深入讨论这一点:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/selinux_users_and_administrators_guide/index
对于一个非常残酷的示例限制,请运行selinux
并enforcing
尝试:semanage login -a -s user_u root
。
这会将标准用户权限分发给 root 用户(假设它甚至可以运行,我不确定,因为我目前没有机器可以砖化),并限制它执行任何“root”之类的操作。
然而,这可能会阻止init
一堆服务启动,因此可能需要大量其他selinux
配置才能允许这些服务作为其他用户运行(考虑到损害一项服务,这可能非常安全,并且非常难以维护)不会向其他人提供任何访问权限)。
答案2
不提供超级用户能力的发行版实际上无法使用,因为它在设计上不允许其用户执行任何系统配置、驱动程序安装或更新。
这就像著名的“完全安全的计算机”,它是一台拔掉插头并关闭的机器。
这是“安全性/可用性”达到极端平衡(实现最大安全性和低可用性)的示例。
此外,内核在启动时仍然执行高于用户权限的操作,并且这些(如任何操作)仍然是可破解的。
答案3
森蒂曼给了一个非常彻底的答案。以下是一些额外的想法:
- 您可能想要删除
cron
,因为它需要有权将进程的 UID 设置为任何值。 - 任何需要能够读取任何文件的进程都可以作为具有“CAP_DAC_READ_SEARCH”功能的非root用户运行 - 请参阅 这, 这, 和这。
- 需要能够写入“系统”文件的进程可以被赋予非根 UID(可能每个程序或每个资源都有不同的 UID),然后通过 ACL 授予访问权限。
- 需要能够执行“特权”操作的进程可以使用其他功能来执行此操作(如上所述);看最小特权原则。
为了在设置后更改配置并解决限制root
:
- 将计算机设置为双启动。
- 一种操作系统将是经过强化的操作系统,具有最少的 root 访问权限和活动。
- 另一种是或多或少的普通 Linux,但删除了网络驱动程序。
- 在(罕见?)系统管理员需要管理系统的情况下,他们可以关闭、启动到常规 Linux、执行需要执行的操作,然后重新启动。