news 2026/10/17 6:36:56

sudo-rs sudoers 配置实践指南:从写规则到安全护栏

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
sudo-rs sudoers 配置实践指南:从写规则到安全护栏

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 前,先证明自己是谁。有三类例外直接放行:

  1. 调用者本身就是 root;
  2. 目标用户和调用者是同一个人;
  3. 策略里对该用户或该命令显式关了认证(如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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/17 6:35:49

Claude Code模板实战:用CLAUDE.md与斜杠命令打造高效AI编程助手

在终端里折腾 Claude Code 的这大半年,我慢慢意识到一个事儿:真正决定 AI 编程助手是“玩具”还是“同事”的,往往不是模型本身,而是你怎么给它交代工作。Claude Code 提供了一套非常灵活的环境控制机制,比如项目级的 …

作者头像 李华
网站建设 2026/10/17 6:35:06

微信小程序web-view H5分享功能实现与避坑指南

简介:针对微信小程序web-view页面分享后链接参数丢失、接收者打开看不到分享页、分享卡片缺标题简介的常见痛点,这份源码提供了完整的轻量解决方案。开发者只需将包内JS引入H5页面,并替换为已配置的合法域名,即可实现分享参数从H5…

作者头像 李华
网站建设 2026/10/17 6:31:35

AG-UI协议与Canvas渲染引擎在工业SCADA中的性能优化实践

工业现场的前端界面,长期以来都是"能用就行"的重灾区。组态软件画出来的画面,分辨率锁死、交互僵硬、换个屏幕就得重做;而传统 Web 技术栈虽然灵活,却在高频数据刷新和复杂图形渲染上频频掉链子。最近半年我一直在做一个…

作者头像 李华
网站建设 2026/10/17 6:31:35

贝叶斯优化快 60 倍,却让我错过了 14% 的收益

原创不易,转载请标明出处及原作者。 文中示例仅用于技术讨论,不构成任何操作建议。 量化策略开发应以学习和技术交流为目的。 本号不荐股、不卖课、不承诺收益。 市场有风险,请合法合规投资。 本文约 3800 字 | 预计阅读 8-12 分钟,建议先收藏。 几周前读到一篇文章,一…

作者头像 李华