无法更改root密码的root访问权限?

244*_*4an 66 security ubuntu sudo

我们在服务器上遇到了一个小问题。我们希望某些用户应该能够执行 egsudo并成为 root,但有用户不能更改 root 密码的限制。也就是说,保证我们仍然可以登录到该服务器并成为 root,无论其他用户做什么。

那可能吗?

Jos*_* R. 92

这实际上是不可能的。首先,如果您授予他们成为 root的权力,那么您将无法阻止他们做任何事情。在您的用例中,sudo应用于授予您的用户一些 root 权限,同时限制其他人,不允许他们成为 root

在您的场景中,您需要限制对supasswd命令的访问并开放对几乎所有其他内容的访问。问题是,您无法阻止用户直接编辑/etc/shadow(或/etc/sudoers就此而言)并输入替换的 root 密码来劫持 root。这只是最直接的“攻击”场景。除了一两个命令之外,拥有不受限制的权限的 Sudoers 可以绕过限制来劫持完全的 root 访问权限。

正如SHW 在评论中所建议的,唯一的解决方案是使用sudo授予您的用户访问受限命令集的权限。


更新

如果您使用 Kerberos 票证进行身份验证,则可能有一种方法可以实现此目的。阅读本文档解释文件的使用.k5login

我引用相关部分:

假设用户 alice 的主目录中有一个 .k5login 文件,其中包含以下行:
bob@FOOBAR.ORG
这将允许 bob 使用 Kerberos 网络应用程序,例如 ssh(1),使用 bob 的 Kerberos 票证访问 alice 的帐户。
...
请注意,因为 bob 为他自己的主体保留了 Kerberos 票证bob@FOOBAR.ORG,所以他将没有任何需要 alice 票证的特权,例如对任何站点主机的 root 访问权限,或更改 alice 密码的能力。

不过,我可能错了。我仍在浏览文档,还没有亲自尝试 Kerberos。


use*_*ser 57

我们希望一些用户应该能够做到例如sudo并成为 root,

嗯,这就是 sudo 旨在解决的问题,所以这部分很容易。

但是有用户不能更改root密码的限制。

正如SHW在评论中指出的那样,您可以将 sudo 配置为仅允许某些用户以 root 身份执行某些操作。也就是说,您可以允许用户 1 执行sudo services apache2 restart,允许用户 2 执行sudo reboot但不执行其他操作,同时允许受雇为系统管理员user3执行sudo -i。有关于如何像这样设置 sudo 的方法,或者您可以在此处搜索(或询问)。这是一个可以解决的问题。

但是,已被授予进入sudo -isudo进入 shell(sudo bash例如)的能力的用户可以做任何事情。那是因为当 sudo 启动 shell 时,sudo 本身已经不在画面中了。它提供不同用户(通常是 root)的安全上下文,但对执行的应用程序的功能没有发言权。如果该应用程序依次启动passwd root,则 sudo 对此无能为力。请注意,这也可以通过其他应用程序完成;例如,许多更高级的编辑器提供了通过 shell 执行命令的工具,shell 将使用该编辑器进程(即 root)的有效 uid 执行

也就是说,保证我们仍然可以登录到该服务器并成为 root,无论其他用户做什么。

对不起; 如果您的意思确实是“确保我们能够登录并使用系统,无论具有 root 访问权限的人对其进行什么操作”,那么(出于所有意图和目的)都无法完成。一个快速的“sudo rm /etc/passwd”或“sudo chmod -x /bin/bash”(或任何shell root使用的),无论如何你都差不多。“几乎被冲洗”意味着“你需要从备份中恢复,并希望他们不会做任何比手指滑动更糟糕的事情”。您可以采取一些措施来降低导致系统无法使用的意外事故的风险,但您无法防止恶意造成非常严重的问题,包括需要从头或至少从已知重建系统的点好的备份。

通过向用户授予系统上不受限制的 root 访问权限,您相信该用户(包括他们可能选择执行的任何软件,甚至是像 ls 这样的普通软件)没有恶意,也不会意外搞砸。这就是 root 访问的本质。

有限公司通过如sudo的根访问是一个好一点,但你还是要小心,不要打开任何攻击向量。使用 root 访问权限,有很多可能的攻击媒介进行权限提升攻击。

如果您不能以 root 所需的访问级别信任他们,您将需要非常严格的 sudo 配置,或者根本不通过任何方式(sudo 或其他方式)授予有问题的用户 root 访问权限。

  • 很抱歉我的回答被炒作了(我不太明白!)。你的回答提出了很好的观点,我希望它被接受。+1 给你,先生。 (3认同)

Has*_*sse 17

我假设您想确保您拥有“紧急管理员”访问权限,即使您的实际管理员搞砸了(但除此之外,您完全信任主管理员)。

一种流行的方法(虽然非常hackish)是让第二个用户使用uid=0,通常命名为toor(root 向后)。它有一个不同的密码,可以作为备份访问。要添加,您可能需要编辑/etc/passwd/etc/shadow(复制root行)。

这几乎是万无一失的,但是如果您只需要防止“主要管理员”在没有通知的情况下更改密码,那么它就会起作用。通过删除toor帐户来禁用是微不足道的;所以唯一的好处是有一个单独的密码。

或者,您可能想要研究替代身份验证机制,即ssh密钥libnss-extrausers、LDAP 等。

请注意,管理员仍然可以搞砸。例如,通过阻止防火墙。

