sudoers 不提供命令摘要校验机制,仅基于绝对路径进行静态权限匹配;完整性校验需在脚本内部实现,如预存 SHA256 值并启动时比对,配合严格文件权限与 NOEXEC 等加固措施。

Linux sudoers 本身不提供内置的命令摘要(如 SHA256)校验机制。它只负责权限判定:用户能否以指定身份、在指定主机上、执行指定绝对路径的命令。真正的完整性校验必须由脚本自身实现,而非 sudoers 配置。
sudoers 不做哈希校验,只做路径与规则匹配
sudoers 的核心逻辑是字符串比对——检查你运行的命令路径是否严格匹配配置中列出的绝对路径。它不会读取、计算或验证该文件的内容哈希。哪怕脚本被恶意篡改,只要路径没变、规则仍生效,sudo 就会照常执行。
- 例如:
alice ALL=(root) NOPASSWD: /opt/bin/deploy.sh—— 这条规则只认这个路径,不管里面内容是合法部署逻辑还是 rm -rf / - sudoers 不加载脚本、不解析内容、不调用 sha256sum,也不存储或比对任何摘要值
- 所谓“摘要校验”,是运维人员在脚本内主动添加的安全层,属于应用级防护,与 sudoers 无关
实际可用的校验落地方式
要在 sudo 场景下实现可信执行,需在授权脚本内部嵌入校验逻辑,并配合严格的文件权限控制:
-
预存哈希值:用
sha256sum /opt/bin/deploy.sh > /etc/deploy.sh.sha256生成摘要,将该文件设为 root 只读(chmod 400 /etc/deploy.sh.sha256) -
脚本开头强制校验:第一行加入
[[ "$(sha256sum "$0" | cut -d' ' -f1)" == "$(cat /etc/deploy.sh.sha256 2>/dev/null)" ]] || exit 1 -
锁定脚本归属与权限:确保
chown root:root /opt/bin/deploy.sh && chmod 755 /opt/bin/deploy.sh,普通用户不可写 -
校验依赖命令路径:脚本中所有外部命令(如
/usr/bin/rsync)也应显式检查其真实路径,防止 PATH 劫持
为什么不能靠 sudoers 实现自动校验
sudoers 是静态策略文件,设计目标是快速、确定性地授权;引入动态摘要校验会破坏其原子性、可审计性和性能。系统级权限框架不承担应用内容可信责任——这是分层安全模型的基本原则。
- sudoers 负责“谁能在哪跑什么”——边界清晰、无状态、可版本化管理
- 脚本自身负责“跑的是不是原来那个”——动态、有状态、需适配业务逻辑
- 混用两者(比如试图用 sudoers 触发校验)不仅不可行,还会掩盖真实风险点
配套加固建议
单靠哈希校验还不够,需组合其他控制手段形成纵深防御:
- 把校验逻辑和主功能打包进同一脚本,避免拆分成多个可篡改文件
- 启用 sudo 日志(
Defaults logfile="/var/log/sudo.log"),记录每次调用的完整路径与时间 - 结合
NOEXEC选项禁用子进程逃逸(如对less等分页器),防止通过交互式工具绕过校验 - 定期用
sudo -l -U username验证实际生效权限,确认无意外放行


















