sudo本身无Digest摘要功能,需手动在脚本中硬编码SHA256自检值并验证;严格限定sudoers权限至绝对路径;校验关键命令真实路径并重置PATH;启用sudo日志与脚本执行记录。

sudo 本身没有 Digest 摘要功能,它不计算、不校验、也不绑定任何脚本的哈希值。所谓“利用 sudo 的 Digest 摘要功能”是常见误解——Digest(如 SHA256)属于独立工具(sha256sum),而 sudo 只负责权限控制。要保障你写的关闭端口的加固脚本(例如 close-ports.sh)不被篡改,必须靠你主动设计校验逻辑,并与 sudo 配合形成闭环。
脚本开头硬编码 SHA256 自检(最简可靠)
这是防篡改的第一道也是最关键的防线:脚本启动后第一件事就是验证自己是否还是原来那个文件。
在可信环境部署完成后,立即生成摘要:
sha256sum /opt/bin/close-ports.sh | cut -d' ' -f1
得到一串 64 位十六进制字符串,例如b8e7a9f2...-
把该值写入脚本首段(shebang 后):
#!/bin/bash EXPECTED="b8e7a9f2c0d1e4f5a6b7c8d9e0f1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9" ACTUAL=$(sha256sum "$0" | cut -d' ' -f1) [[ "$ACTUAL" == "$EXPECTED" ]] || { echo "⚠️ 关闭端口脚本完整性校验失败,已终止"; exit 1; } 设定脚本权限和属主:
sudo chown root:root /opt/bin/close-ports.sh && sudo chmod 755 /opt/bin/close-ports.sh
sudoers 中只放行绝对路径,禁用所有绕过可能
授权不是给用户“运行任意脚本”,而是精确到“只允许以 root 身份运行这个特定文件”。
用
visudo编辑/etc/sudoers,添加:alice ALL=(root) NOPASSWD: /opt/bin/close-ports.sh确保不出现以下危险写法:
❌/opt/bin/*.sh
❌/opt/bin/close*
❌!/bin/sh(没写等于默认允许)
❌ 目录可写(如/opt/bin权限应为drwxr-xr-x root root)
校验关键命令的真实路径,防止劫持
关闭端口常用 iptables、ufw、firewall-cmd 或 ss/lsof,攻击者可能替换这些二进制或污染 PATH。
-
开头定义并验证:
IPTABLES=/sbin/iptables FIREWALL_CMD=/usr/bin/firewall-cmd SS=/usr/bin/ss command -v iptables | grep -q '^/sbin/iptables$' || { echo "❌ iptables 被劫持"; exit 1; } command -v firewall-cmd | grep -q '^/usr/bin/firewall-cmd$' || { echo "❌ firewall-cmd 被劫持"; exit 1; } 显式重置 PATH:
export PATH="/usr/local/bin:/usr/bin:/bin:/sbin"
(可选)配合日志与审计增强可信度
启用 sudo 操作日志,在
/etc/sudoers中添加:Defaults logfile="/var/log/sudo.log"
并确保日志文件权限为600、属主root:root在脚本末尾记录执行行为:
logger "close-ports.sh executed by $(whoami) at $(date)"
不复杂但容易忽略。

















