每个人都知道 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 的更多信息,请参考以下资源
1 条评论