当您想在 POSIX 系统上执行操作时,最安全的方法之一是使用 sudo 命令。与以 root 用户身份登录并执行可能危险的操作不同,sudo 允许系统管理员指定为“sudoer” 的任何用户临时获得执行通常受限活动的权限。
几十年来,该系统帮助保护 Linux、Unix 和 macOS 系统免受愚蠢的错误和恶意攻击,并且它是当今所有主要 Linux 发行版上的默认管理机制。
sudo 1.9 于 2020 年 5 月发布,带来了许多新功能,包括中央会话记录收集、sudo 内 chroot 支持和 Python API。如果您对其中任何一项感到惊讶,请阅读我关于 sudo 鲜为人知的功能 的文章。
Sudo 不仅仅是管理命令的前缀。您可以微调权限、记录终端上发生的事情、使用插件扩展 sudo、在 LDAP 中存储配置、进行广泛的日志记录等等。
1.9.0 版和后续次要版本添加了各种新功能(我将在下面描述),包括
- 用于集中收集 sudo 会话记录的记录服务
- 审计插件 API
- 批准插件 API
- Python 插件支持
- 内置于 sudo 中的 Chroot 和 CWD 支持(从 1.9.3 开始)
在哪里获取 sudo 1.9
大多数 Linux 发行版仍然打包了上一代 sudo(1.8 版),并且在长期支持 (LTS) 版本中将保持这种状态数年。我所知的 Linux 发行版中最完整的 sudo 1.9 包是 openSUSE Tumbleweed,它是一个滚动发行版,并且 sudo 包在子包中提供了 Python 支持。最新的 Fedora 版本包含 sudo 1.9,但没有 Python。FreeBSD Ports 提供了最新的 sudo 版本,如果您自己构建 sudo 而不是使用软件包,则可以启用 Python 支持。
如果您的首选 Linux 发行版尚未包含 sudo 1.9,请查看 sudo 二进制文件页面,看看是否有可用于您的系统的即用型软件包。此页面还提供适用于多种商业 Unix 变体的软件包。
像往常一样,在开始试验 sudo 设置之前,请确保您知道 root 密码。是的,即使在 Ubuntu 上也是如此。拥有临时的“后门”非常重要;否则,如果出现问题,您将不得不入侵自己的系统。请记住:语法正确的配置并不意味着任何人都可以通过该系统上的 sudo 执行任何操作!
记录服务
记录服务集中收集会话记录。与本地会话日志存储相比,这提供了许多优势
- 在一个地方搜索比访问各个机器进行录制更方便
- 即使发送机器关闭,录音也可用
- 录音不能被想要掩盖其踪迹的本地用户删除
为了快速测试,您可以通过非加密连接将会话发送到记录服务。我的博客包含在几分钟内设置它的 说明。对于生产设置,我建议使用加密。有很多可能性,因此请阅读最适合您环境的 文档。
审计插件 API
新的审计插件 API 不是用户可见的功能。换句话说,您无法从 sudoers 文件配置它。它是一个 API,这意味着您可以从插件(包括用 Python 编写的插件)访问审计信息。您可以将其用于多种不同的方式,例如在发生有趣的事情时将来自 sudo 的事件直接发送到 Elasticsearch 或日志即服务 (LaaS)。您还可以将其用于调试,并将其他难以访问的信息以您喜欢的任何格式打印到屏幕上。
根据您想要使用它的方式,您可以在 sudo 插件手册页(对于 C)和 sudo Python 插件手册中找到其文档。示例 Python 代码 在 sudo 源代码中可用,并且我的博客上还有一个 简化的示例。
批准插件 API
批准插件 API 使得在命令执行之前包含额外的限制成为可能。这些限制仅在策略插件成功后运行,因此您可以有效地添加额外的策略层,而无需替换策略插件和 sudoers。可以定义多个批准插件,并且所有插件都必须成功才能执行命令。
与审计插件 API 一样,您可以从 C 和 Python 中使用它。我的博客上记录的 示例 Python 代码 是对 API 的良好介绍。一旦您了解了它的工作原理,您就可以扩展它以将 sudo 连接到票务系统,并且仅在有相关的未结票证的情况下才批准会话。您还可以连接到 HR 数据库,以便只有值班工程师才能获得管理权限。
Python 插件支持
即使我不是程序员,我最喜欢的新 sudo 1.9 功能也是 Python 插件支持。您也可以将大多数可从 C 获得的 API 与 Python 一起使用。幸运的是,sudo 对性能不敏感,因此运行 Python 代码的相对较慢的速度对于 sudo 来说不是问题。使用 Python 扩展 sudo 有许多优点
- 更简单、更快速的开发
- 无需编译;代码甚至可以通过配置管理来分发
- 许多 API 没有即用型 C 客户端,但 Python 代码可用
除了审计和批准插件 API 之外,还有一些其他可用的 API,您可以使用它们做非常有趣的事情。
通过使用策略插件 API,您可以替换 sudo 策略引擎。请注意,您将丢失大多数 sudo 功能,并且不再有基于 sudoers 的配置。这在某些特定情况下仍然有用,但在大多数情况下,最好继续使用 sudoers 并使用批准插件 API 创建额外的策略。如果您想尝试一下,我的 Python 插件介绍 提供了一个非常简单的策略:仅允许 id
命令。再次强调,请确保您知道 root 密码,因为一旦启用此策略,它将阻止 sudo 的任何实际使用。
使用 I/O 日志 API,您可以访问用户会话的输入和输出。这意味着您可以分析会话中发生的事情,甚至在发现可疑情况时终止会话。此 API 有许多可能的用途,例如数据泄漏预防。您可以监视屏幕上的关键字,如果任何关键字出现在数据流中,您可以在关键字出现在用户屏幕上之前断开连接。另一种可能性是检查用户正在键入的内容,并使用该数据来重建用户正在输入的命令行。例如,如果用户输入 rm -fr /
,您甚至可以在按下 Enter 键之前断开用户连接。
组插件 API 允许非 Unix 组查找。在某种程度上,这类似于批准插件 API,因为它也扩展了策略插件。您可以检查用户是否是给定组的成员,并根据配置的后续部分中的内容采取行动。
Chroot 和 CWD 支持
sudo 的最新新增功能是 chroot 和更改工作目录 (CWD) 支持。默认情况下,这两个选项均未启用——您需要在 sudoers 文件中显式启用它们。启用后,您可以微调目标目录或允许用户指定要使用的目录。日志会反映何时使用了这些设置。
在大多数系统中,chroot 仅对 root 用户可用。如果您的某个用户需要 chroot,您需要授予他们 root 访问权限,这会给他们比 chroot 更多的权力。或者,您可以通过 sudo 允许访问 chroot 命令,但这仍然允许他们获得完全访问权限的漏洞。当您使用 sudo 的内置 chroot 支持时,您可以轻松限制对单个目录的访问。您还可以让用户灵活地指定根目录。当然,这可能会导致灾难(例如,sudo --chroot / -s
),但至少该事件会被记录在日志中。
当您通过 sudo 运行命令时,它会将工作目录设置为当前目录。这是预期的行为,但在某些情况下,命令需要在不同的目录中运行。例如,我记得使用过一个应用程序,该应用程序通过检查我的工作目录是否为 /root
来检查我的权限。
尝试新功能
我希望本文能启发您更仔细地了解 sudo 1.9。中央会话记录比在本地存储会话日志更方便和安全。Chroot 和 CWD 支持为您提供额外的安全性和灵活性。使用 Python 扩展 sudo 可以轻松地根据您的环境定制 sudo。您可以通过使用最新的 Linux 发行版之一或 sudo 网站上的即用型软件包来尝试新功能。
如果您想了解有关 sudo 的更多信息,这里有一些资源
1 条评论