sudo 本身不具备 Digest 摘要功能,文件完整性校验必须在脚本开头硬编码 SHA256 值并立即验证,失败则退出;同时需配合 sudoers 精确授权、目录权限控制及命令绝对路径校验。

sudo 本身没有 Digest 摘要功能。所谓“Sudo 的 Digest 摘要功能”是常见误解——Digest(如 SHA256、MD5)属于独立的哈希计算工具(sha256sum、md5sum),而 sudo 仅负责权限控制,不参与文件校验或哈希生成。
为什么必须手动加入完整性校验
仅靠 sudo 授权路径(如 /opt/bin/maint.sh)无法防篡改:攻击者可直接覆盖脚本内容、替换符号链接,或利用权限配置疏漏植入恶意逻辑。真正的防护发生在脚本自身启动的第一刻,而非 sudo 执行时。
- 校验必须在脚本开头完成,且早于任何敏感操作
- 摘要值不能动态生成,需预先可信计算并安全存储
- 校验失败必须立即退出,阻止后续任何执行
推荐做法:脚本内硬编码 SHA256 值
将预期哈希值直接写入脚本,实现“自证清白”。这种方式无需外部文件依赖,避免摘要文件被同步篡改的风险。
- 用可信环境计算一次:
sha256sum /opt/bin/maint.sh | cut -d' ' -f1 - 把结果填入脚本首段校验逻辑中(示例):
#!/bin/bash
EXPECTED="e9a8c7b2...(32字节十六进制)"
ACTUAL=$(sha256sum "$0" | cut -d' ' -f1)
if [[ "$ACTUAL" != "$EXPECTED" ]]; then
echo "? 脚本完整性验证失败,已终止"; exit 1
fi
- 脚本保存后,设为 root 所有、权限 755:
sudo chown root:root /opt/bin/maint.sh && sudo chmod 755 /opt/bin/maint.sh
配套加固:sudoers 精确授权与路径锁定
校验只是防线之一,还需配合 sudo 权限策略,堵住绕过入口。
- 在
/etc/sudoers中用visudo添加严格条目:alice ALL=(root) NOPASSWD: /opt/bin/maint.sh - 禁用通配符、shell 功能和相对路径;不允许可写目录下的脚本被调用
- 确认该脚本所在目录(如
/opt/bin/)普通用户不可写:ls -ld /opt/bin应显示drwxr-xr-x root root
增强防护:校验关键依赖命令的真实路径
脚本若调用 rsync、cp 等命令,攻击者可能通过污染 PATH 或替换二进制文件劫持执行流。
- 开头定义绝对路径变量:
CP=/bin/cp; RSYNC=/usr/bin/rsync - 运行前验证存在性与路径一致性:
command -v cp | grep -q '^/bin/cp$' || exit 1 - 显式重置
PATH:export PATH="/usr/local/bin:/usr/bin:/bin"

















