For the complete documentation index, see llms.txt. This page is also available as Markdown.

17.4 权限提升工具

sudo 和 doas 通过配置文件定义权限规则,使特定用户无需 root 密码即可执行特权操作,并提供操作日志。

思考题

即使是管理员,在无需特权操作时也应当限制自己的权限。

你认为这种权限限制设计的缺点是什么?

权限示意图

权限提升工具配置文件结构

以下是本节介绍的权限提升工具配置文件路径总结:

doas

doas 是从 OpenBSD 移植的命令行工具,可作为类 Unix 系统中 sudo 的替代方案。

doas 的作者是 Ted Unangst,首次随 OpenBSD 5.8 引入。用户可通过 doas 以提升的权限执行命令(通常以 root 身份)。与 sudo 不同,doas 强调配置简洁与安全性,专注于精简的权限委派,避免庞杂的配置选项。

使用时可将 sudo 直接替换为 doas,二者在基本使用场景下功能等价。doas 支持以下选项:

选项
说明

nopass

免密码执行

keepenv / setenv

环境变量控制(继承或设置)

args

命令参数限制

nolog

不记录日志

persist

密码缓存(仅 Port security/opendoas 支持)

doas 不具备 sudo 的插件架构和 LDAP 集成等高级特性。

安装 doas

  • 使用 pkg 安装:

  • 或者使用 Ports 安装:

使用 doas 管理共享权限

用户 user2 只需创建文件 /usr/local/etc/doas.conf 并写入:

即可允许用户 user2 在执行 doas 时无需输入密码即可获取 root 权限。如果不需要 doas 免密码,移除 nopass 即可。

警告

nopass 选项虽然便捷,但存在安全风险:如果该用户账户被攻破,攻击者无需任何额外凭证即可获得 root 权限。建议仅在受信任的单用户桌面环境使用 nopass,多用户或服务器环境应要求密码认证。

对于 wheel 组用户,则写入以下行即可:

安装并配置好 doas 之后,即可执行特权命令:

doas 示例配置文件

示例配置文件位于 /usr/local/etc/doas.conf.sample

简要注释如下:

sudo

sudo 的初始作者是 Bob Coggeshall 和 Cliff Spencer(原始版本,约 1980 年),面向 4.1BSD。sudo 的主要重写和维护者是 Todd C. Miller。

sudo 的 sudoers 配置语法复杂度较高,手册页逾 1000 行,容易配置错误导致安全漏洞;时间戳文件位于 /var/run/sudo/ts/,若文件系统已满可能无法正常工作;sudo -i 在某些 shell 环境下可能不会完整加载环境变量。

sudo 允许管理员配置更严格的系统命令访问,并提供日志记录功能。

安装 sudo

  • 使用 pkg 安装:

  • 或者使用 Ports 安装:

使用 sudo 进行共享管理

sudo 配置文件由若干小节组成,支持深度自定义。

配置普通用户使用 sudo

未配置的普通用户执行 sudo 将提示错误 xxx Is Not in the Sudoers File. This Incident Will Be Reported

需要在 sudoers 配置文件中加入一行以解决该问题。编辑 /usr/local/etc/sudoers 文件,找到 root ALL=(ALL:ALL) ALL 这一行,在其下方添加一行:

随后保存并退出。用户“实际普通用户”将能够使用 sudo,提示输入密码时输入该用户密码即可,无需 root 用户密码。

授予特定用户执行特定命令的权限

在下面的示例中,Web 应用运维人员 user1 需要启动、停止和重启 Web 应用程序 webservice。要授予该用户相关权限,请在 /usr/local/etc/sudoers 文件末尾新增一行:

随后用户 user1 即可通过以下命令启动 webservice

上述配置仅对单个用户(user1)授权了 webservice 服务,但大多数组织会有 Web 团队负责相关管理。仅需一行配置,即可将权限赋予整个组。以下步骤将先创建 web 组,再向其中添加用户,最终使组内所有成员都具备管理该服务的能力:

再使用 pw 命令将所需用户 user1 添加至 webteam 组:

最后,在 /usr/local/etc/sudoers 文件中写入以下行,即可让 webteam 组的所有成员都有权限管理 webservice

sudo 普通用户和组免密码

授权使用 sudo 的用户只需输入自身密码即可完成认证。相比 su,sudo 的优点在于:su 需要输入 root 密码并授予完整的 root 权限,而 sudo 可按用户或组进行细粒度权限控制。要允许 webteam 组成员免密码管理该服务,可改为:

类似地,如果希望用户 user1 免密码,则改为:

如果希望 wheel 组中的用户也免密码,则如下:

百分号 % 表示组,不加 % 表示普通用户。

参考文献

sudo-rs

sudo-rs 是 Rust 编写的 sudo 与 su 实现,以安全为导向,具备内存安全性。

与 sudo 不共存的安装方案

安装 sudo-rs 前必须先卸载 sudo,该方式下两者不能共存。

  • 使用 pkg 安装:

  • 或者使用 Ports 安装:

提供了 sudovisudosudoedit 命令。

visudo 以安全方式编辑 sudoers 文件,类似于 vipw(8)。它锁定 sudoers 文件防止同时编辑,执行基本有效性检查,并在安装前检查语法错误。若发现语法错误,会显示行号并提示“What now?”,用户可选择 e(重新编辑)、x(退出不保存)或 Q(强制保存,有风险)。编辑器选择由 SUDO_EDITORVISUALEDITOR 环境变量决定,默认为 /usr/bin/vi

FreeBSD 的 visudo 来自 sudo 软件包(非基本系统),与 Linux 版本来自同一上游源代码,基本兼容。

与 sudo 共存的安装方案

系统中同时存在 sudo 与 sudo-rs。

  • 使用 pkg 安装:

  • 还可以通过 Ports 来安装:

提供了 sudo-rsvisudo-rssudoedit-rs 命令。

sudo-rs 示例配置文件

配置文件位于:/usr/local/etc/sudoers

测试

附录:通过 mac_do 权限提升

参考文献:

课后习题

  1. 查阅 FreeBSD 中 mac_do 模块的源代码,分析其通过 Mandatory Access Control 实现权限提升的机制,梳理其与 sudo/doas 在权限模型上的本质差异。

  2. 查阅 FreeBSD Ports 中 doas 工具的源代码实现,分析其配置解析、规则匹配和环境变量处理的设计,评估其在简单性与安全性之间的权衡策略。

  3. 修改 doas 配置中的 keepenv 选项,记录其对环境变量继承行为的影响,分析不同环境变量(如 PATHHOME)在权限提升场景下的安全风险。

最后更新于