DeltaForksLabs/odus
GitHub: DeltaForksLabs/odus
一款用 Rust 编写的轻量级提权工具,通过 TOML 规则和 PAM 认证在 FreeBSD/Linux 上替代 sudo/doas 执行特权命令。
Stars: 1 | Forks: 0
# odus
适用于 FreeBSD 和 Linux 的最小化提权工具 —— `sudo` 和 `doas` 的轻量级替代方案。这是一个 setuid-root 的二进制程序,可根据 `/etc/odus.toml` 中定义的规则以 root 身份运行命令。
## 功能
- **PAM 身份验证** —— 原生集成 Linux-PAM 和 OpenPAM
- **凭证缓存** —— 基于 TTY 会话或基于时间(1-60 分钟)
- **灵活的规则** —— 支持按用户、用户组、精确命令或通配符前缀(`/usr/bin/python*`)进行匹配
- **免密模式** —— 针对特定命令跳过身份验证(`nopasswd = true`)
- **Syslog 审计** —— 所有安全事件均记录到 `LOG_AUTHPRIV`(Linux)/ `LOG_AUTH`(FreeBSD)
- **PATH 净化** —— 在执行 `execve` 前使用 `secure_path` 替换用户的 `PATH`
- **防 TOCTOU** —— 所有文件操作均使用 `O_NOFOLLOW` + 对 fd 进行 fstat
- **内存擦除** —— 密码缓冲区在 PAM 使用后立即清零
- **速率限制** —— 身份验证尝试之间有 2 秒的冷却时间
## 安装说明
### 前置条件
- FreeBSD(OpenPAM)或 Linux(glibc)
- 带有开发头文件的 PAM 库
- Rust 稳定版工具链([rustup](https://rustup.rs))
### 构建与安装
```
make # build target/release/odus
sudo make install # install to /usr/local/bin/odus, setuid-root
```
`make install` 会自动创建 `/etc/odus.toml` 和 `/etc/pam.d/odus`,并提供合理的默认配置。
### 卸载
```
sudo make uninstall
```
## 配置(`/etc/odus.toml`)
首次运行时自动创建。必须为 `root:root` 所有,权限为 `0600` 的常规文件(拒绝符号链接)。
### 示例
```
cache_timeout = 15
max_tries = 3
secure_path = [
"/usr/bin", "/bin", "/usr/sbin",
"/sbin", "/usr/local/bin", "/usr/local/sbin"
]
# 'wheel' 组的成员可以运行任何内容
[[rules]]
group = "wheel"
cmd = "ALL"
# 用户 'deploy' 可以在无密码的情况下重启服务
[[rules]]
user = "deploy"
cmd = "systemctl"
nopasswd = true
```
### 规则字段
| 字段 | 必填 | 描述 |
|------------|----------|------------------------------------------------------------------|
| `cmd` | **是** | 命令。`"ALL"`、精确名称、绝对路径或 `*` 通配符。 |
| `user` | 否 | 用户名(精确匹配)。省略则匹配任何用户。 |
| `group` | 否 | 组名(精确匹配)。省略则匹配任何用户组。 |
| `nopasswd` | 否 | 设为 `true` 以跳过密码提示。默认值:`false`。 |
规则自上而下进行评估 —— 首次匹配生效。
### 全局设置
| 键 | 类型 | 默认值 | 描述 |
|-----------------|---------------|---------|-------------------------------------------------------------------|
| `cache_timeout` | int | `15` | `-1` = 基于会话,`0` = 每次提示,`1-60` = 分钟(限制在此范围内)。 |
| `max_tries` | int | `3` | 退出前的密码尝试次数(限制在 1-10 之间)。 |
| `secure_path` | array/string | 6 个目录 | 用于解析裸命令名的受信任目录。 |
## 使用方法
```
odus [args...]
```
```
odus pkg update
odus systemctl restart nginx
odus --help
```
- `..` 和 `.` 路径段会被拒绝。
- 裸命令名(`sh`、`ls`)将通过 `secure_path` 目录进行解析。
- 在使用 `make install` 安装时,会自动为 bash、zsh 和 fish 安装 Tab 自动补全功能。
## 贡献与反馈
欢迎提供反馈、问题报告、实验性尝试和有针对性的拉取请求。
优秀的贡献应当:
- 控制更改的范围并解释其技术影响。
- 保留现有的演示和测试。
- 在行为发生改变时添加或更新测试。
- 避免不相关的格式化或重构。
- 在相关时提及其特定平台的渲染行为。
该项目目前仍在快速迭代中,因此在实现较大的 API 更改之前应先进行讨论。
## 许可证
Odus 根据以下任一许可证授权:
- MIT 许可证,详见 `LICENSE_MIT`。
- Apache 许可证 2.0,详见 `LICENSE_APACHE_2.0`。
在使用、修改或分发本项目时,您可以选择任一许可证。
## 致谢
由 [Paulo Daniel](https://github.com/TrexPD) 和 [DeltaForks Labs](https://github.com/DeltaForksLabs) 构建。
标签:Awesome, FreeBSD, PAM认证, Python安全, Rust, setuid, Streamlit, sudo替代方案, syslog, TOCTOU防护, TOML配置, 二进制发布, 免密执行, 凭证缓存, 协议分析, 可视化界面, 子域名枚举, 开源工具, 最小权限, 权限提升, 特权管理, 系统安全, 系统管理, 网络流量审计, 访问控制, 通知系统