关于 sudo 你可能不知道的事

你认为你了解关于 sudo 的一切?再想想。
201 位读者喜欢这篇文章。
Command line prompt

Opensource.com

每个人都知道 sudo,对吧?这个工具默认安装在大多数 Linux 系统上,并且适用于大多数 BSD 和商业 Unix 变体。然而,在与数百名 sudo 用户交谈后,我收到的最常见的答案是 sudo 是一个让生活变得复杂的工具。

已经有一个 root 用户和 su 命令,为什么还要另一个工具?对于许多人来说,sudo 只是管理命令的前缀。只有少数人提到,当您为同一个系统有多个管理员时,您可以使用 sudo 日志来查看谁做了什么。

那么,sudo 是什么?根据 sudo 网站

“Sudo 允许系统管理员通过授予某些用户以 root 或其他用户身份运行某些命令的能力来委派权限,同时提供命令及其参数的审计跟踪。”

默认情况下,sudo 附带一个简单的配置,一个简单的规则,允许用户或用户组实际执行任何操作(本文后面会详细介绍配置文件)。

%wheel ALL=(ALL) ALL

在此示例中,参数的含义如下

  • 第一个参数定义了组的成员。
  • 第二个参数定义了组成员可以在哪些主机上运行命令。
  • 第三个参数定义了可以在其下执行命令的用户名。
  • 最后一个参数定义了可以运行的应用程序。

因此,在此示例中,wheel 组的成员可以在所有主机上以所有用户身份运行所有应用程序。即使这个非常宽松的规则也很有用,因为它会记录谁在您的机器上做了什么。

别名

当然,一旦不仅仅是你和你最好的朋友管理共享服务器,你就会开始微调权限。您可以用列表替换上述配置中的项目:用户列表、命令列表等等。最有可能的是,您将在配置中复制和粘贴其中的一些列表。

这种情况就是别名可以派上用场的地方。在多个地方维护相同的列表容易出错。您只需定义一次别名,然后就可以多次使用它。因此,当您不再信任您的某位管理员时,您可以将他们从别名中删除,这样就完成了。使用多个列表而不是别名时,很容易忘记从具有提升权限的列表中删除用户。

为特定用户组启用功能

sudo 命令附带大量默认值。不过,在某些情况下,您需要覆盖其中的一些默认值。这就是您在配置中使用 Defaults 语句的时候。通常,这些默认值会强制应用于每个用户,但您可以根据主机、用户名等将设置缩小到用户子集。这是一个我的那一代系统管理员喜欢听到的例子:侮辱。这些只是一些有趣的讯息,当有人输入错误的密码时显示。

czanik@linux-mewy:~> sudo ls
[sudo] password for root:
Hold it up to the light --- not a brain in sight!
[sudo] password for root:
My pet ferret can type better than you!
[sudo] password for root:
sudo: 3 incorrect password attempts
czanik@linux-mewy:~>

因为不是每个人都喜欢系统管理员的幽默,所以默认情况下会禁用这些侮辱信息。以下示例展示了如何仅为经验丰富的系统管理员(wheel 组的成员)启用此设置。

Defaults !insults
Defaults:%wheel insults

我数不清有多少人感谢我带回了这些消息。

摘要验证

当然,sudo 中也有更多严肃的功能。其中之一是摘要验证。您可以在配置中包含应用程序的摘要:

peter ALL = sha244:11925141bb22866afdf257ce7790bd6275feda80b3b241c108b79c88 /usr/bin/passwd

在这种情况下,sudo 在运行应用程序之前,会检查并将应用程序的摘要与配置中存储的摘要进行比较。如果它们不匹配,sudo 会拒绝运行该应用程序。虽然在配置中维护此信息很困难(没有用于此目的的自动化工具),但这些摘要可以为您提供额外的保护层。

会话录制

会话录制也是 sudo 中一个鲜为人知的功能。在我的演示之后,很多人都计划在他们的基础设施上实现它。为什么?因为通过会话录制,您不仅可以看到命令名称,还可以看到终端中发生的所有事情。即使您的管理员拥有 shell 访问权限,并且日志只显示启动了 bash,您也可以看到他们在做什么。

目前有一个限制。记录存储在本地,因此拥有足够权限的用户可以删除他们的踪迹。请继续关注即将推出的功能。

插件

从 1.8 版本开始,sudo 更改为模块化的、基于插件的架构。由于大多数功能都作为插件实现,因此您可以通过编写自己的插件轻松地替换或扩展 sudo 的功能。目前已经有开源和商业插件可用于 sudo

在我的演讲中,我演示了 sudo_pair 插件,该插件可在 GitHub 上找到。此插件是用 Rust 开发的,这意味着它不容易编译,而且更难分发结果。另一方面,该插件提供了有趣的功能,需要第二个管理员批准(或拒绝)通过 sudo 运行命令。不仅如此,还可以通过屏幕跟踪会话,如果出现可疑活动,则可以终止会话。

在最近 All Things Open 会议期间我做的一个演示中,我在屏幕上显示了臭名昭著的

czanik@linux-mewy:~> sudo  rm -fr /

命令。每个人都屏住呼吸,看看我的笔记本电脑是否会被摧毁,但它幸存下来了。

日志

正如我一开始提到的,日志记录和警报是 sudo 的重要组成部分。如果您不定期检查您的 sudo 日志,那么使用 sudo 就没有什么价值。此工具通过电子邮件发送配置中指定的事件警报,并将所有事件记录到 syslog。可以启用调试日志并用于调试规则或报告错误。

