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.20230620 | 2023年6月20日 |
#31 在 Unix API
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-rs 或 sudo-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-rs
和 sudo-rs
提供功能。如果您想通过常用的命令 sudo
和 su
来调用 sudo-rs,请将 /usr/lib/cargo/bin
预先添加到您当前的 $PATH
变量中。
Fedora
如果您正在运行 Fedora 38 或更高版本,您可以使用
sudo dnf install sudo-rs
这将使用命令 su-rs
和 sudo-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
这将使用常用的命令 sudo
和 su
在 /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_badpass
、always_set_home
、always_query_group_plugin
和match_group_by_gid
对于我们的实现不适用,但出于兼容性原因被忽略。
需要注意的其他一些限制
- 一些功能尚不支持;特别是
sudoedit
和使用NOEXEC
和NOINTERCEPT
防止 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 fsck
和sudo 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 基金会。