关于 sudo 你可能不知道的

以为你已经了解了 sudo 的全部知识了吗?再想一想。linux

你们都知道 sudo,对吗?默认状况下,该工具已安装在大多数 Linux 系统上,而且可用于大多数 BSD 和商业 Unix 变体。不过,在与数百名 sudo 用户交谈以后,我获得的最多见的答案是 sudo 是一个使生活复杂化的工具。git

有 root 用户和 su 命令,那么为何还要使用另外一个工具呢?对于许多人来讲,sudo 只是管理命令的前缀。只有极少数人提到,当你在同一个系统上有多个管理员时,可使用 sudo 日志查看谁作了什么。github

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

“sudo 容许系统管理员经过授予某些用户以 root 用户或其余用户身份运行某些命令的能力,同时提供命令及其参数的审核记录,从而委派权限。”安全

默认状况下,sudo 只有简单的配置,一条规则容许一个用户或一组用户执行几乎全部操做(在本文后面的配置文件中有更多信息):bash

%wheel ALL=(ALL) ALL
复制代码

在此示例中,参数表示如下含义:服务器

  • 第一个参数(%wheel)定义组的成员。
  • 第二个参数(ALL)定义组成员能够在其上运行命令的主机。
  • 第三个参数((ALL))定义了能够执行命令的用户名。
  • 最后一个参数(ALL)定义能够运行的应用程序。

所以,在此示例中,wheel 组的成员能够以全部主机上的全部用户身份运行全部应用程序。但即便是这个一切容许的规则也颇有用,由于它会记录谁在计算机上作了什么。app

别名

固然,它不只可让你和你最好的朋友管理一个共享机器,你还能够微调权限。你能够将以上配置中的项目替换为列表:用户列表、命令列表等。多数状况下,你可能会复制并粘贴配置中的一些列表。编辑器

在这种状况下,别名能够派上用场。在多个位置维护相同的列表容易出错。你能够定义一次别名,而后能够屡次使用。所以,当你对一位管理员再也不信任时,将其从别名中删除就好了。使用多个列表而不是别名,很容易忘记从具备较高特权的列表之一中删除用户。模块化

为特定组的用户启用功能

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。你能够从我在 syslong-ng.com 上的博客中了解有关此功能的更多信息。

配置

咱们谈论了不少 sudo 功能,甚至还看到了几行配置。如今,让咱们仔细看看 sudo 的配置方式。配置自己能够在 /etc/sudoers 中得到,这是一个简单的文本文件。不过,不建议直接编辑此文件。相反,请使用 visudo,由于此工具还会执行语法检查。若是你不喜欢 vi,则能够经过将 EDITOR 环境变量指向你的首选编辑器来更改要使用的编辑器。

在开始编辑 sudo 配置以前,请确保你知道 root 密码。(是的,即便在默认状况下 root 用户没有密码的 Ubuntu 上也是如此。)虽然 visudo 会检查语法,但建立语法正确而将你锁定在系统以外的配置也很容易。

若是在紧急状况下,而你手头有 root 密码,你也能够直接编辑配置。当涉及到 sudoers 文件时,有一件重要的事情要记住:从上到下读取该文件,以最后的设置为准。这个事实对你来讲意味着你应该从通用设置开始,并在末尾放置例外状况,不然,通用设置会覆盖例外状况。

你能够在下面看到一个基于 CentOS 的简单 sudoers 文件,并添加咱们以前讨论的几行:

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 的更多信息,请参考如下资源:


via: opensource.com/article/19/…

做者:Peter Czanik 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出