sudo 本身不提供 digest 配置或脚本内容校验功能,保障脚本完整性需主动设计:在脚本中硬编码 sha256 值并执行比对,配合严格权限控制、绝对路径调用及 path 重置等措施。

Sudo 本身没有 Digest 配置功能,也不校验脚本内容是否被篡改。所谓“Sudo 的 Digest 配置”是常见误解——sudo 只做路径匹配和权限控制,不计算、不比对、不存储任何哈希值。要保障服务重启脚本(如 /opt/bin/restart-nginx.sh)未被恶意替换,必须把完整性校验作为执行前的强制环节,靠你主动设计并落地。
脚本开头硬编码 SHA256 值,是最简、最可靠、无外部依赖的方式
它让脚本“自证清白”:一旦内容被改,哈希就不匹配,立即退出,后续命令(包括 systemctl 重启)根本不会运行。
在可信环境生成摘要:
sha256sum /opt/bin/restart-nginx.sh | cut -d' ' -f1
得到一串 64 字符的十六进制值,例如b8f3a9c7e2d1...-
把该值写入脚本第一行(shebang 后):
#!/bin/bash EXPECTED="b8f3a9c7e2d1..." ACTUAL=$(sha256sum "$0" | cut -d' ' -f1) [[ "$ACTUAL" == "$EXPECTED" ]] || { echo "❌ 脚本已被篡改"; exit 1; } 设置脚本属主和权限:
sudo chown root:root /opt/bin/restart-nginx.shsudo chmod 755 /opt/bin/restart-nginx.sh
确保普通用户无法修改或覆盖
sudoers 中只授权该脚本的绝对路径,禁用一切模糊匹配
这是防止绕过校验的关键防线。
用
visudo添加这一行:deployer ALL=(root) NOPASSWD: /opt/bin/restart-nginx.sh严禁出现以下写法:
❌/opt/bin/restart*.sh
❌/opt/bin/*
❌!/bin/bash(没写全等于没禁)
校验所调用的系统命令是否真实可信
脚本里若写 systemctl restart nginx,攻击者可能通过污染 PATH 或替换 /bin/systemctl 劫持执行流。
开头定义绝对路径变量:
SYSTEMCTL=/bin/systemctlNGINX=/usr/sbin/nginx运行前验证存在性与路径一致性:
command -v systemctl | grep -q '^/bin/systemctl$' || exit 1[[ -x "$SYSTEMCTL" ]] || exit 1显式重置 PATH:
export PATH="/usr/local/bin:/usr/bin:/bin"
配套加固:目录不可写 + 摘要文件可选备份(非必需但增强纵深)
如果希望多一层审计依据,可额外保存摘要到受控位置:
生成并保护摘要文件:
sha256sum /opt/bin/restart-nginx.sh > /etc/sudo-scripts/restart-nginx.sh.sha256sudo chown root:root /etc/sudo-scripts/restart-nginx.sh.sha256sudo chmod 644 /etc/sudo-scripts/restart-nginx.sh.sha256不用于运行时校验(硬编码更安全),仅作人工巡检或日志比对用
不复杂但容易忽略。