警报

电子邮件警报现在有点过时了,但是如果您使用 syslog-ng 来收集您的日志消息,您的 sudo 日志消息会被自动解析。您可以轻松创建自定义警报,并将这些警报发送到各种目的地,包括 Slack、Telegram、Splunk 或 Elasticsearch。您可以从 我在 syslog-ng.com 上的博客 中了解有关此功能的更多信息。

配置

我们讨论了很多关于 sudo 功能的内容,甚至看到了一些配置行。现在,让我们仔细看看如何配置 sudo。配置本身可以在 /etc/sudoers 中找到,这是一个简单的文本文件。但是,不建议直接编辑此文件。而是使用 visudo,因为此工具还会进行语法检查。如果您不喜欢 vi,您可以通过将 EDITOR 环境变量指向您喜欢的选项来更改要使用的编辑器。

在开始编辑 sudo 配置之前,请确保您知道 root 密码。(是的,即使在默认情况下 root 没有密码的 Ubuntu 上也是如此。)虽然 visudo 检查语法,但很容易创建一个语法正确的配置,将您锁定在您的系统之外。

如果您手头有 root 密码以备紧急情况,您可以开始编辑您的配置。当涉及到 sudoers 文件时,有一件事需要记住:此文件从上到下读取,并且最后一个设置获胜。这对你来说意味着你应该从通用设置开始,并将异常放在最后,否则异常会被通用设置覆盖。

您可以在下面找到一个简单的 sudoers 文件,该文件基于 CentOS 中的文件,并添加了我们之前讨论过的几行。

Defaults !visiblepw
Defaults always_set_home
Defaults match_group_by_gid
Defaults always_query_group_plugin
Defaults env_reset
Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS"
Defaults env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
root ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
Defaults:%wheel insults
Defaults !insults
Defaults log_output

此文件首先更改一些默认值。然后是通常的默认规则:root 用户和 wheel 组的成员对机器拥有完全权限。接下来,我们为 wheel 组启用侮辱信息,但为其他所有人禁用。最后一行启用会话录制。

以上配置在语法上是正确的,但你能发现其中的逻辑错误吗?是的,这里有一个:侮辱信息对于每个人都是禁用的,因为最后一个通用设置会覆盖之前的更具体的设置。一旦您切换这两行,设置就会按预期工作:wheel 组的成员会收到有趣的讯息,但其余用户不会收到。

配置管理

一旦您需要在多台机器上维护 sudoers 文件,您很可能希望集中管理您的配置。这里有两种主要的开源可能性。两者都有其优点和缺点。

您可以使用您也用来配置其余基础设施的配置管理应用程序之一。Red Hat Ansible、Puppet 和 Chef 都有用于配置 sudo 的模块。这种方法的问题在于,更新配置远非实时。此外,用户仍然可以在本地编辑 sudoers 文件并更改设置。

sudo 工具也可以将其配置存储在 LDAP 中。在这种情况下,配置更改是实时的,并且用户无法修改 sudoers 文件。另一方面,此方法也有局限性。例如,当 LDAP 服务器不可用时,您无法使用别名或使用 sudo

新功能

新版本的 sudo 即将推出。1.9 版本将包含许多有趣的新功能。以下是最重要的计划功能:

  • 一个用于集中收集会话记录的记录服务,与本地存储相比,它提供了许多优势。
    • 在一个地方搜索更方便。
    • 即使发送者机器宕机,录音仍然可用。
    • 录音无法被想要删除其踪迹的人删除。
  • audit 插件不会向 sudoers 添加新功能,而是为插件提供一个 API,以便轻松访问任何类型的 sudo 日志。 此插件支持使用插件从 sudo 事件创建自定义日志。
  • approval 插件无需使用第三方插件即可启用会话审批。
  • 我个人最喜欢的是:插件的 Python 支持,使您能够轻松地使用 Python 代码扩展 sudo,而无需使用 C 语言进行本机编码。

结论

我希望这篇文章向您证明了 sudo 不仅仅是一个简单的前缀。 可以对系统上的权限进行微调,可能性很多。 您不仅可以微调权限,还可以通过检查摘要来提高安全性。 会话录音使您可以检查系统上发生的事情。 您还可以使用插件扩展 sudo 的功能,无论是使用现有的插件还是编写自己的插件。 最后,鉴于即将推出的功能列表,您可以看到,即使 sudo 已经存在了几十年,它仍然是一个不断发展的活跃项目。

如果您想了解有关 sudo 的更多信息,请参考以下资源

接下来要阅读的内容

你离不开的 Bash 别名

厌倦了一遍又一遍地输入相同的长命令? 您是否觉得在命令行上工作效率低下? Bash 别名可以带来很大的不同。

Peter Czanik
Peter 是一位工程师,在 Balabit(One Identity 业务)担任开源推广员,该公司开发了 syslog-ng。 他协助发行版维护 syslog-ng 包,关注错误跟踪器,帮助用户并在会议(SCALE、All Things Open、FOSDEM、LOADays 等)上定期谈论 sudo 和 syslog-ng。

1 条评论

好文章,感谢分享!

不过,我有一个建议:您可以将片段放在 /etc/sudoers.d/ 中,而不是直接使用 visudo 或使用配置管理系统编辑 /etc/sudoers。

确保 /etc/sudoers.d/ 中的文件具有 0440 权限和 root:root 所有者,然后运行“visudo --check”以确保所有文件都具有正确的语法。

干杯!

Creative Commons License本作品已获得 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.