我已经使用 Linux 一段时间了,每当我输入时,sudo
我都以为我正在切换到 root 用户来执行命令。
显然这不是真的,因为我需要的只是我的用户帐户的密码。我猜因为我没有与多个用户一起工作过,所以我在现实世界中并没有真正注意到这一点。
我不确定 Ubuntu 如何设置我的第一个帐户。有root用户吗?我是根吗?我猜我刚刚在安装时创建了一个新用户,但它给了我 root 权限?只是在这里有点困惑......
那么为什么我可以使用我的用户密码运行 root 命令呢?
Pio*_*icz 66
具体来说,它的工作方式如下:
/usr/bin/sudo
可执行文件设置了setuid 位,因此即使由另一个用户执行,它也会使用文件所有者的用户 ID(在这种情况下为 root)运行。
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
命令检查哪些用户属于哪些组。
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)身份验证后会sudo
生成运行调用命令的子进程。子sudo
进程从其父进程继承 root 用户 ID 。
因此,准确回答您的问题:
我以为我正在切换到 root 用户来执行命令。
你是对的。每个命令都以sudo
root 用户 ID 运行。
有root用户吗?
是的,有一个 root 用户帐户,与您在系统安装期间创建的用户帐户不同。但是,默认情况下,在 Ubuntu 中,您不允许以 root 用户身份登录交互式终端。
我是根吗?
不,你不是根。您只能使用上述sudo
机制以 root 身份运行单个命令。
那么为什么我可以使用我的用户密码运行 root 命令呢?
由于sudo
内部安全机制,您只需要输入用户密码。它可以很容易地关闭。您获得 root 权限是因为 setuid 位/usr/bin/sudo
,而不是因为您输入的任何密码。
jll*_*gre 15
重点sudo
是授予您其他人的权限(通常是 root),而无需询问其他帐户的密码(与 不同su
)。
sudo
在这里询问您的密码只是为了确保路人不会滥用您未锁定的终端。
Ubuntu 和许多其他 Linux 和 Unix 操作系统授予在安装时创建的初始帐户以root
.
虽然root
仍然是 Linux 下的帐户,但root
为了更好的安全性和可追溯性,默认情况下禁用直接登录。
Piotr 很好地解释了sudo
工作原理。但是,他并没有真正说明为什么它会以这种方式工作,所以我将尝试在此处添加。
在sudo
创建命令之前,我们已经有了su
命令。此命令允许一个用户以另一个用户身份执行命令,通常root
(与 一样sudo
,这是默认目标用户)。它完全没有区别,您可以执行任何命令。由于它可以被任何用户使用,实际上相当于以该用户的身份登录,它要求您知道目标用户的密码。
在某些时候,添加了更多的访问控制:要使用su
,您必须是wheel
组的成员。但是由于您仍然可以执行任何命令,因此要求您知道他们的密码仍然是有意义的。
但是,要求用户知道彼此或超级用户的密码并不是很安全。通常,您只想授予某些用户对其他帐户的有限访问权限(这是称为最小权限原则的安全概念的一部分)。这也使问责变得困难:如果多个人知道一个帐户的密码,并且该帐户涉及错误或滥用,您将无法分辨是他们中的哪一个真正做到了。
所以sudo
被创造了。它没有允许用户执行任何命令,而是有一个精心设计的配置文件,在 Piotr 的回答中简要提及,它准确指定了谁可以使用它,他们可以切换到哪些用户,以及允许他们运行哪些命令。通过这种对谁可以对谁做什么的细粒度控制,我们不再需要向用户提供目标帐户的密码;如果我们这样做,他们可以通过以该用户身份登录轻松绕过配置文件中的所有控件。相反,我们通常只要求他们通过输入自己的密码来证明他们的登录身份——这是为了防止有人在终端无人看管的情况下利用帐户。
超级用户免除此要求 - 此帐户几乎可以对系统执行任何操作而无需使用sudo
,因此它被认为是多余的。还可以在配置文件中指定用户根本不需要输入密码——当某些组织认为其工作站环境的物理安全性足以防止滥用时,就会使用此密码。