sudo-rs sudoers 配置实践指南:从写规则到安全护栏
【免费下载链接】sudo-rsA memory safe implementation of sudo and su.项目地址: https://gitcode.com/GitHub_Trending/su/sudo-rs
你给运维同事开 sudo 权限时,是只开一条命令,还是整台机器随便跑?这份清单就藏在/etc/sudoers里。sudo-rs 用 Rust 重写了 sudo 的策略引擎,这份配置文件决定了"谁能以谁的身份跑什么命令",读不懂它,授权就是盲开。本文按"先写规则、再谈认证、最后看护栏"的顺序,把它一次讲透。
sudoers 到底管什么:文件位置与四元模型
先说结论:sudo-rs 的所有授权判断都来自一个文件——/etc/sudoers,官方说明见 sudoers.5 手册。它的语法与原版 sudo 兼容,但只实现了其中安全的子集。
怎么理解这个文件?把它想象成一张门禁清单,每条记录回答四个问题:
- 谁(User):哪个用户或用户组
- 在哪(Host):哪台主机上生效
- 以谁身份(Runas):执行时变成哪个用户或组
- 做什么(Cmnd):允许运行哪些命令
写规则时脑子里始终装着这四个槽位,后面所有语法都是在往槽位里填东西。
sudoers 语法速查:从头写出一条完整规则
别名体系:先给"槽位内容"起短名
四种别名对应四个槽位:User_Alias、Host_Alias、Runas_Alias、Cmnd_Alias。格式统一为:
Cmnd_Alias LOG_CMD = /usr/bin/journalctl, /var/log/命名规则很死板:NAME只能由大写字母、数字、下划线组成,且必须以大写字母开头,所以web_admins是非法的,要写成WEB_ADMINS。同类型的多个别名可以用冒号写在同一行。
用户规范与 Runas_Spec 的四种情况
主规则格式是用户 主机 = (身份) 命令。括号里的 Runas_Spec 有四种含义,容易踩坑:
| 写法 | 效果 |
|---|---|
(alice) | 以列表中的用户身份运行 |
(%dev) | 仍是调用用户,但组可切到 dev |
() | 只能以调用用户自己身份运行 |
| 不写括号 | 默认只能以 root 身份运行 |
再叠加 Chdir_Spec 限定工作目录:
alice server = CWD=/var/www /usr/bin/systemctl目录必须是绝对路径或以~开头;写CWD=*表示放权给用户,由sudo -D自己指定;不写则默认继承调用用户当时的当前目录。
Defaults:给规则加"全局调参"
Defaults 可以精确圈定作用域,前缀即范围:@主机列表、:用户列表、!命令列表、>运行身份列表,不加前缀则是全局。列表类参数支持+=追加和-=删除:
Defaults :web_team env_keep += "EDITOR", log_allowed_user_timeout = 15身份认证是如何执行的:默认要密码,15 分钟免输
默认规则很简单:用 sudo 前,先证明自己是谁。有三类例外直接放行:
- 调用者本身就是 root;
- 目标用户和调用者是同一个人;
- 策略里对该用户或该命令显式关了认证(如
NOPASSWD标签)。
和su的关键区别在于验的是谁的密码:su 问的是目标用户(通常是 root)的密码,而 sudo-rs 验的是调用者本人的凭证——毕竟 sudo 的语义是"我授权你替我干活"。想改回旧习惯,可以打开rootpw标志。
认证通过后不会每次都问密码,靠的是 per-user 的 timestamp 凭证缓存文件。每条记录包含四个字段:用于认证的用户 ID、终端会话 ID、会话主进程(或父进程)的启动时间、时间戳。默认15 分钟内(timestamp_timeout可调)免密复用。注意记录是按终端隔离的:两个终端窗口各自认证、各自计时,不会互相串号。
执行环境如何被隔离:env_reset 关不掉的"白名单"
结论先行:env_reset在 sudo-rs 里强制启用,无法关闭。命令永远在全新、最小化的环境里启动,用户带来的环境变量默认全部不继承。
变量处理分四步:
HOME、SHELL、LOGNAME、USER按目标用户重新初始化,SUDO_*系列则记录调用者信息;PATH、TERM若未被env_keep/env_check保留,会填默认值兜底;LOGNAME和USER被当作一个整体处理:保留(或删除)其一,另一个同步跟随,只存在一个时另一个自动补齐同值,避免出现"一半 root 一半你"的分裂环境;- 值以
()开头的变量直接删除——防止被 bash 误解析成 shell 函数。
PAM 模块贡献的变量会合并进环境,但优先级低于用户环境里被保留的变量。
日志与资源限制如何兜底
审计侧:sudo-rs 默认把成功、失败、错误三类事件全部写入 syslog,journalctl或/var/log里随时能查,谁在什么时候试了什么、结果如何,一目了然。
资源限制则按平台各走各的路:
- Linux:通常由
pam_limits.so模块按目标用户设置; - BSD 系:由
/etc/login.conf定义; - 系统没有任何 per-user 机制时:命令直接沿用调用用户的限制,不额外收紧。
安全配置落地清单:改 sudoers 前对照一遍
把日常操作压成一张可勾选清单,逐项过:
- 用
visudo编辑而非直接vi /etc/sudoers,改错会当场被拦下 - 授权遵循最小权限:能开
Cmnd_Alias就不开ALL - 重复出现的用户组、命令组用别名复用,规则行保持一行一义
- 定期翻 syslog 审计 sudo 尝试记录,尤其是连续失败
- 任何变更先落到测试环境跑一遍
sudo -l验证匹配结果 - 敏感命令在规则里写死参数(如
""表示禁止带参),防参数注入
写在最后
/etc/sudoers这套语法用了几十年,没人会因为它老而弃用;真正变化的是执行它的引擎。sudo-rs 的策略解析源码 用 Rust 的借用检查替代了 C 时代靠纪律维护的内存安全,同样的门禁清单跑在内存安全的实现上,攻击面小了一大截。理解了这份指南里的规则、认证、隔离、审计四层结构,你既会用原版 sudo,也接得住 sudo-rs 的默认行为差异。
【免费下载链接】sudo-rsA memory safe implementation of sudo and su.项目地址: https://gitcode.com/GitHub_Trending/su/sudo-rs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考