我可以创建一个 *super* 超级用户,以便我实际上可以拥有一个可以拒绝 root 权限的用户吗?

mch*_*hid 34 users root permissions sudo

我认为拥有比 root 用户更高权限的用户可能是有利的。

你看,我想保留所有的活动和几乎所有现有的 root 用户权限,就像现在一样。

但是,我希望能够在极其孤立的情况下拒绝root 权限。

这样做的好处之一是可以防止在更新期间安装某些不需要的文件。这只是一种可能优势的示例。

因为 apt-get 更新是由 root 或以 sudo 权限运行的,所以 apt-get 能够在更新期间替换某些不需要的文件。

如果我可以拒绝这些特定文件的这些权限,我可以将它们设置为指向/dev/null或可能有一个空白占位符文件的 simlink,该文件可能具有拒绝在更新期间替换文件的权限。

此外,我不禁想起在接受其中一位 Ubuntu 创作者采访时所说的一句话,当时他说用户如何更好地信任“我们”(指的是 Ubuntu 开发者)“因为我们有 root " 这是对如何使用 root 权限执行系统更新的参考。

简单地改变安装过程来解决这个问题绝对不是我在这里感兴趣的。既然我已经对拥有拒绝 root 访问权限的想法有了一种品味,我想找出一种方法来实现这一点,只是为了做到这一点。

我只是想过这个,到目前为止还没有花任何时间在这个想法上,我相当有信心可以解决这个问题。但是,我很想知道这是否已经完成,或者这是否可能不是一个新想法或概念。

基本上,似乎应该有某种方法可以让超级超级用户拥有超出系统权限的权限仅一级。


注意:虽然我觉得接受的答案最符合标准,但我真的很喜欢@CR 的答案。还。

我想在树上创建一个实际用户(我),但我想我只需要在有一天我有时间弄清楚的时候坐下来。

此外,我不是要在这里选择 Ubuntu;如果我对它感到消极,我不会将它用作我的主要发行版。

Hau*_*ing 84

您想要的“用户”称为 LSM:Linux 安全模块。最著名的是 SELinux 和 AppArmor。

通过这种方式,您可以防止某些二进制文件(及其子进程)执行某些操作(即使它们的 UID 是root)。但是您可以允许这些操作getty及其子进程,以便您可以手动执行。

  • @curious_cat:是的,当然您需要拒绝“受限root”进程更改/提高自己权限的能力!编写 SELinux 的人已经想到了这一点...... (11认同)
  • @curious_cat 您可以配置 LSM,以便在运行时完全不可能更改其配置。您必须重新启动并提供内核参数,然后才能做到这一点。 (8认同)
  • @Joshua 如果您的 apt-get 副本使用的是 Rowhammer,那么您需要担心更大的问题。 (5认同)
  • @corsiKa 首先,您希望将可以启动机器的人限制为实际 * 在 * 机器上的人,因为系统在启动时容易受到攻击。通过网络触发重新启动很好,但允许在启动时进行控制则不然。其次,计算机安全的一条规则是,一旦攻击者具有物理访问权限,您就不能做任何事情,因为那样他们也可能将所有内容都浸入 LN2/重新连接硬件/等。所以,是的,可以改变机器启动的人通常被认为“赢得”了机器。 (3认同)
  • 但是,如果他们的 UID 是 root,他们就不能更改阻止他们访问的 selinux 权限吗? (2认同)
  • @curious_cat> 刷入系统固件足以打开后门。全盘加密的缺点是你必须给它密钥,并且有物理访问权限我可以窃听它,无论你为此目的使用什么。 (2认同)

And*_*ndy 50

你误解了root用户的概念。

用简单的英语来说,root是在“树的顶端”。

如果你决定有一天拥有一个“超级超级用户”,然后下个月拥有一个“超级超级超级用户”(!)怎么办。你想在树上“向上”多远?您将如何调整所有权限和层次结构以使其工作?谁总是在顶端?必须有人在顶部,而且是root。故事结局。

这里给出的解决方案——包括 AppArmor 和 SELinux——并没有真正改变这一点。它们只是允许对root权限和进程进行更精细的控制。

在我看来,您的更新过程不适合预期的结果。但这根本不是root用户的错。与其将事情复杂化,root不如将其视为最高级别的权限用户,然后是其他一切,您必须向下工作。

我知道有些人会对此进行标记,但用户层次结构中没有更高的级别,所有其他解决方案只是对root权限的工作方式提供了略微不同的控制。但是他们不会创建新用户,具有更高的权限。

您不能拥有“更多权限”的用户,root因为root代表可能的最高权限级别。使用“比 root 更能控制”这样的短语是一个矛盾 -root拥有完全控制权和所有可能的权限,因此在它之上无能为力。

  • 您不能拥有比 root 拥有“更多权限”的用户。这就是整个问题。您要创建的用户 * 是 * 本质上是 root 用户。您需要以另一种方式解决此问题,例如创建具有“root”权限的用户,然后拒绝某些您想要更好控制的用户。您所要求的(“比 root 拥有更多控制权”)是不可能的,甚至是不可能的! (16认同)

CR.*_*CR. 26

如果您只想防止文件或目录被更改/删除,那么只需在它们上设置不可变标志。

chattr +i <file>
Run Code Online (Sandbox Code Playgroud)

