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

EGH*_*HDK 52 sudo

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

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

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

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

Pio*_*icz 66

具体来说,它的工作方式如下:

  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
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

    身份验证和日志记录

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

    但是,实际上,sudo不需要您的用户密码进行任何操作。它要求它只是为了确保你真的是你,并在调用一些潜在危险的命令之前为你提供某种警告(或停止的机会)。如果要关闭密码询问,请将 sudoers 条目更改为:

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


因此,准确回答您的问题:

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

你是对的。每个命令都以sudoroot 用户 ID 运行。

有root用户吗?

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

我是根吗?

不,你不是根。您只能使用上述sudo机制以 root 身份运行单个命令

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

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

  • 答案应该真正从 setuid 部分开始,因为这就是它实际上可能的原因。/etc/sudoers 正是 sudo 命令灵活的原因。 (6认同)
  • 你_可以_实际上以 root 用户身份登录:`sudo su - root` 会这样做并给你一个 root 终端。但是,您无法以 root 用户身份轻松登录到桌面会话。 (2认同)

jll*_*gre 15

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

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

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

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

  • 虽然默认情况下确实禁用了直接 root 登录,但 Ubuntu 仍然有一个 root 帐户。至少在默认情况下它是角色的 Solaris 上不再是帐户。 (7认同)

Bar*_*mar 7

Piotr 很好地解释了sudo工作原理。但是,他并没有真正说明为什么它会以这种方式工作,所以我将尝试在此处添加。

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

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

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

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

超级用户免除此要求 - 此帐户几乎可以对系统执行任何操作而无需使用sudo,因此它被认为是多余的。还可以在配置文件中指定用户根本不需要输入密码——当某些组织认为其工作站环境的物理安全性足以防止滥用时,就会使用此密码。