9 个版本

0.2.3 2024年7月11日
0.2.2 2024年2月13日
0.2.1 2023年9月21日
0.2.0 2023年8月29日
0.1.0-dev.202306202023年6月20日

#31Unix API

Apache-2.0 OR MIT

600KB
14K SLoC

sudo-rs

sudo 和 su 的 Rust 编写的以安全性为导向和内存安全的实现。

本项目状态

Sudo-rs 正在进一步开发中;您可能期望从原始 sudo 中获得的功能可能尚未实现或未计划实现。如果您需要重要的一个,请使用问题跟踪器请求它。如果您遇到任何可用性错误,也请在该 问题跟踪器 上报告。可疑漏洞可以在我们的 安全页面 上报告。

2023年8月对 sudo-rs 版本 0.2.0 进行了 审计。当前版本中解决了那次审计发现的问题。

Sudo-rs 目前仅针对基于 Linux 的操作系统;运行 sudo-rs 需要 Linux 内核 5.9 或更高版本。

安装 sudo-rs

开始使用 sudo-rs 的推荐方法是使用您的 Linux 发行版的软件包管理器。

Arch Linux

可以通过 AUR sudo-rssudo-rs-git 安装 Arch Linux。

注意:AUR 使用帮助

yay -Syu sudo-rs

Debian/Ubuntu

如果您正在运行 Debian 13(trixie)或更高版本,或 Ubuntu 24.04(Noble Numbat)或更高版本,您可以使用

sudo apt-get install sudo-rs

这将使用命令 su-rssudo-rs 提供功能。如果您想通过常用的命令 sudosu 来调用 sudo-rs,请将 /usr/lib/cargo/bin 预先添加到您当前的 $PATH 变量中。

Fedora

如果您正在运行 Fedora 38 或更高版本,您可以使用

sudo dnf install sudo-rs

这将使用命令 su-rssudo-rs 提供功能。

安装我们预编译的 x86-64 二进制文件

您还可以通过使用我们的预编译的 tarball 来手动切换到 sudo-rs。我们目前只为 x86-64 系统提供这些。

我们建议您使用以下命令在 /usr/local 层次结构中安装 sudo-rs 和 su-s

sudo tar -C /usr/local -xvf sudo-VERSION.tar.gz

对于 su-rs

sudo tar -C /usr/local -xvf su-VERSION.tar.gz

这将使用常用的命令 sudosu/usr/local/bin 中安装 sudo-rs 和 su-rs。

从源代码构建

Sudo-rs是用 Rust 编写的。所需的最小 Rust 版本是 1.70。如果您的 Linux 发行版没有打包该版本(或更高版本),您始终可以通过 rustup 安装最新版本。您还需要 PAM 的 C 开发文件(在 Debian 上为 libpam0g-dev,在 Fedora 上为 pam-devel)。

在 Ubuntu 或基于 Debian 的系统上,使用以下命令安装 PAM 开发库

sudo apt-get install libpam0g-dev

在 Fedora、CentOS 和其他基于 Red Hat 的系统上,可以使用以下命令

sudo yum install pam-devel

安装依赖项后,构建 sudo-rs 是一件简单的事情

cargo build --release

这将生成一个二进制文件 target/release/sudo。然而,这个二进制文件必须设置 setuid 标志,并且必须由 root 用户拥有,才能提供任何有用的功能。请参阅您的操作系统手册以获取详细信息。

Sudo-rs 需要 sudoers 配置文件。如果存在该文件,sudoers 配置文件将加载自 /etc/sudoers-rs,否则将使用原始的 /etc/sudoers 位置。您必须确保在那个位置存在有效的 sudoers 配置。有关 sudoers 语法的说明,您可以查看 原始 sudo 手册页

与原始 sudo 的不同之处

sudo-rs 支持的功能比 sudo 少。其中一些是按设计进行的。在大多数情况下,如果您尝试执行不支持的操作(例如,使用未实现的配置标志或命令行选项),您将收到清晰的错误。

上述内容对您的 /etc/sudoers 配置的例外

  • use_pty 默认启用,但可以禁用。
  • env_reset 被忽略——这始终是启用的。
  • visiblepw 被忽略——这始终是禁用的。
  • verifypw 目前被忽略;对于 sudo -v,始终需要密码。
  • mail_badpassalways_set_homealways_query_group_pluginmatch_group_by_gid 对于我们的实现不适用,但出于兼容性原因被忽略。

需要注意的其他一些限制

  • 一些功能尚不支持;特别是 sudoedit 和使用 NOEXECNOINTERCEPT 防止 shell 转义。
  • 对于更细粒度的控制,尚不支持按用户、按命令、按主机的 Defaults sudoers 条目。
  • sudo-rs 目前始终使用 PAM 进行身份验证,您的系统必须配置为 PAM。sudo-rs 将使用 sudo 服务配置。这也意味着资源限制、umask 等等都必须通过 PAM 配置,而不是通过 sudoers 文件。
  • sudo-rs 不会包含原始 sudo 的 sendmail 支持。
  • sudoers 文件必须是有效的 UTF-8。
  • 为了防止在 sudoers 文件中常见的配置错误,命令的 参数位置 不支持通配符。例如,%sudoers ALL = /sbin/fsck* 将允许 sudo fscksudo fsck_exfat 如预期一样,但 %sudoers ALL = /bin/rm *.txt 将不允许操作员运行 sudo rm README.txt,也不能运行 sudo rm -rf /home .txt,就像原始 sudo 一样。

如果您发现原始 sudo 缺少一个常见用例,请在我们的问题跟踪器中为其创建一个功能请求。

项目目标

我们目前的目的是构建一个用于 sudo 所有常见用例的替代品。对于 sudoers 配置语法,这意味着我们支持常见 Linux 发行版的默认配置文件。我们的实现应该支持原始 sudo 实现中所有常用的命令行选项。

原始 sudo 的一些部分明确不在范围内。Sudo 拥有悠久而丰富的历史,原始 sudo 实现中的一些功能很少使用,或者仅适用于旧平台。为了确定哪些功能会包含在内,我们考虑了该功能是否与现代系统相关,以及它是否会至少得到合理的使用。最后,当然,功能不应损害整个程序的安全性。

我们的 su 实现是使用为我们的 sudo 实现创建的构建块制作的。它将是 util-linux 分发的 su 的合适替代品。

未来工作

虽然我们的初始目标是作为大多数基本 sudo 用例的替代品,但我们的工作可能超出这个目标。我们还在寻找其他方法来配置 sudo,而无需使用 sudoers 配置文件语法,并将我们工作的部分提取为其他人可用的可使用包。

赞助商

sudo-rs 的初始开发由 互联网安全研究小组 启动并资助,作为 Prossimo 项目 的一部分。

sudo-rs 的独立安全审计得以实现,得益于 NLNet 基金会

依赖关系