为什么 sudo 命令不需要 root 密码?

为什么 sudo 命令不需要 root 密码?

我已经使用 Linux 一段时间了,每当我输入命令时,sudo我都以为我正在切换到 root 用户来执行命令。

显然这不是真的,因为我需要的只是我的用户帐户的密码。我猜因为我没有与多个用户一起工作,所以我在现实世界中并没有真正注意到这一点。

我不确定 Ubuntu 如何设置我的第一个帐户。有root用户吗?我是根吗?我猜我刚刚在安装时创建了一个新用户,但它给了我 root 权限?这里只是有点困惑...

那么为什么我可以使用我的用户密码运行 root 命令呢?

答案1

详细来说,它的工作方式如下:

  1. /usr/bin/sudo可执行文件有setuid位设置,因此即使由另一个用户执行,它也会以文件所有者的用户 ID(在这种情况下为 root)运行。

  2. sudo在文件中检查/etc/sudoers您拥有哪些权限以及是否允许您运行正在调用的命令。简单地说,/etc/sudoers就是一个文件,它定义了哪些用户可以使用sudo机制运行哪些命令。

    这就是该文件在我的 Ubuntu 上的样子:

    # User privilege specification
    root    ALL=(ALL:ALL) ALL
    
    # Members of the admin group may gain root privileges
    %admin ALL=(ALL) ALL
    
    # Allow members of group sudo to execute any command
    %sudo   ALL=(ALL:ALL) ALL
    

    第三行可能是您感兴趣的内容。它允许“sudo”组中的任何人以任何用户身份执行任何命令。

    当 Ubuntu 在安装过程中设置第一个帐户时,它会将该帐户添加到“sudo”组中。您可以使用命令检查用户属于哪些组group

  3. sudo要求您输入密码。关于它需要用户密码而不是 root 密码这一事实,这是摘录自sudoers手册:

    身份验证和日志记录

    sudoers 安全策略要求大多数用户在使用 sudo 之前先进行身份验证。如果调用用户是 root、目标用户与调用用户相同或者策略已禁用用户或命令的身份验证,则不需要密码。与 su(1) 不同,当 sudoers 需要身份验证时,它会验证调用用户的凭据,而不是目标用户(或根用户)的凭据。这可以通过 rootpw、targetpw 和 runaspw 标志进行更改,稍后将进行描述。

    然而,事实上,sudo任何事情都不需要您的用户密码。它要求它只是为了确保您确实是您,并在调用某些潜在危险的命令之前向您提供某种警告(或停止的机会)。如果您想关闭密码询问,请将 sudoers 条目更改为:

    %sudo   ALL=(ALL:ALL) NOPASSWD: ALL
    
  4. 身份验证后sudo会生成运行调用的命令的子进程。子进程从其父进程(即进程)继承 root 用户 ID sudo


那么,准确回答你的问题:

我以为我正在切换到 root 用户来执行命令。

你是对的。每个以 开头的命令都sudo以 root 用户 ID 运行。

有root用户吗?

是的,有一个 root 用户帐户,与系统安装期间创建的用户帐户分开。但是,默认情况下,Ubuntu 不允许您以 root 用户身份登录交互式终端。

我是根吗?

不,你不是根。你仅具有以 root 身份运行单个命令的权限,使用sudo上述机制。

那么为什么我可以使用我的用户密码运行 root 命令呢?

sudo由于内部安全机制,您只需输入用户密码。它可以很容易地关闭。您获得 root 权限是因为 setuid 位/usr/bin/sudo,而不是因为您输入的任何密码。

答案2

  • 的全部目的sudo是授予您其他人的权限(通常是 root),而无需询问其他帐户的密码(与 不同su)。

  • sudo在这里询问您的密码只是为了确保路人不会滥用您未锁定的终端。

  • Ubuntu 和许多其他 Linux 和 Unix 操作系统授予在安装时创建的初始帐户以root.

  • 虽然root仍然是Linux下的帐户,但root为了更好的安全性和可追溯性,默认情况下禁用直接登录。

答案3

Piotr 很好地解释了它的sudo工作原理。然而他并没有真正激励为什么它是这样工作的,所以我会尝试在这里添加它。

sudo在创建命令之前,我们已经有了su命令。通常,此命令允许一个用户以另一用户的身份执行命令root(与 一样sudo,这是默认目标用户)。它完全不加区别,你可以执行任何命令。由于它可以由任何用户使用,实际上相当于以该用户身份登录,因此它要求您知道目标用户的密码。

在某些时候,添加了更多的访问控制:要使用su,您必须是该组的成员wheel。但由于您仍然可以执行任何命令,因此要求您知道他们的密码仍然有意义。

不过,要求用户知道彼此或超级用户的密码并不是很安全。通常,您只想授予某些用户对其他帐户的有限访问权限(这是称为“安全概念”的安全概念的一部分)最小特权原则)。这也使得问责变得困难:如果多个人知道一个帐户的密码,并且该帐户涉及错误或滥用,您将无法判断到底是哪一个人干的。

于是就sudo被创造出来了。它不是允许用户执行任何命令,而是有一个复杂的配置文件,在 Piotr 的回答中简要介绍过,它准确地指定了谁可以使用它、他们可以切换到哪些用户以及允许他们运行哪些命令。通过这种对谁可以对谁做什么的细粒度控制,我们不再需要向用户提供目标帐户的密码;如果我们这样做,他们可以通过以该用户身份登录来轻松绕过配置文件中的所有控制。相反,我们通常只要求他们通过输入自己的密码来证明自己登录的身份——这是为了防止有人在终端无人看管的情况下利用帐户。

对于超级用户来说,这个要求被免除了——这个帐户可以在不使用 的情况下对系统执行几乎任何操作sudo,因此它被认为是多余的。还可以在配置文件中指定用户根本不必输入密码——一些组织在认为其工作站环境的物理安全性足以防止滥用时使用此方法。

答案4

首先,禁用帐户通常是通过将加密密码设置为*来完成的,这不是任何字符串的加密值。我现在无法检查,但我相信 Ubuntu 对 root 也是如此。所以从技术上来说,Ubuntu 上没有 root 密码。

但 sudo 早于 Ubuntu;它是为肯定有 root 密码的系统而设计的。那么为什么它不需要 root 密码呢?基本上,sudo 的设计目的是向某些用户授予运行特定命令的权限——例如​​,允许开发人员以 root 访问权限重新启动 Web 应用程序,但不允许启动任意服务器。另一方面,知道 root 密码可以让您无限制地访问;您可以使用 login 或 su 打开 root shell 并运行任意命令。由于 sudo 必须为没有该访问级别的人工作,因此它不需要 root 密码才能运行。

相关内容