su
和 sudo
命令都允许用户执行系统管理任务,这些任务对于非特权用户(即除 root 用户之外的所有人)是不允许的。有些人更喜欢 sudo
命令:例如,Seth Kenlon 最近发表了 "在 Linux 上使用 sudo 的 5 个理由",其中赞扬了它的许多优点。
另一方面,我偏爱 su
命令,并且在大多数系统管理工作中更喜欢它而不是 sudo
。在本文中,我将比较这两个命令,并解释为什么我更喜欢 su
而不是 sudo
,但仍然两者都使用。
系统管理员的历史视角
su
和 sudo
命令是为不同的世界设计的。早期的 Unix 计算机需要专职系统管理员,他们使用 root 帐户作为唯一的管理帐户。在那个古老的世界里,受托管理 root 密码的人将以 root 身份登录电传打字机或 CRT 终端(如 DEC VT100),然后执行管理 Unix 计算机所需的管理任务。
root 用户还会有一个非 root 帐户,用于非 root 活动,例如编写文档和管理个人电子邮件。这些计算机上通常有许多非 root 用户帐户,并且这些用户都不需要完全 root 访问权限。用户可能需要以 root 身份运行一两个命令,但非常不频繁。许多系统管理员以 root 身份登录以作为 root 工作,并在完成后退出 root 会话。有些日子需要整天以 root 身份登录。大多数系统管理员很少使用 sudo
,因为它需要键入更多内容才能运行基本命令。
这些工具都提供提升的权限,但它们实现的方式大相径庭。这种差异是由于它们最初旨在用于的不同用例。
sudo
sudo
的最初目的是使 root 用户能够将一两个非 root 用户委派为访问他们经常需要的一两个特定特权命令。sudo
命令为非 root 用户提供临时访问权限,以执行诸如添加和删除用户、删除属于其他用户的文件、安装新软件以及通常管理现代 Linux 主机所需的任何任务。
允许用户访问一个或两个经常使用的需要提升权限的命令,可以为系统管理员节省大量来自用户的请求,并消除等待时间。sudo
命令不会将用户帐户切换为 root;大多数非 root 用户永远不应具有完全 root 访问权限。在大多数情况下,sudo
允许用户发出一两个命令,然后允许权限提升过期。在此短暂的时间间隔内(通常配置为 5 分钟),用户可以执行任何需要提升权限的必要管理任务。需要继续使用提升的权限但尚未准备好发出另一个与任务相关的命令的用户可以运行 sudo -v
命令来重新验证凭据并将时间延长 5 分钟。
使用 sudo
命令确实会产生副作用,即生成非 root 用户使用的命令的日志条目,以及他们的 ID。日志可以帮助解决问题相关的事后分析,以确定用户何时需要更多培训。(您以为我要说“分配责任”,不是吗?)
su
su
命令旨在允许非 root 用户将其特权级别提升到 root 用户的级别——实际上,非 root 用户变成了 root 用户。唯一的要求是用户知道 root 密码。对此没有限制,因为用户现在以 root 身份登录。
su 命令提供的权限提升没有时间限制。用户可以根据需要以 root 身份工作任意时长,而无需重新身份验证。完成后,用户可以发出 exit 命令从 root 恢复到他们自己的非 root 帐户。
争议和变化
最近关于 su
与 sudo
的用途存在一些分歧。
真正的 [系统管理员] 不使用 sudo。 —Paul Venezia
Venezia 在他的 InfoWorld 文章 中认为,sudo
被许多充当系统管理员的人用作不必要的道具。他没有花太多时间捍卫或解释这个立场;他只是将其陈述为一个事实。我同意他的观点——对于系统管理员而言。我们不需要辅助轮来完成我们的工作。事实上,它们会碍事。
然而,
时代在变。 —Bob Dylan
Dylan 是正确的,尽管他不是在唱关于计算机的事情。自从一人一电脑时代出现以来,管理计算机的方式发生了重大变化。在许多环境中,计算机的用户也是其管理员。这使得有必要为这些用户提供对 root 权限的一些访问。
某些现代发行版(如 Ubuntu 及其衍生版本)配置为专门使用 sudo
命令来执行特权任务。在这些发行版中,不可能直接以 root 用户身份登录,甚至无法 su
到 root,因此需要 sudo
命令来允许非 root 用户访问任何 root 权限。在这种环境中,所有系统管理任务都使用 sudo
执行。
可以通过锁定 root 帐户并将常规用户帐户添加到 wheel 组来实现此配置。这种配置可以很容易地被规避。在任何 Ubuntu 主机或 VM 上尝试一个小实验。让我在这里规定一下设置,以便您在需要时可以重现它。我安装了 Ubuntu 16.04 LTS1,并使用 VirtualBox 将其安装在 VM 中。在安装过程中,我创建了一个非 root 用户 student,并为此实验设置了一个简单的密码。
以用户 student 身份登录并打开终端会话。查看 /etc/shadow
文件中 root 的条目,其中存储了加密密码。
student@ubuntu1:~$ cat /etc/shadow
cat: /etc/shadow: Permission denied
权限被拒绝,因此我们无法查看 /etc/shadow
文件。这在所有发行版中都很常见,以防止非特权用户查看和访问加密密码,这将使使用常见的黑客工具破解这些密码成为可能。
现在让我们尝试 su -
到 root。
student@ubuntu1:~$ su -
Password: <Enter root password – but there isn't one>
su: Authentication failure
这失败了,因为 root 帐户没有密码并且被锁定。使用 sudo
命令查看 /etc/shadow
文件。
student@ubuntu1:~$ sudo cat /etc/shadow
[sudo] password for student: <enter the student password>
root:!:17595:0:99999:7:::
<snip>
student:$6$tUB/y2dt$A5ML1UEdcL4tsGMiq3KOwfMkbtk3WecMroKN/:17597:0:99999:7:::
<snip>
我截断了结果,仅显示 root 和 student 用户的条目。我还缩短了加密密码,以便该条目可以容纳在一行中。字段用冒号 (:
) 分隔,第二个字段是密码。请注意,root 的密码字段是一个感叹号,世界其他地方都知道它是一个感叹号 (!
)。这表明该帐户已锁定并且无法使用。
现在,您需要做的就是为 root 帐户设置密码,以便将 root 帐户用作合适的系统管理员。
student@ubuntu1:~$ sudo su -
[sudo] password for student: <Enter password for student>
root@ubuntu1:~# passwd root
Enter new UNIX password: <Enter new root password>
Retype new UNIX password: <Re-enter new root password>
passwd: password updated successfully
root@ubuntu1:~#
现在,您可以直接在控制台上以 root 身份登录,或者直接 su
到 root,而不是每次想要以 root 身份登录时都使用 sudo
。当然,您可以每次想要以 root 身份登录时都使用 sudo su -
,但何必呢?
请不要误解我。像 Ubuntu 及其上游和下游相关的发行版都非常好,并且多年来我使用过其中的几个。当使用 Ubuntu 和相关发行版时,我做的第一件事就是设置 root 密码,以便我可以直接以 root 身份登录。其他发行版,如 Fedora 及其相关版本,现在在安装过程中提供了一些有趣的选择。我注意到这一点的第一个 Fedora 版本是 Fedora 34,我在编写即将出版的书籍时多次安装了它。
其中一个安装选项可以在设置 root 密码的页面上找到。新选项允许用户选择“锁定 root 帐户”,就像 Ubuntu root 帐户被锁定的方式一样。此页面上还有一个选项允许使用密码以 root 身份远程 SSH 登录到此主机,但这仅在 root 帐户解锁时才有效。第二个选项在允许创建非 root 用户帐户的页面上。此页面上的选项之一是“使此用户成为管理员”。选中此选项后,用户 ID 将被添加到名为 wheel 组的特殊组中,该组授权该组的成员使用 sudo
命令。Fedora 36 甚至在该复选框的描述中提到了 wheel 组。
可以将多个非 root 用户设置为管理员。使用此方法指定的任何管理员都可以使用 sudo
命令在 Linux 计算机上执行所有管理任务。Linux 在安装期间仅允许创建一个非 root 用户,因此可以在创建其他新用户时将其添加到 wheel 组。现有用户可以由 root 用户或其他管理员直接使用文本编辑器或 usermod
命令添加到 wheel 组。
在大多数情况下,今天的管理员只需要执行一些基本任务,例如添加新打印机、安装更新或新软件,或删除不再需要的软件。这些 GUI 工具需要 root 或管理员密码,并将接受指定为管理员的用户的密码。
我在 Linux 上如何使用 su 和 sudo
我同时使用 su
和 sudo
。它们在我的系统管理员工具箱中各自占有重要的位置。
我无法锁定 root 帐户,因为我需要使用它来运行我的 Ansible Playbook 和我编写的用于执行备份的 rsbu Bash 程序。这些都需要以 root 身份运行,我编写的其他几个管理 Bash 脚本也是如此。我使用 su
命令将用户切换到 root 用户,以便我可以执行这些以及许多其他常见任务。当执行问题确定和解决时,使用 su
将我的权限提升到 root 特别有用。当我在思考过程中时,我真的不希望 sudo
会话超时。
当非 root 用户需要执行需要 root 权限的任务时,我使用 sudo
命令。我在 sudoers 文件中设置非 root 帐户,使其仅访问完成任务所需的一两个命令。当我只需要运行一两个具有提升权限的快速命令时,我自己也使用 sudo
。
结论
您使用的工具远不如完成工作重要。如果您使用 vim 或 Emacs、systemd 或 SystemV、RPM 或 DEB、sudo
或 su
,又有什么区别呢?这里的底线是您应该使用您最舒适并且最适合您的工具。Linux 和开源的最大优势之一是,对于我们需要完成的每项任务,通常都有许多选项可用。
su
和 sudo
各有优势,并且当正确应用于其预期用例时,两者都可以是安全的。我选择主要在其历史角色中使用 su
和 sudo
,因为这对我有用。我更喜欢 su
用于我自己的大部分工作,因为它最适合我和我的工作流程。
在评论中分享您喜欢的工作方式!
本文摘自我的书《系统管理员的 Linux 哲学》(Apress,2018 年)第 19 章,经许可转载。
12 条评论