sudo 不支持 digest 校验,需通过权限隔离、哈希巡检或校验包装器实现脚本防篡改;推荐组合使用只读目录、sudoers 注释哈希、定期校验及 root-owned wrapper。

Sudo 本身不提供 Digest(如 SHA 指纹)校验机制,也没有 Digest 配置项。你提到的“Sudo 的 Digest 配置”是一个常见误解——sudo 不会、也不能自动校验脚本文件的 SHA256/SHA512 等哈希值是否被篡改。它不读取、不验证、不绑定任何二进制或脚本文件的指纹。
但你的核心诉求是合理的:确保 sudo 授权执行的脚本未被恶意替换(防篡改)。这需要组合使用系统级完整性保障手段,而非依赖 sudo 自身配置。
以下是真正可行、生产环境可用的落地方式:
✅ 1. 用 sha256sum + sudoers 注释+人工/自动化校验(轻量可靠)
在 /etc/sudoers 中授权脚本时,手动记录并注释其 SHA256 值,并配合定期校验流程:
# /etc/sudoers(用 visudo 编辑) # Script: /usr/local/bin/deploy.sh — SHA256: a1b2c3...f8e9 (2026-05-07) alice ALL=(root) NOPASSWD: /usr/local/bin/deploy.sh
再配合每日校验脚本(如放入 cron):
echo "a1b2c3...f8e9 /usr/local/bin/deploy.sh" | sha256sum -c --quiet || \
{ logger -t sudo-integrity "ALERT: deploy.sh hash mismatch!"; exit 1; }
⚠️ 注意:该方式依赖运维自觉维护注释和校验任务,适合中小规模或合规审计场景。
✅ 2. 将脚本放入只读、root-owned、不可写目录(权限隔离)
sudo 不校验哈希,但可以让篡改行为根本无法发生:
# 创建受保护目录 sudo mkdir -p /opt/safe-bin sudo chown root:root /opt/safe-bin sudo chmod 755 /opt/safe-bin sudo cp /path/to/script.sh /opt/safe-bin/ sudo chmod 555 /opt/safe-bin/script.sh # 所有者/组/其他:r-x(不可写) sudo chown root:root /opt/safe-bin/script.sh
然后在 sudoers 中授权:
bob ALL=(root) NOPASSWD: /opt/safe-bin/script.sh
✅ 效果:普通用户无法
cp/echo/sed覆盖该文件;即使有写权限的组,chmod 555也阻止修改;/opt通常不在$PATH,降低误执行风险。
✅ 3. 使用 sudo 的 command alias + digest-aware wrapper(进阶可控)
若必须动态校验,可封装一层校验逻辑(需信任 wrapper 本身):
# /usr/local/bin/verify-and-run #!/bin/bash SCRIPT="/usr/local/bin/real-script.sh" EXPECTED="sha256:a1b2c3...f8e9" if ! openssl dgst -sha256 "$SCRIPT" | grep -q "$EXPECTED"; then logger -t verify-and-run "FATAL: $SCRIPT tampered!" exit 1 fi exec "$SCRIPT" "$@"
授权 wrapper(非原始脚本):
charlie ALL=(root) NOPASSWD: /usr/local/bin/verify-and-run
⚠️ 关键前提:
/usr/local/bin/verify-and-run本身也要满足上述只读+root-owned 要求,否则攻击者可直接修改 wrapper。
❌ 不可行的方式(请避开)
-
Defaults env_keep += "SHA256SUM"→ sudo 不识别该变量,无效 - 在 sudoers 中写
SHA256=/xxx或digest=→ 语法错误,visudo直接拒绝保存 - 依赖
sudo -V或sudo --version输出含 digest → 无此功能
sudo 的安全模型基于身份认证 + 命令路径白名单 + 环境控制,不是基于文件完整性校验。要防脚本篡改,必须借助外部机制:文件权限锁定、哈希巡检、或可信执行包装器。三者结合使用,比单点依赖更健壮。