如果您想要一个非常安全的系统,请考虑使用 SELinux,其中 unix 用户(例如 root)也带有一个角色,可以更细粒度。您可能希望授予您的管理员 root 访问权限,但只是一个受限制的角色(例如,仅管理 apache)。但这需要您付出很多努力才能正确配置策略。

  • 如果唯一的目标是防止*意外* 密码更改,这是一个很好的答案。如果目标是防止任何恶意行为,这没有多大帮助。由于 OP 没有说明目标是什么,我们不知道。 (9认同)
  • 这实际上并不能阻止用户 `toor` 更改 root 密码;它只提供第二个密码来成为 root。 (6认同)
  • -1,那么。您建议使用后门密码,以便管理员在丢失后可以恢复 root 访问权限???这只是错误的做法,除了讨厌的用户可以轻松禁用它,正如您所说。有更可靠的方法来设置后门。 (2认同)
  • @alexis 恕我直言,**问题** 的作者提出了这个要求。为什么要为此提供-1?几十年来,`toor` 恢复帐户一直是 Unix 上的常见做法(尽管不赞成)。 (2认同)
  • 这就是为什么我在第一句话中说:“搞砸了......除此之外,你完全信任......”。这实际上只是一个“支持访问”解决方案;不是安全功能。使用额外的 root ssh 密钥也能达到同样的效果,而且不会很黑。 (2认同)

rjm*_*nro 11

至少在理论上,使用SELinux可能会做到这一点。这允许您设置关于用户或进程允许或不允许做什么的更精确的规则。即使使用 SELinux,要让用户无法更改 root 密码,但仍然可以做他们可能需要做的任何事情,这可能很棘手。

实际上,这取决于不允许更改 root 密码的用户实际上需要能够做什么。弄清楚那是什么,并专门使用 sudo 授予这些权限可能会更容易和更安全。

  • 虽然理论上用 SELinux 这样做是可能的(我不相信),但声称它没有显示实际规则对任何人都没有帮助。 (8认同)
  • 如果你知道怎么做,请回答[神话或现实:SELinux 可以限制 root 用户?](http://unix.stackexchange.com/questions/106595/myth-or-reality-selinux-can-confine-根用户) (2认同)

ale*_*xis 11

root的本质是对系统拥有不受限制的命令。你可以用 SELinux 来调整它(曾经有一个演示站点,任何人都可以以 root 身份登录,但它的功能通过访问系统被削弱了),但这不是重点。关键是这是您问题的错误解决方案。

现在,您还没有说明您的问题是什么,但是如果您不相信这些用户不会接触到 root 密码,那么他们就没有资格成为 root。如果他们需要管理网络服务器、各种硬件设备、扭曲驱动器或其他任何东西,请为此设置一个解决方案。创建一个超级强大的组,为其提供所需的所有访问权限,并将其添加到其中。如果他们需要执行仅限 root 的系统调用,请编写一些 setuid 程序。

当然,具有这种访问权限(和一些知识)的用户可能很容易入侵系统,但至少您正在使用操作系统安全模型,而不是反对它。

附注。有很多方法可以在没有密码的情况下为自己安排 root 访问;一方面,如果您在/etc/sudoers(无限制)中,您只需要自己的密码即可成为 root,例如使用sudo bash. 但你根本不需要去那里。


DSi*_*mon 7

也许您应该考虑让用户拥有对虚拟机或 LXC 容器的 root 访问权限。这将允许他们拥有对系统的完全 root 访问权限,而不会阻止您登录主机或执行管理操作。


Rob*_*ans 5

这种说法sudo只是授予根并没有后,没有保护是公然假的。

您用于visudo修改 sudoers 文件。这是一个示例行:

redsandro ALL=(ALL:ALL) NOPASSWD:/path/to/command
Run Code Online (Sandbox Code Playgroud)
  • redsandro是我们授予权限的用户名。将 a%放在前面以使其适用于组。
  • ALL是此规则的名称。Sudoers 可以做的不仅仅是授予全局权限。这就是它变得复杂的地方。
  • = 不需要解释
  • ALL:ALL读作 (who_to_run_it_as:what_group_to_run_it_as)。通过这种方式,您可以允许运行命令,但只能在特定用户或组的上下文中运行。
  • NOPASSWD: 告诉它关闭密码提示。
  • /path/to/command 允许您指定特定命令 path_to_commmand、another_command

需要记住的是,虽然sudo家庭用户主要使用它来升级到 root 权限,但它可以并且用于以更精细的方式控制对特定命令的访问。

参考

  • 了解方法的局限性与了解如何执行任务一样重要。 (6认同)
  • *“关于 sudo 仅用于授予 root 权限并且此后没有任何保护的声明是公然错误的。”* 假设我授予用户 `sudo vi` 访问权限,因为我希望他们能够编辑系统配置文件。然后该用户在 `sudo vi` 会话中执行 `:!/bin/bash`。在这些情况下,sudo 限制用户可以通过 sudo 执行哪些命令的能力如何帮助保护我的系统?(没有人说过 sudo 不能比全有或全无的 `sudo -i` 方法配置得更紧密。) (3认同)

SHW*_*SHW 5

我不知道这实际上是否可行,但这是一个肮脏的黑客:

  1. 编写一个包装脚本/程序,它将/etc/passwd在调用实际文件之前将文件复制到其他位置sudo
  2. 允许普通用户使用 sudo
  3. 一旦他完成任务,或者当他从sudo出来时,恢复/etc/passwd文件

我知道,要实现这一目标,您必须考虑很多正负的事情。毕竟,这是一个肮脏的黑客

  • 为什么要授予潜在恶意用户的 root 访问权限???作为 root,安装一个不依赖于 sudo 和/或包装器的后门是微不足道的...... (5认同)
  • 恶意用户总是有可能阅读此脚本并破坏备份副本。 (3认同)