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


48

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

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

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

那么,为什么允许我使用用户密码运行root命令?


使用哪个用户需要密码,而不需要哪个用户?您正在运行什么命令?请记住,在您必须重新输入密码之前,sudo会存储您的密码一段时间。
Braiam 2014年

11
sudo设置了“ setuid”位。因此,它以拥有它的用户(如果没有记错的话,它是所有标准系统的根用户)的身份运行,而不是启动它的用户。 sudo然后加载/etc/sudoers文件并根据谁启动文件检查允许的内容。
LawrenceC


1
很抱歉,如果我要重复别人说的话,但找不到。答案是:这是一项政策决定。我对这个动机的最佳猜测是,在大型安装中,您有很多sudo特权用户,也许是在地理位置分散的地方工作,并且需要按24×7轮班工作,因此您希望能够立即撤销一个人的特权访问权限(例如,如果您怀疑他的完整性)。如果每个人都使用一个唯一的root密码,并且您在没有事先协调的情况下进行更改,则可能会造成混乱。…
G-Man说'Resstate Monica'

1
@HagenvonEitzen我知道我一两天晚了,这是怎么回事不是我们的问题的欺骗?
凌晨

Answers:


65

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

  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生成运行所调用命令的子进程。子级从其父级(sudo过程)继承根用户ID 。


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

我以为我要切换到root用户执行命令。

你是对的。每个命令前面都带有sudoroot用户ID。

有root用户吗?

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

我有根吗?

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

那么,为什么允许我使用用户密码运行root命令?

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


6
答案实际上应该从setuid部分开始,因为这实际上是可能的。/ etc / sudoers只是sudo命令灵活性的原因。
丹尼尔·库尔曼2014年

有趣。我不知道您可以指定sudo不输入密码即可运行。好答案!
jwir3

1
请注意,可以将sudo配置为要求输入带有rootpw标记的root密码sudoers
恢复莫妮卡-M.Schröder2014年

2
实际上,您可以以root用户身份登录:sudo su - root将执行此操作,并为您提供root终端。但是,您无法轻松地以root用户身份登录到桌面会话。
jmiserez 2014年

1
基本上sudo,它本身具有root特权,并且它根据配置文件决定是否将其授予您。
任思远2014年

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

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

  • Ubuntu以及许多其他Linux和Unix OS都授予在安装时创建的初始帐户的权利,以运行任何命令root

  • 虽然root在Linux下仍然是一个帐户root,但是默认情况下禁用直接登录,以提高安全性和可追溯性。


7
尽管默认情况下确实禁止直接root登录,但是仍然有Ubuntu的root帐户。至少在Solaris(默认情况下是角色)上,它不再是帐户。
jlliagre 2014年

非常感谢-我一直想知道它如何工作,现在变得更有意义了。
mikeserv

5

皮奥特(Piotr)对sudo工作原理做了很好的解释。但是,他并没有真正激励为什么它会以这种方式起作用,因此我将在此处尝试添加。

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

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

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

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

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


我没有对此进行探讨,但是我了解su没有的sudo的功能之一是它(能够吗?)记录由哪个用户运行了哪些命令,从而更容易地将问题追溯到他们的来源。我只是看了看我的kubuntu系统,却没有看到这样的日志,因此这可能不是默认行为。
2014年

刚刚在/var/log/auth.log中找到了sudo登录-以及许多其他东西,包括来自中国的IP,试图让root ssh访问我的系统-因此,如果您只想查看sudo,则必须过滤通过grep或类似的代码。
2014年

正确。su也会记录日志,但是由于它只是启动了一个新的shell,因此它记录的是有人运行它的事实。
Barmar 2014年

您不能依赖日志,任何可以root权限的人都可以更改日志(除非您登录到另一台计算机,并确保在日志记录事务完成之前不授予访问权限)。但是,sudo确实允许撤消特权,而不必向需要它的所有人重新颁发根密码。
ctrl-alt-delor

1
@richard因为sudo允许您限制用户可以执行哪些命令,所以您可以尝试确保您不让他们访问将覆盖日志的命令。
Barmar

3

您的问题的答案是:

使用sudo运行命令时,将以提升的特权(即root特权)运行命令。您只需要输入普通用户密码,因为您(用户)已被添加到sudoers文件中,从而为您提供root特权


2
除sudo并不意味着提升的特权外,其他特权与当前用户不同。例如,您可以以没有外壳程序的普通用户身份运行程序。而且,在sudoers文件中不会提供root。
James Tocknell 2014年

1
@aragilar yes sudo并非总是提供提升的特权,但是在执行其操作后(检查身份验证,它可能会放弃特权),它的确以提升的特权运行。它需要这些提升的特权才能更改用户。
ctrl-alt-delor

1
当然,sudo的确使用提升的特权(但这并不是sudo所独有的,例如mount也是如此),但是调用commandin 的命令sudo command可能不会(取决于in中的设置 /etc/sudoers)。
James Tocknell 2015年

1

首先,通常通过将加密密码设置为*来禁用帐户,该密码不是任何字符串的加密值。我现在无法检查,但我相信Ubuntu也会这样做。因此从技术上讲,Ubuntu上没有root密码。

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


它还允许人们撤消用户的root特权,而不必更改root密码。
伊恩·斯科特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.