除非该标志被移除,否则即使是 root 也无法对它们做任何事情。也可以使用容器/命名空间系统来防止 root 访问,但这对于您所需要的来说似乎有点过分了。

  • @sebasth:正确,但 Apt、dpkg 和 per-package 安装脚本不会(通常)改变文件属性。相反,当他们尝试使用不可变标志更改文件时,他们只会失败并抱怨。 (13认同)
  • 但是 root 可以删除标志。 (11认同)
  • apt 和几乎所有东西一样,不会使用 chattr 删除该标志。 (10认同)
  • @TripeHound 所以 OP 想要 `apt-get` 成功替换文件,但该文件完好无损?我敢说这有点矛盾。 (4认同)
  • @DmitryGrigoryev _听起来_他们希望`apt-get` _think_它成功了,但保留一个或多个文件不变。他们没有说明哪些文件或原因,但正如您所说,有些矛盾 - 并且将来容易出现“奇怪的行为”。 (3认同)
  • @curious_cat:更好的是,您可以将 Apt 配置为在每个软件包安装后运行任意命令。这样的命令可能会调用一个 shell 脚本来恢复有问题的文件。 (2认同)

ctr*_*lor 9

  • 您可以限制 root,而不是拥有超级超级用户。请参阅 在 gnu/linux 上设置文件权限等的不同方法有哪些

  • 还有 AppArmor 和 SELinux。

  • 和/或 configure sudo,这样您就不会放弃完整的 root 权限。您可以对其进行设置,以便用户只能使用预先同意的参数运行预先同意的命令。

  • 您还可以使用虚拟化来限制 root:

    • cgroups、命名空间、chroot 等(docker 会这样做)
    • 虚拟盒子
  • 另请参阅etckeeper:此工具修订版控制/etc目录,并与 apt 同步。默认情况下它不安全,恶意安装可能会破坏它,但您也可以让它将更改推送到防火墙备份存储库。

  • 一般使用修订控制,带有防火墙备份存储库。这有助于防止意外、故意损坏和硬件故障。


防火墙备份存储库可以位于不同的机器上、互联网上或不同的虚拟机(或虚拟机主机)上。


seb*_*sth 8

对于像APT这样的软件,在正常运行时需要访问几乎所有系统,限制是有问题的。即使你阻止它访问系统的某些部分,恶意分发者很可能有足够的可能性来解决。例如,通过替换库或仅替换二进制文件或添加恶意配置更改,最终将使用不受限制的 root。

根据您设置限制的程度,某些安装脚本可能会中断。

对于限制应用程序和用户的方法,您可以编写 AppArmor 或 SELinux 策略。这样的策略哪个更受支持取决于您的发行版:基于 Debian 的对 AppArmor 的支持更好,而基于 Fedora/RHEL 的发行版默认启用 SELinux。

AppArmor 和 SELinux 都适用于白名单策略,其中包含允许(或拒绝)特定操作的规则。策略在exec应用到进程,类似地,当策略在登录时应用到他们的进程时,用户可能会受到限制。一个深思熟虑的策略是无法绕过的(如果不考虑内核错误)。以 root (uid 0) 身份运行的受限进程受配置策略的限制,除非策略中明确允许,否则无法更改它。

AppArmor 策略语言定义了一个拒绝规则,可用于构建黑名单策略。开始使用 AppArmor 的一个好地方是 AppArmor手册页wiki并在/etc/apparmor.d/.

SELinux wiki 中提供了大量 SELinux 管理和开发材料。SELinux参考策略托管在 github 上。


Can*_*uke 7

我不敢相信没有人提到 apt pinning...

几年前,微软发布了一个补丁,使 Windows 10 机器无法与我们旧的 Samba NT4 域控制器通信。发现问题后,我们将 Samba 包固定在当前版本上,并且apt仍然可以正常运行。

完整的Debian 演练很好地解释了这个过程:

/etc/apt/preferences(或下的新文件/etc/apt/preferences.d/)中,添加一些文本以指定哪个包和版本:

Package: samba
Pin: release v=3.6.6-6+deb7u7
Pin-Priority: 900
Run Code Online (Sandbox Code Playgroud)

检查文档以了解确切的语法,但这是我们固定软件包版本的快速而肮脏的方式。Root可以绕过它,因为 root 总是可以做到的,但这解决了包管理器试图自动升级你的包的问题。

注意:此答案假设您有XY 问题


cot*_*eyr 6

其实很简单。

Root 是你的“超级超级用户”

创建一个名为“admin”的帐户,并授予他所有 root 权限,除了您不想要的权限。

然后创建一个名为 bob 的用户,并让他“成为管理员”。通过使用 su 甚至 sudo。

现在你有一个普通用户 (bob) 一个可以做管理工作的超级用户 (admin) 和一个超级超级用户 (root)。

如果您想将名称“root”更改为其他名称,您甚至可以这样做。从技术上讲,只有用户 ID (0) 很重要。

  • 当您试图打破标准约定时,就会发生这种情况。我认为您需要更好地了解 *nix 环境中权限系统的方式和原因。 (3认同)
  • 我同意 Shauna,你似乎对 *nix 权限系统缺乏基本的了解。它非常强大,但与Windows 完全不同。 (2认同)